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 $stringtoescape;
1673 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
1697 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
1717function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1719 if ($noescapetags ==
'common') {
1720 $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';
1722 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
1724 if ($cleanalsojavascript) {
1729 if ($escapeonlyhtmltags) {
1730 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1732 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1735 $tmp = strtr($tmp, array(
"<b>"=>
'',
'</b>'=>
'',
'<strong>'=>
'',
'</strong>'=>
''));
1738 $tmp = strtr($tmp, array(
"\r"=>
'\\r',
"\n"=>
'\\n'));
1739 } elseif ($keepn == -1) {
1740 $tmp = strtr($tmp, array(
"\r"=>
'',
"\n"=>
''));
1743 if ($escapeonlyhtmltags) {
1744 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
1747 $tmparrayoftags = array();
1748 if ($noescapetags) {
1749 $tmparrayoftags = explode(
',', $noescapetags);
1751 if (count($tmparrayoftags)) {
1753 foreach ($tmparrayoftags as $tagtoreplace) {
1754 $tmp = str_ireplace(
'<'.$tagtoreplace.
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1755 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1756 $tmp = str_ireplace(
'<'.$tagtoreplace.
' />',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1760 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
1762 if (count($tmparrayoftags)) {
1763 foreach ($tmparrayoftags as $tagtoreplace) {
1764 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
1765 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
1766 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
1783 if (function_exists(
'mb_strtolower')) {
1784 return mb_strtolower($string, $encoding);
1786 return strtolower($string);
1800 if (function_exists(
'mb_strtoupper')) {
1801 return mb_strtoupper($string, $encoding);
1803 return strtoupper($string);
1817 if (function_exists(
'mb_substr')) {
1818 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
1820 return ucfirst($string);
1834 if (function_exists(
'mb_convert_case')) {
1835 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
1837 return ucwords($string);
1862function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
1864 global $conf, $user, $debugbar;
1867 if (!isModEnabled(
'syslog')) {
1872 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
1873 global $website, $websitekey;
1874 if (is_object($website) && !empty($website->ref)) {
1875 $suffixinfilename .=
'_website_'.$website->ref;
1876 } elseif (!empty($websitekey)) {
1877 $suffixinfilename .=
'_website_'.$websitekey;
1882 if (defined(
'USESUFFIXINLOG')) {
1883 $suffixinfilename .= constant(
'USESUFFIXINLOG');
1887 foreach ($conf->loghandlers as $loghandlerinstance) {
1888 $loghandlerinstance->setIdent($ident);
1892 if (!empty($message)) {
1894 $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');
1895 if (!array_key_exists($level, $logLevels)) {
1896 throw new Exception(
'Incorrect log level');
1903 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
1907 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
1908 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
1909 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".$logLevels[$level].
" ".$message;
1915 print
"\n\n<!-- Log start\n";
1917 print
"Log end -->\n";
1921 'message' => $message,
1922 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
false),
1924 'user' => ((is_object($user) && $user->id) ? $user->login :
false),
1929 if (!empty($remoteip)) {
1930 $data[
'ip'] = $remoteip;
1932 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
1933 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
1934 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
1935 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
1937 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
1939 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
1940 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
1942 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'].(empty($_SERVER[
'USERNAME']) ?
'' :
'@'.$_SERVER[
'USERNAME']);
1943 } elseif (!empty($_SERVER[
'LOGNAME'])) {
1945 $data[
'ip'] =
'???@'.$_SERVER[
'LOGNAME'];
1949 foreach ($conf->loghandlers as $loghandlerinstance) {
1950 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
1953 $loghandlerinstance->export($data, $suffixinfilename);
1959 foreach ($conf->loghandlers as $loghandlerinstance) {
1960 $loghandlerinstance->setIdent($ident);
1981function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled =
'', $morecss =
'classlink button bordertransp', $jsonopen =
'', $backtopagejsfields =
'', $accesskey =
'')
1985 if (strpos($url,
'?') > 0) {
1986 $url .=
'&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1988 $url .=
'?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1993 $backtopagejsfieldsid =
'';
1994 $backtopagejsfieldslabel =
'';
1995 if ($backtopagejsfields) {
1996 $tmpbacktopagejsfields = explode(
':', $backtopagejsfields);
1997 if (empty($tmpbacktopagejsfields[1])) {
1998 $backtopagejsfields = $name.
":".$backtopagejsfields;
1999 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[0]);
2001 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[1]);
2003 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ?
'' : $tmp2backtopagejsfields[0];
2004 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ?
'' : $tmp2backtopagejsfields[1];
2005 $url .=
'&backtopagejsfields='.urlencode($backtopagejsfields);
2009 $out .=
'<!-- a link for button to open url into a dialog popup with backtopagejsfields = '.$backtopagejsfields.
' -->';
2010 $out .=
'<a '.($accesskey ?
' accesskey="'.$accesskey.
'"' :
'').
' class="cursorpointer reposition button_'.$name.($morecss ?
' '.$morecss :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($label).
'"';
2011 if (empty($conf->use_javascript_ajax)) {
2012 $out .=
' href="'.DOL_URL_ROOT.$url.
'" target="_blank"';
2013 } elseif ($jsonopen) {
2014 $out .=
' href="#" onclick="'.$jsonopen.
'"';
2016 $out .=
' href="#"';
2018 $out .=
'>'.$buttonstring.
'</a>';
2020 if (!empty($conf->use_javascript_ajax)) {
2022 $out .=
'<!-- code to open popup and variables to retreive returned variables -->';
2023 $out .=
'<div id="idfordialog'.$name.
'" class="hidden">div for dialog</div>';
2024 $out .=
'<div id="varforreturndialogid'.$name.
'" class="hidden">div for returned id</div>';
2025 $out .=
'<div id="varforreturndialoglabel'.$name.
'" class="hidden">div for returned label</div>';
2026 $out .=
'<!-- Add js code to open dialog popup on dialog -->';
2027 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">
2028 jQuery(document).ready(function () {
2029 jQuery(".button_'.$name.
'").click(function () {
2030 console.log(\'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2031 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2032 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2036 height: (window.innerHeight - 150),
2039 open:
function (event, ui) {
2040 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2042 close:
function (event, ui) {
2043 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2044 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2045 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2046 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2047 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2049 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2050 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2055 $tmpdialog.dialog(\
'open\');
2080function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2082 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2101function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2103 global $conf, $langs, $hookmanager;
2107 if (!empty($conf->dol_optimize_smallscreen)) {
2111 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2113 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2114 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2118 if ($morehtmlright) {
2119 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2123 if (!empty($title) && $showtitle && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
2125 $out .=
'<a class="tabTitle">';
2127 $noprefix = $pictoisfullpath;
2128 if (strpos($picto,
'fontawesome_') !==
false) {
2131 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2133 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2141 if (is_array($links) && !empty($links)) {
2142 $keys = array_keys($links);
2144 $maxkey = max($keys);
2150 if (empty($limittoshow)) {
2151 $limittoshow = (!
getDolGlobalString(
'MAIN_MAXTABS_IN_CARD') ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2153 if (!empty($conf->dol_optimize_smallscreen)) {
2161 for ($i = 0; $i <= $maxkey; $i++) {
2162 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2164 if ($i >= $limittoshow) {
2170 for ($i = 0; $i <= $maxkey; $i++) {
2171 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2177 if ($i < $limittoshow || $isactive) {
2179 $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])).
' -->';
2181 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2182 if (!empty($links[$i][0])) {
2183 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2185 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2187 } elseif (!empty($links[$i][1])) {
2189 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2190 if (!empty($links[$i][0])) {
2191 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2192 $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).
'">';
2194 $out .= $links[$i][1];
2195 if (!empty($links[$i][0])) {
2196 $out .=
'</a>'.
"\n";
2198 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2207 $outmore .=
'<div class="popuptabset wordwrap">';
2209 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2210 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2211 if (!empty($links[$i][0])) {
2212 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2214 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2216 } elseif (!empty($links[$i][1])) {
2217 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2218 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2219 $outmore .=
'</a>'.
"\n";
2221 $outmore .=
'</div>';
2228 $outmore .=
'</div>';
2232 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2233 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2234 $widthofpopup = 200;
2236 $tabsname = $moretabssuffix;
2237 if (empty($tabsname)) {
2238 $tabsname = str_replace(
"@",
"", $picto);
2240 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2241 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2242 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2245 $out .=
'<div></div>';
2248 $out .=
'<script nonce="'.getNonce().
'">';
2249 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2250 var x = this.offsetLeft, y = this.offsetTop;
2251 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2252 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2253 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2255 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2258 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2259 $out .=
"</script>";
2262 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2266 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2267 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom'))).
'">'.
"\n";
2269 if (!empty($dragdropfile)) {
2270 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2273 $parameters = array(
'tabname' => $active,
'out' => $out);
2274 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2276 $out = $hookmanager->resPrint;
2302 if (!$notab || $notab == -1) {
2303 return "\n</div>\n";
2328function dol_banner_tab($object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2330 global $conf, $form, $user, $langs, $hookmanager, $action;
2334 $maxvisiblephotos = 1;
2336 $entity = (empty($object->entity) ? $conf->entity : $object->entity);
2337 $showbarcode = empty($conf->barcode->enabled) ? 0 : (empty($object->barcode) ? 0 : 1);
2338 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2341 $modulepart =
'unknown';
2343 if ($object->element ==
'societe' || $object->element ==
'contact' || $object->element ==
'product' || $object->element ==
'ticket') {
2344 $modulepart = $object->element;
2345 } elseif ($object->element ==
'member') {
2346 $modulepart =
'memberphoto';
2347 } elseif ($object->element ==
'user') {
2348 $modulepart =
'userphoto';
2351 if (class_exists(
"Imagick")) {
2352 if ($object->element ==
'expensereport' || $object->element ==
'propal' || $object->element ==
'commande' || $object->element ==
'facture' || $object->element ==
'supplier_proposal') {
2353 $modulepart = $object->element;
2354 } elseif ($object->element ==
'fichinter') {
2355 $modulepart =
'ficheinter';
2356 } elseif ($object->element ==
'contrat') {
2357 $modulepart =
'contract';
2358 } elseif ($object->element ==
'order_supplier') {
2359 $modulepart =
'supplier_order';
2360 } elseif ($object->element ==
'invoice_supplier') {
2361 $modulepart =
'supplier_invoice';
2365 if ($object->element ==
'product') {
2367 $cssclass =
'photowithmargin photoref';
2368 $showimage = $object->is_photo_available($conf->product->multidir_output[$entity]);
2369 $maxvisiblephotos = (isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO) ? $conf->global->PRODUCT_MAX_VISIBLE_PHOTO : 5);
2370 if ($conf->browser->layout ==
'phone') {
2371 $maxvisiblephotos = 1;
2374 $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>';
2378 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2380 $nophoto =
'/public/theme/common/nophoto.png';
2381 $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>';
2384 } elseif ($object->element ==
'ticket') {
2386 $cssclass =
'photoref';
2387 $showimage = $object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.$object->ref);
2388 $maxvisiblephotos = (isset($conf->global->TICKET_MAX_VISIBLE_PHOTO) ? $conf->global->TICKET_MAX_VISIBLE_PHOTO : 2);
2389 if ($conf->browser->layout ==
'phone') {
2390 $maxvisiblephotos = 1;
2394 $showphoto = $object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2395 if ($object->nbphoto > 0) {
2396 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2404 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2406 $nophoto =
img_picto(
'No photo',
'object_ticket');
2407 $morehtmlleft .=
'<!-- No photo to show -->';
2408 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2409 $morehtmlleft .= $nophoto;
2410 $morehtmlleft .=
'</div></div>';
2415 if ($modulepart !=
'unknown') {
2418 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2420 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2421 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2422 $subdir =
get_exdir($object->id, 2, 0, 1, $object, $modulepart);
2423 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2425 $subdir =
get_exdir($object->id, 0, 0, 1, $object, $modulepart);
2427 if (empty($subdir)) {
2428 $subdir =
'errorgettingsubdirofobject';
2431 $filepath = $dir_output.$subdir.
"/";
2433 $filepdf = $filepath.$objectref.
".pdf";
2434 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2437 $fileimage = $filepdf.
'_preview.png';
2438 $relativepathimage = $relativepath.
'_preview.png';
2440 $pdfexists = file_exists($filepdf);
2445 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2447 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2456 if ($pdfexists && !$error) {
2457 $heightforphotref = 80;
2458 if (!empty($conf->dol_optimize_smallscreen)) {
2459 $heightforphotref = 60;
2462 if (file_exists($fileimage)) {
2463 $phototoshow =
'<div class="photoref">';
2464 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2465 $phototoshow .=
'</div>';
2468 } elseif (!$phototoshow) {
2469 $phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2473 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2474 $morehtmlleft .= $phototoshow;
2475 $morehtmlleft .=
'</div>';
2479 if (empty($phototoshow)) {
2480 if ($object->element ==
'action') {
2482 $cssclass =
'photorefcenter';
2483 $nophoto =
img_picto(
'No photo',
'title_agenda');
2486 $cssclass =
'photorefcenter';
2487 $picto = $object->picto;
2488 $prefix =
'object_';
2489 if ($object->element ==
'project' && !$object->public) {
2492 if (strpos($picto,
'fontawesome_') !==
false) {
2495 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2497 $morehtmlleft .=
'<!-- No photo to show -->';
2498 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2499 $morehtmlleft .= $nophoto;
2500 $morehtmlleft .=
'</div></div>';
2507 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode($object, 100,
'photoref valignmiddle').
'</div>';
2510 if ($object->element ==
'societe') {
2511 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2512 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'status',
'InActivity',
'ActivityCeased');
2514 $morehtmlstatus .= $object->getLibStatut(6);
2516 } elseif ($object->element ==
'product') {
2518 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2519 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2521 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2523 $morehtmlstatus .=
' ';
2525 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2526 $morehtmlstatus .=
ajax_object_onoff($object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2528 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2530 } elseif (in_array($object->element, array(
'salary'))) {
2531 $tmptxt = $object->getLibStatut(6, $object->alreadypaid);
2532 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2533 $tmptxt = $object->getLibStatut(5, $object->alreadypaid);
2535 $morehtmlstatus .= $tmptxt;
2536 } elseif (in_array($object->element, array(
'facture',
'invoice',
'invoice_supplier',
'chargesociales',
'loan',
'tva'))) {
2537 $tmptxt = $object->getLibStatut(6, $object->totalpaid);
2538 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2539 $tmptxt = $object->getLibStatut(5, $object->totalpaid);
2541 $morehtmlstatus .= $tmptxt;
2542 } elseif ($object->element ==
'contrat' || $object->element ==
'contract') {
2543 if ($object->statut == 0) {
2544 $morehtmlstatus .= $object->getLibStatut(5);
2546 $morehtmlstatus .= $object->getLibStatut(4);
2548 } elseif ($object->element ==
'facturerec') {
2549 if ($object->frequency == 0) {
2550 $morehtmlstatus .= $object->getLibStatut(2);
2552 $morehtmlstatus .= $object->getLibStatut(5);
2554 } elseif ($object->element ==
'project_task') {
2555 $object->fk_statut = 1;
2556 if ($object->progress > 0) {
2557 $object->fk_statut = 2;
2559 if ($object->progress >= 100) {
2560 $object->fk_statut = 3;
2562 $tmptxt = $object->getLibStatut(5);
2563 $morehtmlstatus .= $tmptxt;
2564 } elseif (method_exists($object,
'getLibStatut')) {
2565 $tmptxt = $object->getLibStatut(6);
2566 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2567 $tmptxt = $object->getLibStatut(5);
2569 $morehtmlstatus .= $tmptxt;
2573 if (isModEnabled(
'accounting') && in_array($object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2575 if (method_exists($object,
'getVentilExportCompta')) {
2576 $accounted = $object->getVentilExportCompta();
2577 $langs->load(
"accountancy");
2578 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2583 if (!empty($object->name_alias)) {
2584 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag($object->name_alias).
'</div>';
2588 if (in_array($object->element, array(
'product',
'bank_account',
'project_task'))) {
2589 if (!empty($object->label)) {
2590 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
2595 if (method_exists($object,
'getBannerAddress') && !in_array($object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
2596 $moreaddress = $object->getBannerAddress(
'refaddress', $object);
2598 $morehtmlref .=
'<div class="refidno refaddress">';
2599 $morehtmlref .= $moreaddress;
2600 $morehtmlref .=
'</div>';
2603 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)) {
2604 $morehtmlref .=
'<div style="clear: both;"></div>';
2605 $morehtmlref .=
'<div class="refidno opacitymedium">';
2606 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int) $object->id);
2607 $morehtmlref .=
'</div>';
2610 $parameters=array(
'morehtmlref'=>$morehtmlref);
2611 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters, $object, $action);
2614 } elseif (empty($reshook)) {
2615 $morehtmlref .= $hookmanager->resPrint;
2616 } elseif ($reshook > 0) {
2617 $morehtmlref = $hookmanager->resPrint;
2620 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
2621 print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
2623 print
'<div class="underrefbanner clearboth"></div>';
2639 if ($fieldrequired) {
2640 $ret .=
'<span class="fieldrequired">';
2642 $ret .=
'<label for="'.$fieldkey.
'">';
2643 $ret .= $langs->trans($langkey);
2645 if ($fieldrequired) {
2661 $ret =
' '.$bc[$var];
2663 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
2681function dol_format_address($object, $withcountry = 0, $sep =
"\n", $outputlangs =
'', $mode = 0, $extralangcode =
'')
2683 global $conf, $langs, $hookmanager;
2686 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
2691 $ret .= ($extralangcode ? $object->array_languages[
'address'][$extralangcode] : (empty($object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep, $object->address)));
2694 if (isset($object->country_code) && in_array($object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
2696 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2697 $ret .= (($ret && $town) ? $sep :
'').$town;
2699 if (!empty($object->state)) {
2700 $ret .= ($ret ? ($town ?
", " : $sep) :
'').$object->state;
2702 if (!empty($object->zip)) {
2703 $ret .= ($ret ? (($town || $object->state) ?
", " : $sep) :
'').$object->zip;
2705 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'GB',
'UK'))) {
2707 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2708 $ret .= ($ret ? $sep :
'').$town;
2709 if (!empty($object->state)) {
2710 $ret .= ($ret ?
", " :
'').$object->state;
2712 if (!empty($object->zip)) {
2713 $ret .= ($ret ? $sep :
'').$object->zip;
2715 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'ES',
'TR'))) {
2717 $ret .= ($ret ? $sep :
'').$object->zip;
2718 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2719 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2720 if (!empty($object->state)) {
2721 $ret .= $sep.$object->state;
2723 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'JP'))) {
2726 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2727 $ret .= ($ret ? $sep :
'').($object->state ? $object->state.
', ' :
'').$town.($object->zip ?
' ' :
'').$object->zip;
2728 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'IT'))) {
2730 $ret .= ($ret ? $sep :
'').$object->zip;
2731 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2732 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2733 $ret .= (empty($object->state_code) ?
'' : (
' '.$object->state_code));
2736 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2737 $ret .= !empty($object->zip) ? (($ret ? $sep :
'').$object->zip) :
'';
2738 $ret .= ($town ? (($object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
2739 if (!empty($object->state) && in_array($object->country_code, $countriesusingstate)) {
2740 $ret .= ($ret ?
", " :
'').$object->state;
2744 if (!is_object($outputlangs)) {
2745 $outputlangs = $langs;
2748 $langs->load(
"dict");
2749 $ret .= (empty($object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
2752 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
2753 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters, $object);
2757 $ret .= $hookmanager->resPrint;
2775 if ((abs($ts) <= 0x7FFFFFFF)) {
2776 return ($is_gmt) ? @gmstrftime($fmt, $ts) : @strftime($fmt, $ts);
2778 return 'Error date into a not supported range';
2803function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
'', $encodetooutput =
false)
2805 global $conf, $langs;
2812 if ($tzoutput ===
'auto') {
2813 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
2818 $offsettz = $offsetdst = 0;
2821 if (is_string($tzoutput)) {
2822 if ($tzoutput ==
'tzserver') {
2824 $offsettzstring = @date_default_timezone_get();
2827 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
2829 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
2831 if (class_exists(
'DateTimeZone')) {
2832 $user_date_tz =
new DateTimeZone($offsettzstring);
2833 $user_dt =
new DateTime();
2834 $user_dt->setTimezone($user_date_tz);
2835 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
2836 $offsettz = $user_dt->getOffset();
2838 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
2839 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
2844 if (!is_object($outputlangs)) {
2845 $outputlangs = $langs;
2848 $format =
'daytextshort';
2853 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
2854 $format = preg_replace(
'/inputnoreduce/',
'', $format);
2855 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
2856 if ($formatwithoutreduce != $format) {
2857 $format = $formatwithoutreduce;
2863 if ($format ==
'day') {
2864 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
2865 } elseif ($format ==
'hour') {
2866 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
2867 } elseif ($format ==
'hourduration') {
2868 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
2869 } elseif ($format ==
'daytext') {
2870 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
2871 } elseif ($format ==
'daytextshort') {
2872 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
2873 } elseif ($format ==
'dayhour') {
2874 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
2875 } elseif ($format ==
'dayhoursec') {
2876 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
2877 } elseif ($format ==
'dayhourtext') {
2878 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
2879 } elseif ($format ==
'dayhourtextshort') {
2880 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
2881 } elseif ($format ==
'dayhourlog') {
2883 $format =
'%Y%m%d%H%M%S';
2884 } elseif ($format ==
'dayhourlogsmall') {
2886 $format =
'%y%m%d%H%M';
2887 } elseif ($format ==
'dayhourldap') {
2888 $format =
'%Y%m%d%H%M%SZ';
2889 } elseif ($format ==
'dayhourxcard') {
2890 $format =
'%Y%m%dT%H%M%SZ';
2891 } elseif ($format ==
'dayxcard') {
2893 } elseif ($format ==
'dayrfc') {
2894 $format =
'%Y-%m-%d';
2895 } elseif ($format ==
'dayhourrfc') {
2896 $format =
'%Y-%m-%dT%H:%M:%SZ';
2897 } elseif ($format ==
'standard') {
2898 $format =
'%Y-%m-%d %H:%M:%S';
2901 if ($reduceformat) {
2902 $format = str_replace(
'%Y',
'%y', $format);
2903 $format = str_replace(
'yyyy',
'yy', $format);
2907 if (preg_match(
'/%b/i', $format)) {
2909 $format = str_replace(
'%b',
'__b__', $format);
2910 $format = str_replace(
'%B',
'__B__', $format);
2912 if (preg_match(
'/%a/i', $format)) {
2914 $format = str_replace(
'%a',
'__a__', $format);
2915 $format = str_replace(
'%A',
'__A__', $format);
2920 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)) {
2921 dol_print_error(
'',
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]));
2923 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) {
2925 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);
2928 $syear = (!empty($reg[1]) ? $reg[1] :
'');
2929 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
2930 $sday = (!empty($reg[3]) ? $reg[3] :
'');
2931 $shour = (!empty($reg[4]) ? $reg[4] :
'');
2932 $smin = (!empty($reg[5]) ? $reg[5] :
'');
2933 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
2935 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
2938 $tzo =
new DateTimeZone(
'UTC');
2940 $tzo =
new DateTimeZone(date_default_timezone_get());
2942 $dtts =
new DateTime();
2943 $dtts->setTimestamp($time);
2944 $dtts->setTimezone($tzo);
2945 $newformat = str_replace(
2946 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2947 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2950 $ret = $dtts->format($newformat);
2952 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2953 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2958 if ($time < 100000000000) {
2959 $timetouse = $time + $offsettz + $offsetdst;
2962 $tzo =
new DateTimeZone(
'UTC');
2964 $tzo =
new DateTimeZone(date_default_timezone_get());
2966 $dtts =
new DateTime();
2967 $dtts->setTimestamp($timetouse);
2968 $dtts->setTimezone($tzo);
2969 $newformat = str_replace(
2970 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2971 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2974 $ret = $dtts->format($newformat);
2976 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2977 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2982 $ret =
'Bad value '.$time.
' for date';
2986 if (preg_match(
'/__b__/i', $format)) {
2987 $timetouse = $time + $offsettz + $offsetdst;
2990 $tzo =
new DateTimeZone(
'UTC');
2992 $tzo =
new DateTimeZone(date_default_timezone_get());
2994 $dtts =
new DateTime();
2995 $dtts->setTimestamp($timetouse);
2996 $dtts->setTimezone($tzo);
2997 $month = $dtts->format(
"m");
2998 $month = sprintf(
"%02d", $month);
2999 if ($encodetooutput) {
3000 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3001 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3003 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3004 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3007 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3008 $ret = str_replace(
'__B__', $monthtext, $ret);
3012 if (preg_match(
'/__a__/i', $format)) {
3014 $timetouse = $time + $offsettz + $offsetdst;
3017 $tzo =
new DateTimeZone(
'UTC');
3019 $tzo =
new DateTimeZone(date_default_timezone_get());
3021 $dtts =
new DateTime();
3022 $dtts->setTimestamp($timetouse);
3023 $dtts->setTimezone($tzo);
3024 $w = $dtts->format(
"w");
3025 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3027 $ret = str_replace(
'__A__', $dayweek, $ret);
3028 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3057 if ($timestamp ===
'') {
3061 $datetimeobj =
new DateTime();
3062 $datetimeobj->setTimestamp($timestamp);
3063 if ($forcetimezone) {
3064 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3067 'year'=>((
int) date_format($datetimeobj,
'Y')),
3068 'mon'=>((
int) date_format($datetimeobj,
'm')),
3069 'mday'=>((
int) date_format($datetimeobj,
'd')),
3070 'wday'=>((
int) date_format($datetimeobj,
'w')),
3071 'yday'=>((
int) date_format($datetimeobj,
'z')),
3072 'hours'=>((
int) date_format($datetimeobj,
'H')),
3073 'minutes'=>((
int) date_format($datetimeobj,
'i')),
3074 'seconds'=>((
int) date_format($datetimeobj,
's')),
3102function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3107 if ($gm ===
'auto') {
3108 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3113 if ($hour == -1 || empty($hour)) {
3116 if ($minute == -1 || empty($minute)) {
3119 if ($second == -1 || empty($second)) {
3125 if (!$month || !$day) {
3134 if ($hour < 0 || $hour > 24) {
3137 if ($minute < 0 || $minute > 60) {
3140 if ($second < 0 || $second > 60) {
3145 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3146 $default_timezone = @date_default_timezone_get();
3147 $localtz =
new DateTimeZone($default_timezone);
3148 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3150 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3152 $localtz =
new DateTimeZone($default_timezone);
3154 dol_syslog(
"Warning dol_tz_string contains an invalid value ".$_SESSION[
"dol_tz_string"], LOG_WARNING);
3155 $default_timezone = @date_default_timezone_get();
3157 } elseif (strrpos($gm,
"tz,") !==
false) {
3158 $timezone = str_replace(
"tz,",
"", $gm);
3160 $localtz =
new DateTimeZone($timezone);
3162 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3166 if (empty($localtz)) {
3167 $localtz =
new DateTimeZone(
'UTC');
3171 $dt =
new DateTime(
'now', $localtz);
3172 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3173 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3174 $date = $dt->getTimestamp();
3194 if ($mode ===
'auto') {
3198 if ($mode ==
'gmt') {
3200 } elseif ($mode ==
'tzserver') {
3201 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3203 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3209 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3212 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3213 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3214 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3231 global $conf, $langs;
3234 if (!empty($conf->dol_optimize_smallscreen)) {
3239 if (empty($shortvalue) || $size < ($level * 10)) {
3241 $textunitshort = $langs->trans(
"b");
3242 $textunitlong = $langs->trans(
"Bytes");
3244 $ret = round($size / $level, 0);
3245 $textunitshort = $langs->trans(
"Kb");
3246 $textunitlong = $langs->trans(
"KiloBytes");
3249 if (empty($shortunit)) {
3250 $ret .=
' '.$textunitlong;
3252 $ret .=
' '.$textunitshort;
3268function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3276 $linkstart =
'<a href="';
3277 if (!preg_match(
'/^http/i', $url)) {
3278 $linkstart .=
'http://';
3283 $linkstart .=
' target="'.$target.
'"';
3285 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3289 if (!preg_match(
'/^http/i', $url)) {
3296 if ($morecss ==
'float') {
3297 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3299 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3315function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3317 global $user, $langs, $hookmanager;
3328 if (empty($email)) {
3332 if (!empty($addlink)) {
3333 $newemail =
'<a class="paddingrightonly" style="text-overflow: ellipsis;" href="';
3334 if (!preg_match(
'/^mailto:/i', $email)) {
3335 $newemail .=
'mailto:';
3337 $newemail .= $email;
3340 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3343 $newemail .=
'</a>';
3345 $langs->load(
"errors");
3346 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3349 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3351 $linktoaddaction =
'';
3353 $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>';
3355 if ($linktoaddaction) {
3356 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3360 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3363 $langs->load(
"errors");
3364 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3374 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3376 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3380 $rep .= $hookmanager->resPrint;
3395 $socialnetworks = array();
3397 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3398 $cachekey =
'socialnetworks_' . $conf->entity;
3400 if (!is_null($dataretrieved)) {
3401 $socialnetworks = $dataretrieved;
3403 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3404 $sql .=
" WHERE entity=".$conf->entity;
3405 $resql = $db->query($sql);
3407 while ($obj = $db->fetch_object($resql)) {
3408 $socialnetworks[$obj->code] = array(
3409 'rowid' => $obj->rowid,
3410 'label' => $obj->label,
3412 'icon' => $obj->icon,
3413 'active' => $obj->active,
3420 return $socialnetworks;
3435 global $conf, $user, $langs;
3439 if (empty($value)) {
3443 if (!empty($type)) {
3444 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3446 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3447 if ($type ==
'skype') {
3449 $htmllink .=
' <a href="skype:';
3451 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3452 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3453 $htmllink .=
'</a><a href="skype:';
3455 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3456 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3457 $htmllink .=
'</a>';
3458 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3459 $addlink =
'AC_SKYPE';
3462 $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>';
3464 $htmllink .= ($link ?
' '.$link :
'');
3467 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
3470 if (preg_match(
'/^https?:\/\//i', $link)) {
3471 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3473 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3475 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
3476 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3477 if ($tmpvirginurl) {
3478 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3479 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3481 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3482 if ($tmpvirginurl3) {
3483 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3484 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3487 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3488 if ($tmpvirginurl2) {
3489 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3490 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3493 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3494 if (preg_match(
'/^https?:\/\//i', $link)) {
3495 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3497 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3503 $htmllink .=
'</div>';
3505 $langs->load(
"errors");
3506 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3524 if (empty($profID) || empty($profIDtype)) {
3527 if (empty($countrycode)) {
3528 $countrycode = $mysoc->country_code;
3530 $newProfID = $profID;
3531 $id = substr($profIDtype, -1);
3533 if (strtoupper($countrycode) ==
'FR') {
3537 if ($id == 1 &&
dol_strlen($newProfID) == 9) {
3539 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
3541 if ($id == 2 &&
dol_strlen($newProfID) == 14) {
3543 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
3545 if ($id == 3 &&
dol_strlen($newProfID) == 5) {
3547 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
3549 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
3551 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
3554 if (!empty($addcpButton)) {
3576function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0)
3578 global $conf, $user, $langs, $mysoc, $hookmanager;
3581 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3582 if (empty($phone)) {
3586 $separ = $conf->global->MAIN_PHONE_SEPAR;
3588 if (empty($countrycode) && is_object($mysoc)) {
3589 $countrycode = $mysoc->country_code;
3593 if ($conf->dol_optimize_smallscreen) {
3598 if (strtoupper($countrycode) ==
"FR") {
3601 $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);
3603 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
3605 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
3607 $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);
3609 $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);
3611 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3).$separ.substr($newphone, 11, 2);
3613 } elseif (strtoupper($countrycode) ==
"CA") {
3615 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
3617 } elseif (strtoupper($countrycode) ==
"PT") {
3619 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3621 } elseif (strtoupper($countrycode) ==
"SR") {
3623 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
3625 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
3627 } elseif (strtoupper($countrycode) ==
"DE") {
3629 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
3631 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
3633 } elseif (strtoupper($countrycode) ==
"ES") {
3635 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3637 } elseif (strtoupper($countrycode) ==
"BF") {
3639 $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);
3641 } elseif (strtoupper($countrycode) ==
"RO") {
3643 $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);
3645 } elseif (strtoupper($countrycode) ==
"TR") {
3647 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3649 } elseif (strtoupper($countrycode) ==
"US") {
3651 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3653 } elseif (strtoupper($countrycode) ==
"MX") {
3655 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3657 $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);
3659 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3661 } elseif (strtoupper($countrycode) ==
"ML") {
3663 $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);
3665 } elseif (strtoupper($countrycode) ==
"TH") {
3667 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3669 $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);
3671 } elseif (strtoupper($countrycode) ==
"MU") {
3674 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3676 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3678 } elseif (strtoupper($countrycode) ==
"ZA") {
3680 $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);
3682 } elseif (strtoupper($countrycode) ==
"SY") {
3684 $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);
3686 $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);
3688 } elseif (strtoupper($countrycode) ==
"AE") {
3690 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3692 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3694 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
3696 } elseif (strtoupper($countrycode) ==
"DZ") {
3698 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3700 } elseif (strtoupper($countrycode) ==
"BE") {
3702 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3704 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3706 } elseif (strtoupper($countrycode) ==
"PF") {
3708 $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);
3710 } elseif (strtoupper($countrycode) ==
"CO") {
3712 $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);
3714 } elseif (strtoupper($countrycode) ==
"JO") {
3716 $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);
3718 } elseif (strtoupper($countrycode) ==
"JM") {
3720 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3722 } elseif (strtoupper($countrycode) ==
"MG") {
3724 $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);
3726 } elseif (strtoupper($countrycode) ==
"GB") {
3728 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3730 } elseif (strtoupper($countrycode) ==
"CH") {
3732 $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);
3734 $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);
3736 } elseif (strtoupper($countrycode) ==
"TN") {
3738 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3740 } elseif (strtoupper($countrycode) ==
"GF") {
3742 $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);
3744 } elseif (strtoupper($countrycode) ==
"GP") {
3746 $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);
3748 } elseif (strtoupper($countrycode) ==
"MQ") {
3750 $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);
3752 } elseif (strtoupper($countrycode) ==
"IT") {
3754 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3756 $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);
3758 } elseif (strtoupper($countrycode) ==
"AU") {
3762 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
3764 } elseif (strtoupper($countrycode) ==
"LU") {
3767 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3769 $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);
3771 $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);
3773 $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);
3777 $newphoneastart = $newphoneaend =
'';
3778 if (!empty($addlink)) {
3779 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
3780 $newphoneastart =
'<a href="tel:'.$phone.
'">';
3781 $newphoneaend .=
'</a>';
3782 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
3783 if (empty($user->clicktodial_loaded)) {
3784 $user->fetch_clicktodial();
3788 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
3789 if (!empty($user->clicktodial_url)) {
3790 $urlmask = $user->clicktodial_url;
3793 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
3794 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
3795 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
3797 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
3799 $substitarray = array(
'__PHONEFROM__'=>$clicktodial_poste,
3800 '__PHONETO__'=>urlencode($phone),
3801 '__LOGIN__'=>$clicktodial_login,
3802 '__PASS__'=>$clicktodial_password);
3806 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
3807 $newphoneaend =
'</a>';
3810 $newphoneastart =
'<a href="'.$url.
'"';
3812 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
3814 $newphoneastart .=
'>';
3815 $newphoneaend .=
'</a>';
3820 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3822 $addlinktoagenda =
'';
3823 if ($addlink ==
'AC_FAX') {
3827 $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>';
3829 if ($addlinktoagenda) {
3830 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
3835 if (empty($titlealt)) {
3836 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
3841 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
3842 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
3843 $rep .= $hookmanager->resPrint;
3845 if (empty($reshook)) {
3848 if ($withpicto ==
'fax') {
3849 $picto =
'phoning_fax';
3850 } elseif ($withpicto ==
'phone') {
3852 } elseif ($withpicto ==
'mobile') {
3853 $picto =
'phoning_mobile';
3858 if ($adddivfloat == 1) {
3859 $rep .=
'<div class="nospan float" style="margin-right: 10px">';
3860 } elseif (empty($adddivfloat)) {
3861 $rep .=
'<span style="margin-right: 10px;">';
3864 $rep .= $newphoneastart;
3865 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
3866 if ($separ !=
'hidenum') {
3867 $rep .= ($withpicto ?
' ' :
'').$newphone;
3869 $rep .= $newphoneaend;
3871 if ($adddivfloat == 1) {
3873 } elseif (empty($adddivfloat)) {
3901 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
3902 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
3904 $ret .=
' ('.$countrycode.
')';
3924 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
3925 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
3926 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
3927 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
3929 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
3932 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
3935 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
3951 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
3953 } 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') {
3971 if (!empty($conf->geoipmaxmind->enabled)) {
3975 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3976 $geoip =
new DolGeoIP(
'country', $datafile);
3978 $countrycode = $geoip->getCountryCodeFromIP($ip);
3981 return $countrycode;
3993 global $conf, $langs, $user;
3997 if (!empty($conf->geoipmaxmind->enabled)) {
4002 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4003 $geoip =
new DolGeoIP(
'country', $datafile);
4004 $countrycode = $geoip->getCountryCodeFromIP($ip);
4005 $ret = $countrycode;
4024 global $conf, $user, $langs, $hookmanager;
4030 $parameters = array(
'element' => $element,
'id' => $id);
4031 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4032 $out .= $hookmanager->resPrint;
4034 if (empty($reshook)) {
4035 if (empty($charfornl)) {
4036 $out .= nl2br($address);
4038 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4042 $showgmap = $showomap = 0;
4043 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4046 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4049 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4052 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4055 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4058 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4061 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4064 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4068 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
4069 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4072 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
4073 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4094function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4096 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4099 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4102 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4119 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4120 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4123 if (function_exists(
'getmxrr')) {
4126 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4127 if (count($mxhosts) > 1) {
4130 if (count($mxhosts) == 1 && !empty($mxhosts[0])) {
4167 $tmparray = explode(
' ', $s);
4168 foreach ($tmparray as $tmps) {
4185 if (is_null($string)) {
4189 if (function_exists(
'mb_strlen')) {
4190 return mb_strlen($string, $stringencoding);
4192 return strlen($string);
4206function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4210 if (empty($stringencoding)) {
4211 $stringencoding = $langs->charset_output;
4215 if (empty($trunconbytes)) {
4216 if (function_exists(
'mb_substr')) {
4217 $ret = mb_substr($string, $start, $length, $stringencoding);
4219 $ret = substr($string, $start, $length);
4222 if (function_exists(
'mb_strcut')) {
4223 $ret = mb_strcut($string, $start, $length, $stringencoding);
4225 $ret = substr($string, $start, $length);
4245function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4253 if (empty($stringencoding)) {
4254 $stringencoding =
'UTF-8';
4257 if ($conf->dol_optimize_smallscreen == 1 && $display == 1) {
4258 $size = round($size / 3);
4262 if ($trunc ==
'right') {
4264 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4266 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4271 } elseif ($trunc ==
'middle') {
4273 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4274 $size1 = round($size / 2);
4275 $size2 = round($size / 2);
4276 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4280 } elseif ($trunc ==
'left') {
4282 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4284 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4288 } elseif ($trunc ==
'wrap') {
4290 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4296 return 'BadParam3CallingDolTrunc';
4309 $type2picto = array(
4313 'int'=>
'sort-numeric-down',
4314 'double'=>
'sort-numeric-down',
4315 'price'=>
'currency',
4316 'pricecy'=>
'multicurrency',
4317 'password' =>
'key',
4318 'boolean'=>
'check-square',
4320 'datetime'=>
'calendar',
4326 'sellist' =>
'list',
4327 'radio' =>
'check-circle',
4328 'checkbox' =>
'check-square',
4329 'chkbxlst' =>
'check-square',
4331 'separate'=>
'minus'
4334 if (!empty($type2picto[$key])) {
4335 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth"');
4338 return img_picto(
'',
'generic',
'class="pictofixedwidth"');
4363function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4365 global $conf, $langs;
4368 $url = DOL_URL_ROOT;
4369 $theme = isset($conf->theme) ? $conf->theme :
null;
4370 $path =
'theme/'.$theme;
4371 if (empty($picto)) {
4376 if ($pictoisfullpath) {
4378 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4381 $fullpathpicto = $picto;
4383 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4384 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4385 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4388 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', (is_null($picto) ?
'' : $picto));
4389 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4390 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4392 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
4394 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4395 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4398 if ($pictowithouttext ==
'file-o') {
4399 $pictowithouttext =
'file';
4402 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4403 $marginleftonlyshort = 0;
4405 if (!empty($pictowithouttextarray[1])) {
4407 $fakey =
'fa-'.$pictowithouttextarray[0];
4408 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
4409 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4410 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4412 $fakey =
'fa-'.$pictowithouttext;
4422 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4423 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4424 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4426 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4427 $morestyle = $reg[1];
4428 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4430 $moreatt = trim($moreatt);
4432 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4433 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4437 $enabledisablehtml .=
'</span>';
4439 return $enabledisablehtml;
4442 if (empty($srconly) && in_array($pictowithouttext, array(
4443 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4444 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'angle-double-down',
'angle-double-up',
'asset',
4445 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bookmark',
'bom',
'briefcase-medical',
'bug',
'building',
4446 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4447 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4448 'check-circle',
'check-square',
'currency',
'multicurrency',
4449 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
'commercial',
'companies',
4450 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4451 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4452 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
4453 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4454 'hands-helping',
'help',
'holiday',
4455 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4456 'key',
'knowledgemanagement',
4457 'label',
'language',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4458 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4459 'off',
'on',
'order',
4460 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4461 'stock',
'resize',
'service',
'stats',
4462 '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',
4463 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4464 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4465 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4466 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4467 'technic',
'ticket',
4469 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4470 'shapes',
'skill',
'square',
'sort-numeric-down',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4471 'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
4472 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4473 'conferenceorbooth',
'eventorganization',
4474 'stamp',
'signature'
4476 $fakey = $pictowithouttext;
4480 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'))) {
4483 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4487 $arrayconvpictotofa = array(
4488 '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',
4489 'bank_account'=>
'university',
4490 'bill'=>
'file-invoice-dollar',
'billa'=>
'file-excel',
'billr'=>
'file-invoice-dollar',
'billd'=>
'file-medical',
4491 'supplier_invoice'=>
'file-invoice-dollar',
'supplier_invoicea'=>
'file-excel',
'supplier_invoicer'=>
'file-invoice-dollar',
'supplier_invoiced'=>
'file-medical',
4493 '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',
4494 'donation'=>
'file-alt',
'dynamicprice'=>
'hand-holding-usd',
4495 'setup'=>
'cog',
'companies'=>
'building',
'products'=>
'cube',
'commercial'=>
'suitcase',
'invoicing'=>
'coins',
4496 'accounting'=>
'search-dollar',
'category'=>
'tag',
'dollyrevert'=>
'dolly',
4497 'file-o'=>
'file',
'generate'=>
'plus-square',
'hrm'=>
'user-tie',
'incoterm'=>
'truck-loading',
4498 'margin'=>
'calculator',
'members'=>
'user-friends',
'ticket'=>
'ticket-alt',
'globe'=>
'external-link-alt',
'lot'=>
'barcode',
4499 'email'=>
'at',
'establishment'=>
'building',
'edit'=>
'pencil-alt',
'entity'=>
'globe',
4500 'graph'=>
'chart-line',
'grip_title'=>
'arrows-alt',
'grip'=>
'arrows-alt',
'help'=>
'question-circle',
4501 'generic'=>
'file',
'holiday'=>
'umbrella-beach',
4502 'info'=>
'info-circle',
'inventory'=>
'boxes',
'intracommreport'=>
'globe-europe',
'jobprofile'=>
'cogs',
4503 'knowledgemanagement'=>
'ticket-alt',
'label'=>
'layer-group',
'line'=>
'bars',
'loan'=>
'money-bill-alt',
4504 'member'=>
'user-alt',
'meeting'=>
'chalkboard-teacher',
'mrp'=>
'cubes',
'next'=>
'arrow-alt-circle-right',
4505 'trip'=>
'wallet',
'expensereport'=>
'wallet',
'group'=>
'users',
'movement'=>
'people-carry',
4506 'sign-out'=>
'sign-out-alt',
4507 'switch_off'=>
'toggle-off',
'switch_on'=>
'toggle-on',
'switch_on_warning'=>
'toggle-on',
'switch_on_red'=>
'toggle-on',
'check'=>
'check',
'bookmark'=>
'star',
4508 'bank'=>
'university',
'close_title'=>
'times',
'delete'=>
'trash',
'filter'=>
'filter',
4509 'list-alt'=>
'list-alt',
'calendarlist'=>
'bars',
'calendar'=>
'calendar-alt',
'calendarmonth'=>
'calendar-alt',
'calendarweek'=>
'calendar-week',
'calendarday'=>
'calendar-day',
'calendarperuser'=>
'table',
4510 'intervention'=>
'ambulance',
'invoice'=>
'file-invoice-dollar',
'order'=>
'file-invoice',
4511 'error'=>
'exclamation-triangle',
'warning'=>
'exclamation-triangle',
4513 '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',
4514 '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',
4515 'recent' =>
'check-square',
'reception'=>
'dolly',
'recruitmentjobposition'=>
'id-card-alt',
'recruitmentcandidature'=>
'id-badge',
4516 'resize'=>
'crop',
'supplier_order'=>
'dol-order_supplier',
'supplier_proposal'=>
'file-signature',
4517 'refresh'=>
'redo',
'region'=>
'map-marked',
'replacement'=>
'exchange-alt',
'resource'=>
'laptop-house',
'recurring'=>
'history',
4518 'service'=>
'concierge-bell',
4519 'skill'=>
'shapes',
'state'=>
'map-marked-alt',
'security'=>
'key',
'salary'=>
'wallet',
'shipment'=>
'dolly',
'stock'=>
'box-open',
'stats' =>
'chart-bar',
'split'=>
'code-branch',
'stripe'=>
'stripe-s',
4520 'supplier'=>
'building',
'technic'=>
'cogs',
4521 'timespent'=>
'clock',
'tick' =>
'check',
'title_setup'=>
'tools',
'title_accountancy'=>
'money-check-alt',
'title_bank'=>
'university',
'title_hrm'=>
'umbrella-beach',
4522 'title_agenda'=>
'calendar-alt',
4523 'uncheck'=>
'times',
'uparrow'=>
'share',
'url'=>
'external-link-alt',
'vat'=>
'money-check-alt',
'vcard'=>
'arrow-alt-circle-down',
4524 'jabber'=>
'comment-o',
4525 'website'=>
'globe-americas',
'workstation'=>
'pallet',
'webhook'=>
'bullseye',
'world'=>
'globe',
'private'=>
'user-lock',
4526 'conferenceorbooth'=>
'chalkboard-teacher',
'eventorganization'=>
'project-diagram'
4528 if ($conf->currency ==
'EUR') {
4529 $arrayconvpictotofa[
'currency'] =
'euro-sign';
4530 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
4532 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
4533 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
4535 if ($pictowithouttext ==
'off') {
4536 $fakey =
'fa-square';
4538 } elseif ($pictowithouttext ==
'on') {
4539 $fakey =
'fa-check-square';
4541 } elseif ($pictowithouttext ==
'listlight') {
4542 $fakey =
'fa-download';
4543 $marginleftonlyshort = 1;
4544 } elseif ($pictowithouttext ==
'printer') {
4545 $fakey =
'fa-print';
4547 } elseif ($pictowithouttext ==
'note') {
4548 $fakey =
'fa-sticky-note';
4549 $marginleftonlyshort = 1;
4550 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
4551 $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');
4552 $fakey =
'fa-'.$convertarray[$pictowithouttext];
4553 if (preg_match(
'/selected/', $pictowithouttext)) {
4556 $marginleftonlyshort = 1;
4557 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
4558 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
4560 $fakey =
'fa-'.$pictowithouttext;
4563 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment'))) {
4564 $morecss .=
' em092';
4566 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
4567 $morecss .=
' em088';
4569 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
4570 $morecss .=
' em080';
4574 $arrayconvpictotomarginleftonly = array(
4575 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
4576 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
4577 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
4579 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
4580 $marginleftonlyshort = 0;
4584 $arrayconvpictotomorcess = array(
4585 'action'=>
'infobox-action',
'account'=>
'infobox-bank_account',
'accounting_account'=>
'infobox-bank_account',
'accountline'=>
'infobox-bank_account',
'accountancy'=>
'infobox-bank_account',
'asset'=>
'infobox-bank_account',
4586 'bank_account'=>
'infobox-bank_account',
4587 'bill'=>
'infobox-commande',
'billa'=>
'infobox-commande',
'billr'=>
'infobox-commande',
'billd'=>
'infobox-commande',
4588 'margin'=>
'infobox-bank_account',
'conferenceorbooth'=>
'infobox-project',
4589 'cash-register'=>
'infobox-bank_account',
'contract'=>
'infobox-contrat',
'check'=>
'font-status4',
'collab'=>
'infobox-action',
'conversation'=>
'infobox-contrat',
4590 'donation'=>
'infobox-commande',
'dolly'=>
'infobox-commande',
'dollyrevert'=>
'flip infobox-order_supplier',
4591 'ecm'=>
'infobox-action',
'eventorganization'=>
'infobox-project',
4592 'hrm'=>
'infobox-adherent',
'group'=>
'infobox-adherent',
'intervention'=>
'infobox-contrat',
4593 'incoterm'=>
'infobox-supplier_proposal',
4594 'currency'=>
'infobox-bank_account',
'multicurrency'=>
'infobox-bank_account',
4595 'members'=>
'infobox-adherent',
'member'=>
'infobox-adherent',
'money-bill-alt'=>
'infobox-bank_account',
4596 'order'=>
'infobox-commande',
4597 'user'=>
'infobox-adherent',
'users'=>
'infobox-adherent',
4598 'error'=>
'pictoerror',
'warning'=>
'pictowarning',
'switch_on'=>
'font-status4',
'switch_on_warning'=>
'font-status4 warning',
'switch_on_red'=>
'font-status8',
4599 'holiday'=>
'infobox-holiday',
'info'=>
'opacityhigh',
'invoice'=>
'infobox-commande',
4600 'knowledgemanagement'=>
'infobox-contrat rotate90',
'loan'=>
'infobox-bank_account',
4601 'payment'=>
'infobox-bank_account',
'payment_vat'=>
'infobox-bank_account',
'poll'=>
'infobox-adherent',
'pos'=>
'infobox-bank_account',
'project'=>
'infobox-project',
'projecttask'=>
'infobox-project',
4602 'propal'=>
'infobox-propal',
'proposal'=>
'infobox-propal',
'private'=>
'infobox-project',
4603 'reception'=>
'flip',
'recruitmentjobposition'=>
'infobox-adherent',
'recruitmentcandidature'=>
'infobox-adherent',
4604 'resource'=>
'infobox-action',
4605 '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',
4606 'supplier'=>
'infobox-order_supplier',
'supplier_order'=>
'infobox-order_supplier',
'supplier_proposal'=>
'infobox-supplier_proposal',
4607 'ticket'=>
'infobox-contrat',
'title_accountancy'=>
'infobox-bank_account',
'title_hrm'=>
'infobox-holiday',
'expensereport'=>
'infobox-expensereport',
'trip'=>
'infobox-expensereport',
'title_agenda'=>
'infobox-action',
4608 'vat'=>
'infobox-bank_account',
4610 'list-alt'=>
'imgforviewmode',
'calendar'=>
'imgforviewmode',
'calendarweek'=>
'imgforviewmode',
'calendarmonth'=>
'imgforviewmode',
'calendarday'=>
'imgforviewmode',
'calendarperuser'=>
'imgforviewmode'
4612 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4613 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
4617 $arrayconvpictotocolor = array(
4618 'address'=>
'#6c6aa8',
'building'=>
'#6c6aa8',
'bom'=>
'#a69944',
4619 'clone'=>
'#999',
'cog'=>
'#999',
'companies'=>
'#6c6aa8',
'company'=>
'#6c6aa8',
'contact'=>
'#6c6aa8',
'cron'=>
'#555',
4620 'dynamicprice'=>
'#a69944',
4621 'edit'=>
'#444',
'note'=>
'#999',
'error'=>
'',
'help'=>
'#bbb',
'listlight'=>
'#999',
'language'=>
'#555',
4623 'lock'=>
'#ddd',
'lot'=>
'#a69944',
4624 'map-marker-alt'=>
'#aaa',
'mrp'=>
'#a69944',
'product'=>
'#a69944',
'service'=>
'#a69944',
'inventory'=>
'#a69944',
'stock'=>
'#a69944',
'movement'=>
'#a69944',
4625 'other'=>
'#ddd',
'world'=>
'#986c6a',
4626 'partnership'=>
'#6c6aa8',
'playdisabled'=>
'#ccc',
'printer'=>
'#444',
'projectpub'=>
'#986c6a',
'reception'=>
'#a69944',
'resize'=>
'#444',
'rss'=>
'#cba',
4628 'security'=>
'#999',
'square'=>
'#888',
'stop-circle'=>
'#888',
'stats'=>
'#444',
'switch_off'=>
'#999',
4629 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
4630 'uncheck'=>
'#800',
'uparrow'=>
'#555',
'user-cog'=>
'#999',
'country'=>
'#aaa',
'globe-americas'=>
'#aaa',
'region'=>
'#aaa',
'state'=>
'#aaa',
4631 'website'=>
'#304',
'workstation'=>
'#a69944'
4633 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4634 $facolor = $arrayconvpictotocolor[$pictowithouttext];
4641 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4642 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4643 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4645 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4646 $morestyle = $reg[1];
4647 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4649 $moreatt = trim($moreatt);
4651 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4652 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4656 $enabledisablehtml .=
'</span>';
4658 return $enabledisablehtml;
4665 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
4666 $path = $theme.
'/theme/'.$theme;
4671 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
4677 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4682 foreach ($conf->file->dol_document_root as $type => $dirroot) {
4683 if ($type ==
'main') {
4687 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
4688 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
4694 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
4698 return $fullpathpicto;
4702 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 :
'').
'"').
'>';
4718function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0)
4720 if (strpos($picto,
'^') === 0) {
4721 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
4723 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
4738function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
4742 if (is_numeric($picto)) {
4745 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
4746 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4750 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
4752 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
4770 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4774 if ($pictoisfullpath) {
4777 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
4780 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
4782 if (file_exists($themepath)) {
4788 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
4804function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
4808 if (empty($titlealt) || $titlealt ==
'default') {
4809 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
4811 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
4812 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
4814 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
4815 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
4817 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
4818 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
4820 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
4821 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
4823 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
4825 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
4829 if (!is_numeric($numaction)) {
4833 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
4847 if ($titlealt ==
'default') {
4848 $titlealt = $langs->trans(
'Show');
4851 return img_picto($titlealt,
'pdf'.$size.
'.png');
4865 if ($titlealt ==
'default') {
4866 $titlealt = $langs->trans(
'Add');
4869 return img_picto($titlealt,
'edit_add.png', $other);
4882 if ($titlealt ==
'default') {
4883 $titlealt = $langs->trans(
'Remove');
4886 return img_picto($titlealt,
'edit_remove.png', $other);
4897function img_edit($titlealt =
'default', $float = 0, $other =
'')
4901 if ($titlealt ==
'default') {
4902 $titlealt = $langs->trans(
'Modify');
4905 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
4916function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
4920 if ($titlealt ==
'default') {
4921 $titlealt = $langs->trans(
'View');
4924 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
4926 return img_picto($titlealt,
'eye', $moreatt);
4937function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
4941 if ($titlealt ==
'default') {
4942 $titlealt = $langs->trans(
'Delete');
4945 return img_picto($titlealt,
'delete.png', $other,
false, 0, 0,
'', $morecss);
4958 if ($titlealt ==
"default") {
4959 $titlealt = $langs->trans(
"Print");
4961 return img_picto($titlealt,
'printer.png', $other);
4971function img_split($titlealt =
'default', $other =
'class="pictosplit"')
4975 if ($titlealt ==
'default') {
4976 $titlealt = $langs->trans(
'Split');
4979 return img_picto($titlealt,
'split.png', $other);
4994 if (is_string($usealttitle)) {
4997 $usealttitle = $langs->trans(
'Info');
5001 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5014 if ($titlealt ==
'default') {
5015 $titlealt = $langs->trans(
'Informations');
5018 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5029function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5033 if ($titlealt ==
'default') {
5034 $titlealt = $langs->trans(
'Warning');
5038 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5051 if ($titlealt ==
'default') {
5052 $titlealt = $langs->trans(
'Error');
5055 return img_picto($titlealt,
'error.png');
5069 if ($titlealt ==
'default') {
5070 $titlealt = $langs->trans(
'Next');
5074 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5088 if ($titlealt ==
'default') {
5089 $titlealt = $langs->trans(
'Previous');
5093 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5104function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5108 if ($titlealt ==
'default') {
5109 $titlealt = $langs->trans(
'Down');
5112 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5123function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5127 if ($titlealt ==
'default') {
5128 $titlealt = $langs->trans(
'Up');
5131 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5142function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5146 if ($titlealt ==
'default') {
5147 $titlealt = $langs->trans(
'Left');
5150 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5161function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5165 if ($titlealt ==
'default') {
5166 $titlealt = $langs->trans(
'Right');
5169 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5183 if ($titlealt ==
'default') {
5184 $titlealt = $langs->trans(
'Active');
5188 return img_picto($titlealt,
'tick.png');
5203 if (is_null($morecss)) {
5207 if ($brand ==
'visa' || $brand ==
'Visa') {
5209 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5210 $brand =
'cc-mastercard';
5211 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5213 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5214 $brand =
'cc-discover';
5215 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5217 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5218 $brand =
'cc-diners-club';
5219 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5220 $brand =
'credit-card';
5223 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5236 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5242 if (empty($titlealt)) {
5243 $titlealt =
'Mime type: '.$mimetype;
5247 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5260 global $conf, $langs;
5262 if ($titlealt ==
'default') {
5263 $titlealt = $langs->trans(
'Search');
5266 $img =
img_picto($titlealt,
'search.png', $other,
false, 1);
5268 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5269 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5283 global $conf, $langs;
5285 if ($titlealt ==
'default') {
5286 $titlealt = $langs->trans(
'Search');
5289 $img =
img_picto($titlealt,
'searchclear.png', $other,
false, 1);
5291 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5292 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5308function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'')
5310 global $conf, $langs;
5312 if ($infoonimgalt) {
5313 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5315 if (empty($conf->use_javascript_ajax)) {
5316 $textfordropdown =
'';
5319 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5320 $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>');
5322 if ($textfordropdown) {
5323 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5324 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5325 jQuery(document).ready(function() {
5326 jQuery(".'.$class.
'text").click(function() {
5327 console.log("toggle text");
5328 jQuery(".'.$class.
'").toggle();
5333 $result = $tmpresult.$result;
5354 global $conf, $langs, $argv;
5355 global $dolibarr_main_prod;
5362 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5364 $langs->load(
"main");
5368 $langs->loadLangs(array(
'main',
'errors'));
5370 if ($_SERVER[
'DOCUMENT_ROOT']) {
5371 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5373 $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";
5375 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5377 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5378 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5379 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5380 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5382 if (function_exists(
"phpversion")) {
5383 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5385 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5386 if (function_exists(
"php_uname")) {
5387 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5389 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5391 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5392 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5393 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5395 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5396 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5398 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5399 $syslog .=
"pid=".dol_getmypid();
5402 if (!empty($conf->modules)) {
5403 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".join(
', ', $conf->modules).
"<br>\n";
5406 if (is_object($db)) {
5407 if ($_SERVER[
'DOCUMENT_ROOT']) {
5408 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5409 $lastqueryerror = $db->lastqueryerror();
5411 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5413 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5414 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5415 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5419 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5420 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5421 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5422 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5424 $syslog .=
", sql=".$db->lastquery();
5425 $syslog .=
", db_error=".$db->lasterror();
5428 if ($error || $errors) {
5429 $langs->load(
"errors");
5432 if (is_array($error) && is_array($errors)) {
5433 $errors = array_merge($error, $errors);
5434 } elseif (is_array($error)) {
5436 } elseif (is_array($errors)) {
5437 $errors = array_merge(array($error), $errors);
5439 $errors = array_merge(array($error), array($errors));
5442 foreach ($errors as $msg) {
5446 if ($_SERVER[
'DOCUMENT_ROOT']) {
5449 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5451 $syslog .=
", msg=".$msg;
5454 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5455 xdebug_print_function_stack();
5456 $out .=
'<b>XDebug informations:</b>'.
"<br>\n";
5457 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5458 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5459 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5464 if (!headers_sent()) {
5465 if (function_exists(
'top_httphead')) {
5469 http_response_code(202);
5472 if (empty($dolibarr_main_prod)) {
5475 if (empty($langs->defaultlang)) {
5476 $langs->setDefaultLang();
5478 $langs->loadLangs(array(
"main",
"errors"));
5480 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";
5481 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5482 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5483 if (!defined(
"MAIN_CORE_ERROR")) {
5484 define(
"MAIN_CORE_ERROR", 1);
5501function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5503 global $langs, $conf;
5505 if (empty($email)) {
5506 $email = $conf->global->MAIN_INFO_SOCIETE_MAIL;
5509 $langs->load(
"errors");
5512 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5513 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5514 if ($errormessage) {
5515 print
'<br><br>'.$errormessage;
5517 if (is_array($errormessages) && count($errormessages)) {
5518 foreach ($errormessages as $mesgtoshow) {
5519 print
'<br><br>'.$mesgtoshow;
5522 print
'</div></div>';
5541function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
5543 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
5564function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
5566 global $conf, $langs, $form;
5569 if ($moreattrib ==
'class="right"') {
5570 $prefix .=
'right ';
5573 $sortorder = strtoupper($sortorder);
5582 $tmpsortfield = explode(
',', $sortfield);
5583 $sortfield1 = trim($tmpsortfield[0]);
5584 $tmpfield = explode(
',', $field);
5585 $field1 = trim($tmpfield[0]);
5587 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
5588 $prefix =
'wrapcolumntitle '.$prefix;
5594 $liste_titre =
'liste_titre';
5595 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
5596 $liste_titre =
'liste_titre_sel';
5599 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
5604 if (empty($thead) && $field && empty($disablesortlink)) {
5605 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5606 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5607 $options = preg_replace(
'/&+/i',
'&', $options);
5608 if (!preg_match(
'/^&/', $options)) {
5609 $options =
'&'.$options;
5612 $sortordertouseinlink =
'';
5613 if ($field1 != $sortfield1) {
5614 if (preg_match(
'/^DESC/i', $sortorder)) {
5615 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5617 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5620 if (preg_match(
'/^ASC/i', $sortorder)) {
5621 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5623 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5626 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
5627 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
5633 if (preg_match(
'/:\w+$/', $tooltip)) {
5634 $tmptooltip = explode(
':', $tooltip);
5636 $tmptooltip = array($tooltip);
5638 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
5640 $out .= $langs->trans($name);
5643 if (empty($thead) && $field && empty($disablesortlink)) {
5647 if (empty($thead) && $field) {
5648 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5649 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5650 $options = preg_replace(
'/&+/i',
'&', $options);
5651 if (!preg_match(
'/^&/', $options)) {
5652 $options =
'&'.$options;
5655 if (!$sortorder || ($field1 != $sortfield1)) {
5659 if (preg_match(
'/^DESC/', $sortorder)) {
5662 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
5664 if (preg_match(
'/^ASC/', $sortorder)) {
5667 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
5672 $tagend =
'</'.$tag.
'>';
5674 $out = $tagstart.$sortimg.$out.$tagend;
5689 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
5691 print
'<div class="titre">'.$title.
'</div>';
5723function load_fiche_titre($titre, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
5729 if ($picto ==
'setup') {
5734 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
5735 $return .=
'<tr class="titre">';
5737 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
5739 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
5740 $return .=
'<div class="titre inline-block">'.$titre.
'</div>';
5743 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5746 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
5748 $return .=
'</tr></table>'.
"\n";
5776function 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 =
'')
5781 $savtotalnboflines = $totalnboflines;
5782 $totalnboflines = abs((
int) $totalnboflines);
5784 $page = (int) $page;
5786 if ($picto ==
'setup') {
5787 $picto =
'title_setup.png';
5789 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
5790 $picto =
'title.gif';
5793 $limit = $conf->liste_limit;
5796 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
5804 print
"<!-- Begin title -->\n";
5805 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
5809 if ($picto && $titre) {
5810 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
5813 print
'<td class="nobordernopadding valignmiddle col-title">';
5814 print
'<div class="titre inline-block">'.$titre;
5815 if (!empty($titre) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
5816 print
'<span class="opacitymedium colorblack paddingleft">('.$totalnboflines.
')</span>';
5818 print
'</div></td>';
5821 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
5822 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5826 print
'<td class="nobordernopadding valignmiddle right col-right">';
5827 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
5829 $options .=
"&sortfield=".urlencode($sortfield);
5832 $options .=
"&sortorder=".urlencode($sortorder);
5836 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
5837 if ($totalnboflines) {
5839 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
5842 $nbpages = ceil($totalnboflines / $limit);
5846 $cpt = ($page - $maxnbofpage);
5852 if (empty($pagenavastextinput)) {
5853 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
5855 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5856 } elseif ($cpt == 2) {
5857 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
5863 if ($pagenavastextinput) {
5864 if ($cpt == $page) {
5865 $pagelist .=
'<li class="pagination"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
5869 if ($cpt == $page) {
5870 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
5872 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
5876 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
5878 if (empty($pagenavastextinput)) {
5879 if ($cpt < $nbpages) {
5880 if ($cpt < $nbpages - 2) {
5881 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5882 } elseif ($cpt == $nbpages - 2) {
5883 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
5885 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5889 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5892 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
5896 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
5897 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
5901 if ($pagenavastextinput) {
5908 print
'</table>'.
"\n";
5911 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
5912 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
5915 print
"<!-- End title -->\n\n";
5934function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
5936 global $conf, $langs;
5938 print
'<div class="pagination"><ul>';
5939 if ($beforearrows) {
5940 print
'<li class="paginationbeforearrows">';
5941 print $beforearrows;
5945 if (empty($hidenavigation)) {
5946 if ((
int) $limit > 0 && empty($hideselectlimit)) {
5947 $pagesizechoices =
'10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000';
5948 $pagesizechoices .=
',5000:5000,10000:10000,20000:20000';
5952 $pagesizechoices = $conf->global->MAIN_PAGESIZE_CHOICES;
5955 print
'<li class="pagination">';
5956 print
'<select class="flat selectlimit" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
5957 $tmpchoice = explode(
',', $pagesizechoices);
5958 $tmpkey = $limit.
':'.$limit;
5959 if (!in_array($tmpkey, $tmpchoice)) {
5960 $tmpchoice[] = $tmpkey;
5962 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
5963 if (!in_array($tmpkey, $tmpchoice)) {
5964 $tmpchoice[] = $tmpkey;
5966 asort($tmpchoice, SORT_NUMERIC);
5967 foreach ($tmpchoice as $val) {
5969 $tmp = explode(
':', $val);
5972 if ($key !=
'' && $val !=
'') {
5973 if ((
int) $key == (
int) $limit) {
5974 $selected =
' selected="selected"';
5976 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
5980 if ($conf->use_javascript_ajax) {
5981 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
5983 jQuery(document).ready(function () {
5984 jQuery(".selectlimit").change(function() {
5985 console.log("Change limit. Send submit");
5986 $(this).parents(\'form:first\').submit();
5995 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>';
5997 if ($betweenarrows) {
5998 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
5999 print $betweenarrows;
6000 print
'<!--</div>-->';
6002 if ($nextpage > 0) {
6003 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>';
6006 print
'<li class="paginationafterarrows">';
6011 print
'</ul></div>'.
"\n";
6026function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6030 if (preg_match(
'/%/', $rate)) {
6031 $rate = str_replace(
'%',
'', $rate);
6035 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6036 $morelabel =
' ('.$reg[1].
')';
6037 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6038 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6040 if (preg_match(
'/\*/', $rate)) {
6041 $rate = str_replace(
'*',
'', $rate);
6046 if (!preg_match(
'/\//', $rate)) {
6047 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6050 $ret = $rate.($addpercent ?
'%' :
'');
6052 if (($info_bits & 1) && $usestarfornpr >= 0) {
6075function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6077 global $langs, $conf;
6080 if (empty($amount)) {
6083 $amount = (is_numeric($amount) ? $amount : 0);
6084 if ($rounding == -1) {
6087 $nbdecimal = $rounding;
6089 if ($outlangs ===
'none') {
6099 if (!is_object($outlangs)) {
6103 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6104 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6106 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6107 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6109 if ($thousand ==
'None') {
6111 } elseif ($thousand ==
'Space') {
6118 $amount = str_replace(
',',
'.', $amount);
6120 $datas = explode(
'.', $amount);
6121 $decpart = isset($datas[1]) ? $datas[1] :
'';
6122 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6131 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6132 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6133 $nbdecimal = $nbdecimalmaxshown;
6141 if ((
string) $forcerounding !=
'-1') {
6142 if ($forcerounding ===
'MU') {
6144 } elseif ($forcerounding ===
'MT') {
6146 } elseif ($forcerounding >= 0) {
6147 $nbdecimal = $forcerounding;
6152 $output = number_format($amount, $nbdecimal, $dec, $thousand);
6154 $output = preg_replace(
'/\s/',
' ', $output);
6155 $output = preg_replace(
'/\'/',
''', $output);
6158 $cursymbolbefore = $cursymbolafter =
'';
6159 if ($currency_code && is_object($outlangs)) {
6160 if ($currency_code ==
'auto') {
6161 $currency_code = $conf->currency;
6164 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6165 $listoflanguagesbefore = array(
'nl_NL');
6166 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6167 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6169 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6170 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6173 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6204 global $langs, $conf;
6207 if (is_null($amount)) {
6216 if (is_null($langs)) {
6220 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6221 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6223 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6224 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6227 if ($thousand ==
'None') {
6229 } elseif ($thousand ==
'Space') {
6237 if (!is_numeric($amount)) {
6238 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6241 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6242 $amount = str_replace($thousand,
'', $amount);
6248 if (is_numeric($amount)) {
6250 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6251 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6253 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6258 if ($thousand !=
',' && $thousand !=
'.') {
6259 $amount = str_replace(
',',
'.', $amount);
6262 $amount = str_replace(
' ',
'', $amount);
6263 $amount = str_replace($thousand,
'', $amount);
6264 $amount = str_replace($dec,
'.', $amount);
6266 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6272 $nbofdectoround =
'';
6273 if ($rounding ==
'MU') {
6274 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_UNIT;
6275 } elseif ($rounding ==
'MT') {
6276 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_TOT;
6277 } elseif ($rounding ==
'MS') {
6278 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6279 } elseif ($rounding ==
'CU') {
6281 } elseif ($rounding ==
'CT') {
6283 } elseif (is_numeric($rounding)) {
6284 $nbofdectoround = (int) $rounding;
6289 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6291 return 'ErrorBadParameterProvidedToFunction';
6297 if (is_numeric($amount)) {
6299 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6300 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6302 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6308 if ($thousand !=
',' && $thousand !=
'.') {
6309 $amount = str_replace(
',',
'.', $amount);
6312 $amount = str_replace(
' ',
'', $amount);
6313 $amount = str_replace($thousand,
'', $amount);
6314 $amount = str_replace($dec,
'.', $amount);
6316 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6334function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6336 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6338 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6339 $dimension = $dimension * 1000000;
6341 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6342 $dimension = $dimension * 1000;
6344 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6345 $dimension = $dimension / 1000000;
6347 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6348 $dimension = $dimension / 1000;
6364 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6365 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6383function get_localtax($vatrate, $local, $thirdparty_buyer =
"", $thirdparty_seller =
"", $vatnpr = 0)
6385 global $db, $conf, $mysoc;
6387 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6388 $thirdparty_seller = $mysoc;
6391 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);
6393 $vatratecleaned = $vatrate;
6395 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6396 $vatratecleaned = trim($reg[1]);
6397 $vatratecode = $reg[2];
6406 if ($mysoc->country_code ==
'ES') {
6408 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6411 if ($thirdparty_seller->id == $mysoc->id) {
6412 if (!$thirdparty_buyer->localtax1_assuj) {
6416 if (!$thirdparty_seller->localtax1_assuj) {
6424 if (!$mysoc->localtax2_assuj) {
6427 if ($thirdparty_seller->id == $mysoc->id) {
6428 if (!$thirdparty_buyer->localtax2_assuj) {
6432 if (!$thirdparty_seller->localtax2_assuj) {
6438 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6441 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6447 if (in_array($mysoc->country_code, array(
'ES'))) {
6448 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6454 if ($thirdparty_seller != $mysoc) {
6456 return $thirdparty_seller->localtax1_value;
6460 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6465 if ($thirdparty_seller != $mysoc) {
6468 return $thirdparty_seller->localtax2_value;
6471 if (in_array($mysoc->country_code, array(
'ES'))) {
6472 return $thirdparty_buyer->localtax2_value;
6474 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6481 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6482 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6483 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6484 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6485 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6486 if (!empty($vatratecode)) {
6487 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6489 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6492 $resql = $db->query($sql);
6495 $obj = $db->fetch_object($resql);
6498 return $obj->localtax1;
6499 } elseif ($local == 2) {
6500 return $obj->localtax2;
6521 $valors = explode(
":", $tax);
6523 if (count($valors) > 1) {
6540 $sql =
" SELECT t.localtax".$local.
" as localtax";
6541 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
6542 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
6543 $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";
6544 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
6545 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
6546 $sql .=
" ORDER BY t.rowid DESC";
6548 $resql = $db->query($sql);
6550 $obj = $db->fetch_object($resql);
6552 return $obj->localtax;
6577 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
6580 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
6581 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
6582 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6583 if ($firstparamisid) {
6584 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6586 $vatratecleaned = $vatrate;
6589 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6590 $vatratecleaned = $reg[1];
6591 $vatratecode = $reg[2];
6594 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6597 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($seller->country_code).
"'";
6598 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6599 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6601 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6605 $resql = $db->query($sql);
6607 $obj = $db->fetch_object($resql);
6610 'rowid'=>$obj->rowid,
6613 'localtax1'=>$obj->localtax1,
6614 'localtax1_type'=>$obj->localtax1_type,
6615 'localtax2'=>$obj->localtax2,
6616 'localtax2_type'=>$obj->localtax2_type,
6618 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6619 'accountancy_code_buy'=>$obj->accountancy_code_buy
6651 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6654 $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";
6655 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6656 if ($firstparamisid) {
6657 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6659 $vatratecleaned = $vatrate;
6662 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6663 $vatratecleaned = $reg[1];
6664 $vatratecode = $reg[2];
6667 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6668 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6669 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6670 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6672 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6673 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6675 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6677 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6681 $resql = $db->query($sql);
6683 $obj = $db->fetch_object($resql);
6686 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6689 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6690 } elseif ($local == 2) {
6691 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6693 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);
6713 global $db, $conf, $mysoc;
6715 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6723 $product->fetch($idprod);
6725 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6727 if ($idprodfournprice > 0) {
6728 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6730 $ret = $product->vatrate_supplier;
6731 if ($product->default_vat_code_supplier) {
6732 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6738 $ret = $product->tva_tx;
6739 if ($product->default_vat_code) {
6740 $ret .=
' ('.$product->default_vat_code.
')';
6753 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6754 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6755 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6756 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6757 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6758 $sql .= $db->plimit(1);
6760 $resql = $db->query($sql);
6762 $obj = $db->fetch_object($resql);
6764 $ret = $obj->vat_rate;
6765 if ($obj->default_vat_code) {
6766 $ret .=
' ('.$obj->default_vat_code.
')';
6779 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6790 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6807 if (!class_exists(
'Product')) {
6808 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6817 $result = $product->fetch($idprod);
6819 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6833 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6834 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6835 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6836 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6837 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6838 $sql .= $db->plimit(1);
6840 $resql = $db->query($sql);
6842 $obj = $db->fetch_object($resql);
6845 $ret = $obj->localtax1;
6846 } elseif ($local == 2) {
6847 $ret = $obj->localtax2;
6855 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6879 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6882 $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;
6884 $seller_country_code = $thirdparty_seller->country_code;
6885 $seller_in_cee =
isInEEC($thirdparty_seller);
6887 $buyer_country_code = $thirdparty_buyer->country_code;
6888 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6890 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 :
''));
6895 if ($seller_in_cee && $buyer_in_cee) {
6896 $isacompany = $thirdparty_buyer->
isACompany();
6897 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6898 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6912 if (!$seller_use_vat) {
6918 if (($seller_country_code == $buyer_country_code)
6919 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6923 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6927 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6929 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6930 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6932 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6944 if (($seller_in_cee && $buyer_in_cee)) {
6945 $isacompany = $thirdparty_buyer->
isACompany();
6946 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6947 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6964 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
6965 $isacompany = $thirdparty_buyer->
isACompany();
6993 if ($idprodfournprice > 0) {
6994 if (!class_exists(
'ProductFournisseur')) {
6995 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
6998 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
6999 return $prodprice->fourn_tva_npr;
7000 } elseif ($idprod > 0) {
7001 if (!class_exists(
'Product')) {
7002 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7005 $prod->fetch($idprod);
7006 return $prod->tva_npr;
7029 if (!is_object($thirdparty_seller)) {
7032 if (!is_object($thirdparty_buyer)) {
7037 if ($mysoc->country_code ==
'ES') {
7038 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7043 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7046 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7050 } elseif ($local == 2) {
7052 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7055 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7060 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7075function yn($yesno, $case = 1, $color = 0)
7079 $result =
'unknown';
7081 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7082 $result = $langs->trans(
'yes');
7083 if ($case == 1 || $case == 3) {
7084 $result = $langs->trans(
"Yes");
7087 $result =
'<input type="checkbox" value="1" checked disabled>';
7090 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7094 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7095 $result = $langs->trans(
"no");
7096 if ($case == 1 || $case == 3) {
7097 $result = $langs->trans(
"No");
7100 $result =
'<input type="checkbox" value="0" disabled>';
7103 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7109 $classname =
'error';
7113 return '<span class="'.$classname.
'">'.$result.
'</span>';
7133function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
7137 if (empty($modulepart) && !empty($object->module)) {
7138 $modulepart = $object->module;
7143 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
7145 $arrayforoldpath[] =
'product';
7147 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
7149 if (empty($alpha)) {
7150 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7152 $num = preg_replace(
'/^.*\-/i',
'', $num);
7154 $num = substr(
"000".$num, -$level);
7156 $path = substr($num, 0, 1);
7159 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7162 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7172 if (empty($withoutslash) && !empty($path)) {
7191 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7194 if (@is_dir($dir_osencoded)) {
7202 if (!empty($dataroot)) {
7204 $dir = str_replace($dataroot.
'/',
'', $dir);
7205 $ccdir = $dataroot.
'/';
7208 $cdir = explode(
"/", $dir);
7209 $num = count($cdir);
7210 for ($i = 0; $i < $num; $i++) {
7212 $ccdir .=
'/'.$cdir[$i];
7214 $ccdir .= $cdir[$i];
7217 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7225 if (!@is_dir($ccdir_osencoded)) {
7226 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7229 $dirmaskdec = octdec((
string) $newmask);
7230 if (empty($newmask)) {
7231 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7233 $dirmaskdec |= octdec(
'0111');
7234 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7236 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7239 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7248 return ($nberr ? -$nberr : $nbcreated);
7263 if (!empty($newmask)) {
7264 @chmod($filepath, octdec($newmask));
7266 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7278 return '<span class="fieldrequired">*</span>';
7298function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7300 if (is_null($stringtoclean)) {
7304 if ($removelinefeed == 2) {
7305 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7307 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7312 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7315 $temp = strip_tags($temp);
7318 $pattern =
"/<[^<>]+>/";
7325 $tempbis = str_replace(
'<>',
'', $temp);
7326 $tempbis = preg_replace($pattern,
'', $tempbis);
7328 }
while ($tempbis != $temp);
7333 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7339 if ($removelinefeed == 1) {
7340 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7344 if ($removedoublespaces) {
7345 while (strpos($temp,
" ")) {
7346 $temp = str_replace(
" ",
" ", $temp);
7350 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7370function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7372 if (empty($allowed_tags)) {
7373 $allowed_tags = array(
7374 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7375 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7376 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7379 $allowed_tags[] =
"comment";
7381 if (!in_array(
'iframe', $allowed_tags)) {
7382 $allowed_tags[] =
"iframe";
7386 if (!in_array(
'link', $allowed_tags)) {
7387 $allowed_tags[] =
"link";
7391 $allowed_tags_string = join(
"><", $allowed_tags);
7392 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7394 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7399 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7401 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7402 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7404 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7406 if ($cleanalsosomestyles) {
7407 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7409 if ($removeclassattribute) {
7410 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7415 if ($cleanalsojavascript) {
7416 $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);
7419 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7421 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7441 if (is_null($allowed_attributes)) {
7442 $allowed_attributes = array(
7443 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
7445 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7449 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7450 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7453 $dom =
new DOMDocument(
null,
'UTF-8');
7454 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7456 if (is_object($dom)) {
7457 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7458 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7460 if (!empty($attrs->item($ii)->name)) {
7461 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7463 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7464 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7466 $valuetoclean = $attrs->item($ii)->value;
7468 if (isset($valuetoclean)) {
7470 $oldvaluetoclean = $valuetoclean;
7471 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7472 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7473 if ($els->item($i)->tagName ==
'a') {
7474 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7475 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7476 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7480 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7481 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7482 }
while ($oldvaluetoclean != $valuetoclean);
7485 $attrs->item($ii)->value = $valuetoclean;
7492 $return = $dom->saveHTML();
7495 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7496 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
7497 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
7498 return trim($return);
7500 return $stringtoclean;
7517 $temp = $stringtoclean;
7518 foreach ($disallowed_tags as $tagtoremove) {
7519 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7520 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7523 if ($cleanalsosomestyles) {
7524 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7542 if ($nboflines == 1) {
7544 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7545 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7548 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7553 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7557 $text = preg_replace(
'/\n/',
'', $text);
7559 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7561 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7564 $text = strtr($text, $repTable);
7565 if ($charset ==
'UTF-8') {
7566 $pattern =
'/(<br[^>]*>)/Uu';
7569 $pattern =
'/(<br[^>]*>)/U';
7571 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7576 $lastaddediscontent = 1;
7577 while ($countline < $nboflines && isset($a[$i])) {
7578 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
7579 if (array_key_exists($i+1, $a) && !empty($a[$i+1])) {
7580 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7582 if (!$lastaddediscontent) {
7585 $lastaddediscontent = 0;
7588 $firstline .= $a[$i];
7589 $lastaddediscontent = 1;
7595 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i+1, $a) && !empty($a[$i+1]))));
7597 $ret = $firstline.($adddots ?
'...' :
'');
7615function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7617 if (is_null($stringtoencode)) {
7622 return nl2br($stringtoencode, $forxml);
7624 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7640 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
7645 return $stringtoencode;
7647 $out = $stringtoencode;
7650 $oldstringtoclean = $out;
7652 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
7654 libxml_use_internal_errors(
false);
7655 if (LIBXML_VERSION < 20900) {
7658 libxml_disable_entity_loader(
true);
7661 $dom =
new DOMDocument();
7667 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
7669 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
7671 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
7672 $out = trim($dom->saveHTML());
7675 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
7676 $out = preg_replace(
'/<\/div>$/',
'', $out);
7680 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7684 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
7687 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
7693 'quote-marks' =>
false,
7694 'doctype' =>
'strict',
7695 'show-body-only' =>
true,
7696 "indent-attributes" =>
false,
7697 "vertical-space" =>
false,
7709 $out = $tidy->repairString($out, $config,
'utf8');
7716 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7721 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
7724 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7728 $out = preg_replace(
'/'/i',
''', $out);
7733 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7739 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7750 $out = preg_replace(
'/'/i',
"'", $out);
7751 }
while ($oldstringtoclean != $out);
7758 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
7759 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
7760 $nblinks = count($reg[0]);
7761 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7762 $out =
'ErrorTooManyLinksIntoHTMLString';
7765 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
7767 $out =
'ErrorHTMLLinksNotAllowed';
7769 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
7772 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
7775 if (preg_match_all($pattern, $out, $matches)) {
7777 $urls = $matches[1];
7780 foreach ($urls as $url) {
7782 echo
"Found url = ".$url .
"\n";
7785 $out =
'ErrorHTMLExternalLinksNotAllowed';
7815function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7817 if (is_null($stringtoencode)) {
7821 $newstring = $stringtoencode;
7823 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7824 if ($removelasteolbr) {
7825 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7827 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
7828 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7830 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7832 if ($removelasteolbr) {
7833 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7852 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7853 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7854 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7855 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7867 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7868 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7884 if ($keepsomeentities) {
7885 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7887 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7888 if ($keepsomeentities) {
7889 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7905function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7907 return htmlentities($string, $flags, $encoding, $double_encode);
7926 for ($scursor = 0; $scursor < $len; $scursor++) {
7927 $ordchar = ord($s[$scursor]);
7929 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7932 } elseif ($ordchar > 126 && $ordchar < 160) {
7936 $out .= $s[$scursor];
7958 $arraystring = explode(
"\n", $s);
7959 $nb = count($arraystring);
7976 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7978 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7981 $text = strtr($text, $repTable);
7982 if ($charset ==
'UTF-8') {
7983 $pattern =
'/(<br[^>]*>)/Uu';
7986 $pattern =
'/(<br[^>]*>)/U';
7988 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7990 $nblines = (int) floor((count($a) + 1) / 2);
7993 foreach ($a as $line) {
7996 $line_dec = html_entity_decode($line);
7998 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
7999 $nblines += substr_count($line_dec,
'\n');
8019 if (is_null($msg)) {
8024 if (preg_match(
'/<html/i', $msg)) {
8026 } elseif (preg_match(
'/<body/i', $msg)) {
8028 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8030 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8032 } elseif (preg_match(
'/<br/i', $msg)) {
8038 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8039 if (preg_match(
'/<html/i', $msg)) {
8041 } elseif (preg_match(
'/<body/i', $msg)) {
8043 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8045 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8047 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8049 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8051 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8053 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8055 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8057 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8059 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8062 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8086 if (!empty($invert)) {
8094 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8114 global $db, $conf, $mysoc, $user, $extrafields;
8116 $substitutionarray = array();
8118 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8122 $emailsendersignature = $user->signature;
8123 $usersignature = $user->signature;
8124 $substitutionarray = array_merge($substitutionarray, array(
8125 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8129 if (is_object($user)) {
8130 $substitutionarray = array_merge($substitutionarray, array(
8131 '__USER_ID__' => (
string) $user->id,
8132 '__USER_LOGIN__' => (
string) $user->login,
8133 '__USER_EMAIL__' => (
string) $user->email,
8134 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8135 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8136 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8137 '__USER_FAX__' => (
string) $user->office_fax,
8138 '__USER_LASTNAME__' => (
string) $user->lastname,
8139 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8140 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8141 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8142 '__USER_JOB__' => (
string) $user->job,
8144 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8148 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8149 $substitutionarray = array_merge($substitutionarray, array(
8150 '__MYCOMPANY_NAME__' => $mysoc->name,
8151 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8152 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8153 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8154 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8155 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8156 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8157 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8158 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8159 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8160 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8161 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8162 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8163 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8164 '__MYCOMPANY_TOWN__' => $mysoc->town,
8165 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8166 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8167 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8168 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8172 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8174 $substitutionarray[
'__ID__'] =
'__ID__';
8175 $substitutionarray[
'__REF__'] =
'__REF__';
8176 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8177 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8178 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8179 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8180 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8181 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8182 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8184 if (isModEnabled(
"societe")) {
8185 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8186 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8187 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8188 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8189 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8190 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8191 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8192 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8193 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8194 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8195 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8196 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8197 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8198 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8199 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8200 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8201 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8202 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8203 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8204 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8206 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8207 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8208 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8209 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8210 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8211 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8216 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8217 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8218 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8219 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8220 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8221 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8222 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8223 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8224 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8225 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8228 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8229 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8230 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8231 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8233 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8234 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8235 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8236 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8240 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8241 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8242 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8243 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8244 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8246 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8247 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8249 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8250 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8252 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8253 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8254 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8255 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8256 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8257 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8258 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8260 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8261 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8262 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8263 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8264 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8266 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
8267 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8268 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8269 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8271 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
8272 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
8273 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8276 $substitutionarray[
'__ID__'] = $object->id;
8277 $substitutionarray[
'__REF__'] = $object->ref;
8278 $substitutionarray[
'__NEWREF__'] = $object->newref;
8279 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
8280 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8281 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8282 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
8283 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
8284 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
8285 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%d") :
'');
8286 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%A") :
'');
8287 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%m") :
'');
8288 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%b") :
'');
8289 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%Y") :
'');
8290 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%H") :
'');
8291 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%M") :
'');
8292 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%S") :
'');
8295 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8296 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8297 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->delivery_date) ?
dol_print_date($object->delivery_date,
'day', 0, $outputlangs) :
'');
8298 $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 :
'')) :
'');
8299 $substitutionarray[
'__EXPIRATION_DATE__'] = (isset($object->fin_validite) ?
dol_print_date($object->fin_validite,
'daytext') :
'');
8301 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8302 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8304 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8305 if (method_exists($object,
'getCivilityLabel')) {
8306 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8308 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8309 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8310 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8311 if (method_exists($object,
'getFullName')) {
8312 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8314 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8315 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8316 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8317 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8318 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8319 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8320 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8321 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8322 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8323 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8324 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8325 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8326 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8327 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8328 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8329 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8330 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8331 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8332 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8333 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8336 if (is_object($object) && $object->element ==
'societe') {
8337 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8338 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8339 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8340 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8341 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8342 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8343 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8344 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8345 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8346 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8347 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8348 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8349 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8350 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8351 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8352 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8353 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8354 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8355 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8356 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8357 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8358 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8359 } elseif (is_object($object->thirdparty)) {
8360 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8361 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8362 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8363 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8364 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8365 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8366 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8367 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8368 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8369 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8370 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8371 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8372 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8373 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8374 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8375 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8376 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8377 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8378 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8379 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8380 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8381 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8384 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8385 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8386 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8387 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8389 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8390 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8391 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8392 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8395 if (is_object($object) && $object->element ==
'project') {
8396 $substitutionarray[
'__PROJECT_ID__'] = $object->id;
8397 $substitutionarray[
'__PROJECT_REF__'] = $object->ref;
8398 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8399 } elseif (is_object($object)) {
8401 if (!empty($object->project)) {
8402 $project = $object->project;
8403 } elseif (!empty($object->projet)) {
8404 $project = $object->projet;
8406 if (!is_null($project) && is_object($project)) {
8407 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8408 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8409 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8413 if (!empty($object->fk_project) && $object->fk_project > 0) {
8414 $project_id = $object->fk_project;
8415 } elseif (!empty($object->fk_projet) && $object->fk_projet > 0) {
8416 $project_id = $object->fk_project;
8418 if ($project_id > 0) {
8420 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8421 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8422 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8427 if (is_object($object) && $object->element ==
'shipping') {
8428 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8429 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8430 $substitutionarray[
'__SHIPPINGMETHOD__'] = $object->shipping_method;
8432 if (is_object($object) && $object->element ==
'reception') {
8433 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8434 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8437 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8438 $dateplannedstart =
'';
8439 $datenextexpiration =
'';
8440 foreach ($object->lines as $line) {
8441 if ($line->date_start > $dateplannedstart) {
8442 $dateplannedstart = $line->date_start;
8444 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8445 $datenextexpiration = $line->date_end;
8448 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8449 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8450 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8451 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8454 if (is_object($object) && $object->element ==
'ticket') {
8455 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8456 $substitutionarray[
'__REF__'] = $object->ref;
8457 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8458 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8459 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8460 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8461 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8462 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8463 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8464 $userstat =
new User($db);
8465 if ($object->fk_user_assign > 0) {
8466 $userstat->fetch($object->fk_user_assign);
8467 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8470 if ($object->fk_user_create > 0) {
8471 $userstat->fetch($object->fk_user_create);
8472 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8477 if ($object->table_element && $object->id > 0) {
8478 if (!is_object($extrafields)) {
8481 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8483 if ($object->fetch_optionals() > 0) {
8484 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8485 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8486 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8487 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8488 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8489 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8490 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8491 $datetime = $object->array_options[
'options_'.$key];
8492 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8493 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8494 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8495 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8496 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8497 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8498 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8499 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8500 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8501 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8502 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8511 if (empty($substitutionarray[
'__REF__'])) {
8515 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8516 $outputlangs->loadLangs(array(
'paypal',
'other'));
8519 $typeforonlinepayment =
'free';
8520 if (is_object($object) && $object->element ==
'commande') {
8521 $typeforonlinepayment =
'order';
8523 if (is_object($object) && $object->element ==
'facture') {
8524 $typeforonlinepayment =
'invoice';
8526 if (is_object($object) && $object->element ==
'member') {
8527 $typeforonlinepayment =
'member';
8528 if (!empty($object->last_subscription_amount)) {
8529 $amounttouse = $object->last_subscription_amount;
8532 if (is_object($object) && $object->element ==
'contrat') {
8533 $typeforonlinepayment =
'contract';
8535 if (is_object($object) && $object->element ==
'fichinter') {
8536 $typeforonlinepayment =
'ficheinter';
8539 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8543 if ($object->id > 0) {
8544 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8545 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8547 if (
getDolGlobalString(
'PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'propal') {
8548 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8550 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8552 if (
getDolGlobalString(
'ORDER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'commande') {
8553 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8555 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8557 if (
getDolGlobalString(
'INVOICE_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'facture') {
8558 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8560 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8562 if (
getDolGlobalString(
'CONTRACT_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'contrat') {
8563 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8565 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8567 if (
getDolGlobalString(
'FICHINTER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'fichinter') {
8568 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8570 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8572 if (
getDolGlobalString(
'SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'supplier_proposal') {
8573 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8575 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8578 if (is_object($object) && $object->element ==
'propal') {
8579 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8580 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8581 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref);
8583 if (is_object($object) && $object->element ==
'commande') {
8584 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8586 if (is_object($object) && $object->element ==
'facture') {
8587 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8589 if (is_object($object) && $object->element ==
'contrat') {
8590 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8591 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8592 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref);
8594 if (is_object($object) && $object->element ==
'fichinter') {
8595 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8596 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8597 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref);
8599 if (is_object($object) && $object->element ==
'supplier_proposal') {
8600 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8602 if (is_object($object) && $object->element ==
'shipping') {
8603 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8607 if (is_object($object) && $object->element ==
'action') {
8608 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8609 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".$object->type_code);
8610 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'day',
'auto', $outputlangs);
8611 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'hour',
'auto', $outputlangs);
8615 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8616 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8618 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8619 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8621 $already_payed_all = 0;
8622 if (is_object($object) && ($object instanceof
Facture)) {
8623 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8626 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8628 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8629 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8630 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8632 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8634 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8635 $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)) :
'';
8636 $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)) :
'';
8638 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8639 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8641 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8642 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8646 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8647 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8648 $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) :
'';
8649 $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)) :
'';
8650 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8651 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8653 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8654 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8657 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8658 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8659 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8663 if ($onlykey != 2) {
8664 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8665 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8666 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8671 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8672 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8682 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8684 $substitutionarray = array_merge($substitutionarray, array(
8685 '__NOW_TMS__' => (
string) $now,
8686 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
8687 '__DAY__' => (
string) $tmp[
'mday'],
8688 '__DAY_TEXT__' => $daytext,
8689 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8690 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8691 '__MONTH__' => (
string) $tmp[
'mon'],
8692 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8693 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8694 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8695 '__YEAR__' => (
string) $tmp[
'year'],
8696 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8697 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8698 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8699 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8700 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8701 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
8702 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
8703 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
8704 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8708 if (isModEnabled(
'multicompany')) {
8709 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8711 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8712 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8713 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8714 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8715 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8720 return $substitutionarray;
8739function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8741 global $conf, $db, $langs;
8743 if (!is_array($substitutionarray)) {
8744 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8747 if (empty($outputlangs)) {
8748 $outputlangs = $langs;
8758 if (is_object($outputlangs)) {
8760 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8762 $tmp = explode(
'|', $reg[1]);
8763 if (!empty($tmp[1])) {
8764 $outputlangs->load($tmp[1]);
8767 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8769 if (empty($converttextinhtmlifnecessary)) {
8771 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8785 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8793 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8794 $keyfound = $reg[1];
8796 $value =
'*****forbidden*****';
8798 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8801 if (empty($converttextinhtmlifnecessary)) {
8803 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8816 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8821 foreach ($substitutionarray as $key => $value) {
8822 if (!isset($value)) {
8826 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
8830 if (empty($converttextinhtmlifnecessary)) {
8831 $text = str_replace(
"$key",
"$value", $text);
8843 $text = str_replace(
"$key",
"$value", $text);
8859 $memory_object_list = array();
8860 foreach ($substitutionarray as $key => $value) {
8861 $lazy_load_arr = array();
8862 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
8863 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
8864 $key_to_substitute = $lazy_load_arr[1];
8865 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
8866 $param_arr = explode(
':', $value);
8868 if (count($param_arr) == 4) {
8869 $path = $param_arr[0];
8870 $class = $param_arr[1];
8871 $method = $param_arr[2];
8872 $id = (int) $param_arr[3];
8875 if (!isset($memory_object_list[$class])) {
8877 require_once DOL_DOCUMENT_ROOT . $path;
8878 if (class_exists($class)) {
8879 $memory_object_list[$class] = array(
8887 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
8888 if (method_exists($class, $method)) {
8889 if (!isset($memory_object_list[$class][
'list'][$id])) {
8890 $tmpobj =
new $class($db);
8891 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
8892 $memory_object_list[$class][
'list'][$id] = $tmpobj;
8894 $tmpobj = $memory_object_list[$class][
'list'][$id];
8895 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
8898 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
8924 global $conf, $user;
8926 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8931 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8933 foreach ($dirsubstitutions as $reldir) {
8941 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8942 foreach ($substitfiles as $substitfile) {
8944 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8947 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8949 require_once $dir.$substitfile[
'name'];
8951 $function_name = $module.
"_".$callfunc;
8952 if (function_exists($function_name)) {
8953 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8961 foreach ($substitutionarray as $key => $value) {
8962 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8964 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
8979 print
get_date_range($date_start, $date_end, $format, $outputlangs);
8992function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
8998 if (!is_object($outputlangs)) {
8999 $outputlangs = $langs;
9002 if ($date_start && $date_end) {
9003 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9005 if ($date_start && !$date_end) {
9006 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9008 if (!$date_start && $date_end) {
9009 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9029 if ($nameorder < 0) {
9032 if ($nameorder == 1) {
9034 if ($firstname && $lastname) {
9038 } elseif ($nameorder == 2 || $nameorder == 3) {
9040 if (empty($ret) && $nameorder == 3) {
9045 if (empty($ret) && $nameorder == 5) {
9048 if ($nameorder == 0) {
9049 if ($firstname && $lastname) {
9073 if (!is_array($mesgs)) {
9074 $mesgs = trim((
string) $mesgs);
9077 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9080 $_SESSION[
'dol_events'][$style][] = $mesgs;
9084 foreach ($mesgs as $mesg) {
9085 $mesg = trim((
string) $mesg);
9087 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9090 $_SESSION[
'dol_events'][$style][] = $mesg;
9110 if (empty($mesg) && empty($mesgs)) {
9111 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9118 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9119 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9120 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
9122 if (empty($mesgs)) {
9125 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9146 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9147 if (empty($disabledoutputofmessages)) {
9150 unset($_SESSION[
'dol_events'][
'mesgs']);
9153 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9154 if (empty($disabledoutputofmessages)) {
9157 unset($_SESSION[
'dol_events'][
'errors']);
9161 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9162 if (empty($disabledoutputofmessages)) {
9165 unset($_SESSION[
'dol_events'][
'warnings']);
9185 global $conf, $langs;
9190 $divstart = $divend =
'';
9193 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9194 $divstart =
'<div class="'.$style.
' clearboth">';
9198 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9199 $langs->load(
"errors");
9201 if (is_array($mesgarray) && count($mesgarray)) {
9202 foreach ($mesgarray as $message) {
9204 $out .= $langs->trans($message);
9205 if ($ret < count($mesgarray)) {
9212 $out .= $langs->trans($mesgstring);
9218 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9219 $return =
'<script nonce="'.getNonce().
'">
9220 $(document).ready(function() {
9225 /* jnotify(message, preset of message type, keepmessage) */
9227 "'.($style ==
"ok" ? 3000 : $style).
'",
9228 '.($style ==
"ok" ?
"false" :
"true").
',
9229 { remove: function (){} } );
9272 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9278 if (is_array($mesgarray)) {
9279 foreach ($mesgarray as $val) {
9280 if ($val && preg_match(
'/class="error"/i', $val)) {
9284 if ($val && preg_match(
'/class="warning"/i', $val)) {
9289 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9291 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9294 if ($style ==
'error') {
9297 if ($style ==
'warning') {
9301 if ($iserror || $iswarning) {
9303 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9304 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9305 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9307 if (is_array($mesgarray)) {
9308 $newmesgarray = array();
9309 foreach ($mesgarray as $val) {
9310 if (is_string($val)) {
9311 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9312 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9313 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
9314 $newmesgarray[] = $tmpmesgstring;
9316 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
9319 $mesgarray = $newmesgarray;
9321 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
9357function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
9360 $order = strtolower($order);
9362 if (is_array($array)) {
9363 $sizearray = count($array);
9364 if ($sizearray > 0) {
9366 foreach (array_keys($array) as $key) {
9367 if (is_object($array[$key])) {
9368 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
9370 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9372 if ($natsort == -1) {
9373 $temp[$key] =
'___'.$temp[$key];
9377 if (empty($natsort) || $natsort == -1) {
9378 if ($order ==
'asc') {
9384 if ($case_sensitive) {
9389 if ($order !=
'asc') {
9390 $temp = array_reverse($temp,
true);
9396 foreach (array_keys($temp) as $key) {
9397 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9416 $str = (string) $str;
9419 $strLength = strlen($str);
9420 for ($i = 0; $i < $strLength; $i++) {
9421 if (ord($str[$i]) < 0x80) {
9423 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9425 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9427 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9429 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9431 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9436 for ($j = 0; $j < $n; $j++) {
9437 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9458 return preg_match(
'//u', $str) ? true :
false;
9470 if (function_exists(
'mb_check_encoding')) {
9472 if (!mb_check_encoding($str,
'ASCII')) {
9476 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9496 $tmp = ini_get(
"unicode.filesystem_encoding");
9497 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9498 $tmp =
'iso-8859-1';
9504 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9507 if ($tmp ==
'iso-8859-1') {
9508 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9528function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
9530 global $cache_codes;
9538 if (isset($cache_codes[$tablename][$key][$fieldid])) {
9539 return $cache_codes[$tablename][$key][$fieldid];
9542 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9544 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9545 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9546 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9547 if (!empty($entityfilter)) {
9548 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9554 $resql = $db->query($sql);
9556 $obj = $db->fetch_object($resql);
9558 $cache_codes[$tablename][$key][$fieldid] = $obj->valuetoget;
9560 $cache_codes[$tablename][$key][$fieldid] =
'';
9563 return $cache_codes[$tablename][$key][$fieldid];
9580 if ($matchrule == 1) {
9581 if ($var ==
'mainmenu') {
9583 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
9584 } elseif ($var ==
'leftmenu') {
9586 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
9588 return 'This variable is not accessible with dol_eval';
9591 return 'This value for matchrule is not implemented';
9606 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9609 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9610 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9629function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9633 global $db, $langs, $user, $website, $websitepage;
9634 global $action, $mainmenu, $leftmenu;
9636 global $objectoffield;
9642 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
9643 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
9648 if ($onlysimplestring ==
'1') {
9651 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
9653 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9655 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9657 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9659 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9665 while ($scheck && $savescheck != $scheck) {
9666 $savescheck = $scheck;
9667 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9668 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9669 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9670 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9671 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9672 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9675 if (strpos($scheck,
'(') !==
false) {
9677 return 'Bad string syntax to evaluate (mode 1, found call of a function or method without using the direct name of the function): '.$s;
9679 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);
9685 } elseif ($onlysimplestring ==
'2') {
9687 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@[]';
9689 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9691 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9693 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9695 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9701 while ($scheck && $savescheck != $scheck) {
9702 $savescheck = $scheck;
9703 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9704 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9705 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9706 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9707 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9708 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9711 if (strpos($scheck,
'(') !==
false) {
9713 return 'Bad string syntax to evaluate (mode 2, found call of a function or method without using the direct name of the function): '.$s;
9715 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);
9722 if (is_array($s) || $s ===
'Array') {
9723 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9725 if (strpos($s,
'::') !==
false) {
9727 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
9729 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s);
9733 if (strpos($s,
'`') !==
false) {
9735 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9737 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9741 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9743 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9745 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9751 $forbiddenphpstrings = array(
'$$');
9752 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9754 $forbiddenphpfunctions = array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen");
9755 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9756 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
9757 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9758 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9759 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
9760 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9761 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
9763 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9765 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9767 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9770 $oldstringtoclean = $s;
9771 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9772 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9773 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9775 }
while ($oldstringtoclean != $s);
9777 if (strpos($s,
'__forbiddenstring__') !==
false) {
9778 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9780 return 'Bad string syntax to evaluate: '.$s;
9782 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9790 return @eval(
'return '.$s.
';');
9792 return eval(
'return '.$s.
';');
9801 }
catch (Error $e) {
9802 $error =
'dol_eval try/catch error : ';
9803 $error .= $e->getMessage();
9817 return (trim($element) !=
'');
9830 if (empty($codelang)) {
9834 if ($codelang ==
'auto') {
9835 return '<span class="fa fa-language"></span>';
9838 $langtocountryflag = array(
9840 'ca_ES' =>
'catalonia',
9844 'sw_SW' =>
'unknown',
9854 if (isset($langtocountryflag[$codelang])) {
9855 $flagImage = $langtocountryflag[$codelang];
9857 $tmparray = explode(
'_', $codelang);
9858 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9863 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
9869 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
9883 if (empty($countrycode)) {
9887 if (strtoupper($countrycode) ==
'MQ') {
9890 if (strtoupper($countrycode) ==
'SE') {
9893 if (strtoupper($countrycode) ==
'CH') {
9894 if ($mysoc->country_code ==
'FR') {
9897 if ($mysoc->country_code ==
'DE') {
9900 if ($mysoc->country_code ==
'IT') {
10082 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10083 if (in_array($buildprimarykeytotest, $locales)) {
10084 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10087 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10088 foreach ($locales as $locale) {
10089 $locale_language = locale_get_primary_language($locale);
10090 $locale_region = locale_get_region($locale);
10091 if (strtoupper($countrycode) == $locale_region) {
10093 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10097 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
10135 global $hookmanager, $db;
10137 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10138 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10139 $values = explode(
':', $value);
10142 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10147 $posstart = strpos($str,
'(');
10148 if ($posstart > 0) {
10149 $posend = strpos($str,
')');
10150 if ($posstart > 0) {
10151 $res1 = substr($str, $posstart + 1, $posend - $posstart -1);
10152 if (is_numeric($res1)) {
10153 $postab = (int) $res1;
10154 $values[1] =
'+' . substr($str, $posend + 1);
10158 if (count($values) == 6) {
10162 if ($values[0] != $type) {
10168 if ($filterorigmodule) {
10169 if (strpos($values[3],
'@')) {
10170 if ($filterorigmodule !=
'external') {
10174 if ($filterorigmodule !=
'core') {
10179 $langs->load($values[3]);
10181 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10183 $substitutionarray = array();
10188 $labeltemp = explode(
',', $values[2]);
10189 $label = $langs->trans($labeltemp[0]);
10191 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
10193 $classtoload = $labeltemp[1];
10194 if (class_exists($classtoload)) {
10195 $obj =
new $classtoload($db);
10196 $function = $labeltemp[3];
10197 if ($obj && $function && method_exists($obj, $function)) {
10198 $nbrec = $obj->$function($object->id, $obj);
10199 if (!empty($nbrec)) {
10200 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10207 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
10208 $newtab[1] = $label;
10209 $newtab[2] = str_replace(
'+',
'', $values[1]);
10214 } elseif (count($values) == 5) {
10215 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10217 if ($values[0] != $type) {
10221 if ($filterorigmodule) {
10222 if (strpos($values[3],
'@')) {
10223 if ($filterorigmodule !=
'external') {
10227 if ($filterorigmodule !=
'core') {
10232 $langs->load($values[3]);
10234 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10235 $substitutionarray = array();
10239 $label = $langs->trans($values[2]);
10242 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
10243 $newtab[1] = $label;
10244 $newtab[2] = str_replace(
'+',
'', $values[1]);
10248 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10249 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10250 if ($values[0] != $type) {
10253 $tabname = str_replace(
'-',
'', $values[1]);
10254 foreach ($head as $key => $val) {
10255 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
10257 if ($head[$key][2] == $tabname && $condition) {
10258 unset($head[$key]);
10267 if (!empty($hookmanager)) {
10268 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
10269 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters, $object);
10270 if ($reshook > 0) {
10271 $head = $hookmanager->resArray;
10273 $head = array_merge($head, $hookmanager->resArray);
10292 global $conf, $hookmanager, $user, $debugbar;
10294 global $micro_start_time;
10296 if ($zone ==
'private') {
10297 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
10299 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
10303 print
"\n<!-- A div to store page_y POST parameter -->\n";
10304 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
10306 $parameters = array();
10307 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
10308 if (empty($reshook)) {
10314 if (!empty($conf->use_javascript_ajax)) {
10315 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
10316 print
'<script>'.
"\n";
10317 print
'jQuery(document).ready(function() {'.
"\n";
10319 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
10321 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
10322 print
'jQuery("li.menuhider").click(function(event) {';
10323 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
10324 print
' console.log("We click on .menuhider");'.
"\n";
10325 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
10330 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"])))) {
10331 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
10332 $relativepathstring = $_SERVER[
"PHP_SELF"];
10334 if (constant(
'DOL_URL_ROOT')) {
10335 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
10337 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
10338 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
10340 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
10341 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
10343 if ($defkey !=
'_noquery_') {
10344 $tmpqueryarraytohave = explode(
'&', $defkey);
10346 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10347 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
10349 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
10353 if (!$foundintru) {
10362 foreach ($defval as $paramkey => $paramval) {
10364 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
10365 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
10366 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
10371 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
10372 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
10374 if ($defkey != '_noquery_') {
10375 $tmpqueryarraytohave = explode('&', $defkey);
10377 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10378 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
10379 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
10380 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
10384 if (!$foundintru) {
10387 //var_dump($defkey.'-'.$qualified);
10393 foreach ($defval as $paramkey => $paramval) {
10394 // Add property 'required' on input
10395 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10396 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10397 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
";
10398 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10399 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
10400 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
10403 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
10405 // If we submit the cancel button we remove the required attributes
10406 print 'jQuery("input[
name=\
'cancel\']").click(function() {
10407 console.log("We click on cancel button so removed all required attribute");
10408 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
10418 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
10420 print
"/* JS CODE TO ENABLE to add memory info */\n";
10421 print
'window.console && console.log("';
10425 print
'MAIN_OPTIMIZE_SPEED='.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED :
'off');
10426 if (!empty($micro_start_time)) {
10427 $micro_end_time = microtime(
true);
10428 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
10431 if (function_exists(
"memory_get_usage")) {
10432 print
' - Mem: '.memory_get_usage();
10434 if (function_exists(
"memory_get_peak_usage")) {
10435 print
' - Real mem peak: '.memory_get_peak_usage(
true);
10437 if (function_exists(
"zend_loader_file_encoded")) {
10438 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
10443 print
"\n".
'</script>'.
"\n";
10449 foreach ($tmptagarray as $tmptag) {
10451 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
10453 <!-- Global site tag (gtag.js) - Google Analytics -->
10454 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
10456 window.dataLayer = window.dataLayer || [];
10457 function gtag(){dataLayer.push(arguments);}
10458 gtag(\'js\', new Date());
10460 gtag(\'config\', \''.trim($tmptag).
'\');
10467 // Add Xdebug coverage of code
10468 if (defined('XDEBUGCOVERAGE
')) {
10469 print_r(xdebug_get_code_coverage());
10472 // Add DebugBar data
10473 if ($user->hasRight('debugbar
', 'read
') && is_object($debugbar)) {
10474 $debugbar['time
']->stopMeasure('pageaftermaster
');
10475 print '<!-- Output debugbar data -->
'."\n";
10476 $renderer = $debugbar->getRenderer();
10477 print $debugbar->getRenderer()->render();
10478 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
10480 print "<!-- Start of log output\n";
10481 //print '<div
class=
"hidden">
'."\n";
10482 foreach ($conf->logbuffer as $logline) {
10483 print $logline."<br>\n";
10485 //print '</div>
'."\n";
10486 print "End of log output -->\n";
10500function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10502 if (is_null($string)) {
10506 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10507 // This is a regex string
10508 $newdelimiter = $delimiter;
10510 // This is a simple string
10511 $newdelimiter = preg_quote($delimiter, '/
');
10514 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10516 foreach ($a as $s) { // each part
10518 if ($pos = strpos($s, $kv)) { // key/value delimiter
10519 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10520 } else { // key delimiter not found
10538function dol_set_focus($selector)
10540 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10541 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10552function dol_getmypid()
10554 if (!function_exists('getmypid
')) {
10555 return mt_rand(99900000, 99965535);
10557 return getmypid(); // May be a number on 64 bits (depending on OS)
10579function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10581 global $db, $langs;
10583 $value = trim($value);
10586 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10589 $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
10592 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10594 $crits = explode(' ', $value);
10596 if (!is_array($fields)) {
10597 $fields = array($fields);
10600 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10601 foreach ($crits as $crit) { // Loop on each AND criteria
10602 $crit = trim($crit);
10603 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10605 foreach ($fields as $field) {
10607 $tmpcrits = explode('|
', $crit);
10608 $i3 = 0; // count the nb of valid criteria added for this current field
10609 foreach ($tmpcrits as $tmpcrit) {
10610 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10613 $tmpcrit = trim($tmpcrit);
10615 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10618 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10621 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10622 if (!empty($reg[1])) {
10623 $operator = $reg[1];
10625 if ($newcrit != '') {
10626 $numnewcrit = price2num($newcrit);
10627 if (is_numeric($numnewcrit)) {
10628 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10630 $newres .= '1 = 2
'; // force false, we received a corrupted data
10632 $i3++; // a criteria was added to string
10635 $i2++; // a criteria for 1 more field was added to string
10636 } elseif ($mode == 2 || $mode == -2) {
10637 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10638 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10639 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10641 $newres .= ' OR
'.$field.' IS NULL
';
10643 $i2++; // a criteria for 1 more field was added to string
10644 } elseif ($mode == 3 || $mode == -3) {
10645 $tmparray = explode(',
', $crit);
10646 if (count($tmparray)) {
10648 foreach ($tmparray as $val) {
10651 $listofcodes .= ($listofcodes ? ',
' : '');
10652 $listofcodes .= "'".$db->escape($val)."'";
10655 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
10656 $i2++; // a criteria for 1 more field was added to string
10659 $newres .= ' OR
'.$field.' IS NULL
';
10661 } elseif ($mode == 4) {
10662 $tmparray = explode(',
', $crit);
10663 if (count($tmparray)) {
10665 foreach ($tmparray as $val) {
10668 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10669 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10670 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10671 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10673 $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)
10677 } else { // $mode=0
10678 $tmpcrits = explode('|
', $crit);
10679 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10680 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10681 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10684 $tmpcrit = trim($tmpcrit);
10686 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10687 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10689 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10692 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10693 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10695 $tmpcrit2 = $tmpcrit;
10700 if (preg_match('/^!/
', $tmpcrit)) {
10701 $tmps .= $field." NOT LIKE "; // ! as exclude character
10702 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10704 $tmps .= $field." LIKE ";
10708 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10710 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10712 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10714 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10717 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10721 $newres .= $tmpbefore;
10722 $newres .= $db->escape($tmpcrit2);
10723 $newres .= $tmpafter;
10725 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10726 $newres .= " OR ".$field." IS NULL)";
10733 $i2++; // a criteria for 1 more field was added to string
10738 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10742 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10753function showDirectDownloadLink($object)
10755 global $conf, $langs;
10758 $url = $object->getLastMainDocLink($object->element);
10760 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10762 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10763 $out .= ajax_autoselect("directdownloadlink", 0);
10765 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10779function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10781 $dirName = dirname($file);
10782 if ($dirName == '.
') {
10786 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10787 $fileName = basename($fileName);
10789 if (empty($extImgTarget)) {
10790 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10792 if (empty($extImgTarget)) {
10793 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10795 if (empty($extImgTarget)) {
10796 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10798 if (empty($extImgTarget)) {
10799 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10801 if (empty($extImgTarget)) {
10802 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10804 if (empty($extImgTarget)) {
10805 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10808 if (!$extImgTarget) {
10814 $subdir = 'thumbs/
';
10817 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10830function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10832 global $conf, $langs;
10834 if (empty($conf->use_javascript_ajax)) {
10838 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10840 if ($alldata == 1) {
10841 if ($isAllowedForPreview) {
10842 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));
10848 // old behavior, return a string
10849 if ($isAllowedForPreview) {
10850 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
10851 $title = $langs->trans("Preview");
10852 //$title = '%27-alert(document.domain)-%27
';
10853 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
10855 // 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.
10872function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
10875 $out = '<script nonce=
"'.getNonce().'">
10876 jQuery(document).ready(
function () {
10877 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
10881 if ($textonlink === 'image
') {
10882 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
10884 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
10897function dolIsAllowedForPreview($file)
10901 // Check .noexe extension in filename
10902 if (preg_match('/\.noexe$/i
', $file)) {
10906 // Check mime types
10907 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
10908 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
10909 $mime_preview[] = 'svg+xml
';
10911 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
10912 //$mime_preview[]='archive
';
10913 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
10914 if ($num_mime !== false) {
10918 // By default, not allowed for preview
10932function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
10935 $imgmime = 'other.png
';
10936 $famime = 'file-o
';
10939 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
10941 // Plain text files
10942 if (preg_match('/\.txt$/i
', $tmpfile)) {
10943 $mime = 'text/plain
';
10944 $imgmime = 'text.png
';
10945 $famime = 'file-alt
';
10946 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
10947 $mime = 'text/richtext
';
10948 $imgmime = 'text.png
';
10949 $famime = 'file-alt
';
10950 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
10951 $mime = 'text/csv
';
10952 $imgmime = 'text.png
';
10953 $famime = 'file-csv
';
10954 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
10955 $mime = 'text/tab-separated-values
';
10956 $imgmime = 'text.png
';
10957 $famime = 'file-alt
';
10958 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
10959 $mime = 'text/plain
';
10960 $imgmime = 'text.png
';
10961 $famime = 'file-alt
';
10962 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
10963 $mime = 'text/plain
';
10964 $imgmime = 'text.png
';
10966 $famime = 'file-alt
';
10967 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
10968 $mime = 'text/plain
';
10969 $imgmime = 'text.png
';
10971 $famime = 'file-alt
';
10972 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
10973 $mime = 'text/css
';
10974 $imgmime = 'css.png
';
10976 $famime = 'file-alt
';
10977 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
10978 $mime = 'text/plain
';
10979 $imgmime = 'text.png
';
10981 $famime = 'file-alt
';
10982 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
10983 $mime = 'text/plain
';
10984 $imgmime = 'text.png
';
10985 $famime = 'file-alt
';
10986 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
10987 $mime = 'text/html
';
10988 $imgmime = 'html.png
';
10990 $famime = 'file-alt
';
10991 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
10992 $mime = 'text/xml
';
10993 $imgmime = 'other.png
';
10995 $famime = 'file-alt
';
10996 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
10997 $mime = 'text/xml
';
10998 $imgmime = 'other.png
';
11000 $famime = 'file-alt
';
11001 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11002 $mime = 'text/plain
';
11003 $imgmime = 'text.png
';
11005 $famime = 'file-code
';
11006 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11007 $mime = 'text/plain
';
11008 $imgmime = 'text.png
';
11010 $famime = 'file-code
';
11011 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11012 $mime = 'text/plain
';
11013 $imgmime = 'text.png
';
11015 $famime = 'file-code
';
11016 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11017 $mime = 'text/plain
';
11018 $imgmime = 'text.png
';
11020 $famime = 'file-code
';
11021 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11022 $mime = 'text/plain
';
11023 $imgmime = 'text.png
';
11025 $famime = 'file-code
';
11026 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11027 $mime = 'text/plain
';
11028 $imgmime = 'text.png
';
11030 $famime = 'file-code
';
11031 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11032 $mime = 'text/plain
';
11033 $imgmime = 'php.png
';
11035 $famime = 'file-code
';
11036 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11037 $mime = 'text/plain
';
11038 $imgmime = 'php.png
';
11040 $famime = 'file-code
';
11041 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11042 $mime = 'text/plain
';
11043 $imgmime = 'pl.png
';
11045 $famime = 'file-code
';
11046 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11047 $mime = 'text/plain
';
11048 $imgmime = 'text.png
';
11050 $famime = 'file-code
';
11051 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11052 $mime = 'text/x-javascript
';
11053 $imgmime = 'jscript.png
';
11055 $famime = 'file-code
';
11056 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11057 $mime = 'application/vnd.oasis.opendocument.presentation
';
11058 $imgmime = 'ooffice.png
';
11059 $famime = 'file-powerpoint
';
11060 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11061 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11062 $imgmime = 'ooffice.png
';
11063 $famime = 'file-excel
';
11064 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11065 $mime = 'application/vnd.oasis.opendocument.text
';
11066 $imgmime = 'ooffice.png
';
11067 $famime = 'file-word
';
11068 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11069 $mime = 'application/msaccess
';
11070 $imgmime = 'mdb.png
';
11072 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11073 $mime = 'application/msword
';
11074 $imgmime = 'doc.png
';
11075 $famime = 'file-word
';
11076 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11077 $mime = 'application/msword
';
11078 $imgmime = 'doc.png
';
11079 $famime = 'file-word
';
11080 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11081 $mime = 'application/vnd.ms-excel
';
11082 $imgmime = 'xls.png
';
11083 $famime = 'file-excel
';
11084 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11085 $mime = 'application/vnd.ms-excel
';
11086 $imgmime = 'xls.png
';
11087 $famime = 'file-excel
';
11088 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11089 $mime = 'application/vnd.ms-excel
';
11090 $imgmime = 'xls.png
';
11091 $famime = 'file-excel
';
11092 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11093 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11094 $imgmime = 'xls.png
';
11095 $famime = 'file-excel
';
11096 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11097 $mime = 'application/vnd.ms-powerpoint
';
11098 $imgmime = 'ppt.png
';
11099 $famime = 'file-powerpoint
';
11100 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11101 $mime = 'application/x-mspowerpoint
';
11102 $imgmime = 'ppt.png
';
11103 $famime = 'file-powerpoint
';
11104 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11105 $mime = 'application/pdf
';
11106 $imgmime = 'pdf.png
';
11107 $famime = 'file-pdf
';
11108 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11109 $mime = 'text/x-bat
';
11110 $imgmime = 'script.png
';
11112 $famime = 'file-code
';
11113 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11114 $mime = 'text/x-sh
';
11115 $imgmime = 'script.png
';
11117 $famime = 'file-code
';
11118 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11119 $mime = 'text/x-ksh
';
11120 $imgmime = 'script.png
';
11122 $famime = 'file-code
';
11123 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11124 $mime = 'text/x-bash
';
11125 $imgmime = 'script.png
';
11127 $famime = 'file-code
';
11128 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11129 $mime = 'image/x-icon
';
11130 $imgmime = 'image.png
';
11131 $famime = 'file-image
';
11132 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11133 $mime = 'image/jpeg
';
11134 $imgmime = 'image.png
';
11135 $famime = 'file-image
';
11136 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11137 $mime = 'image/png
';
11138 $imgmime = 'image.png
';
11139 $famime = 'file-image
';
11140 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11141 $mime = 'image/gif
';
11142 $imgmime = 'image.png
';
11143 $famime = 'file-image
';
11144 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11145 $mime = 'image/bmp
';
11146 $imgmime = 'image.png
';
11147 $famime = 'file-image
';
11148 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11149 $mime = 'image/tiff
';
11150 $imgmime = 'image.png
';
11151 $famime = 'file-image
';
11152 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11153 $mime = 'image/svg+xml
';
11154 $imgmime = 'image.png
';
11155 $famime = 'file-image
';
11156 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11157 $mime = 'image/webp
';
11158 $imgmime = 'image.png
';
11159 $famime = 'file-image
';
11160 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11161 $mime = 'text/calendar
';
11162 $imgmime = 'other.png
';
11163 $famime = 'file-alt
';
11164 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11165 $mime = 'text/calendar
';
11166 $imgmime = 'other.png
';
11167 $famime = 'file-alt
';
11168 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11169 $mime = 'application/x-bittorrent
';
11170 $imgmime = 'other.png
';
11171 $famime = 'file-o
';
11172 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11174 $imgmime = 'audio.png
';
11175 $famime = 'file-audio
';
11176 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11177 $mime = 'video/mp4
';
11178 $imgmime = 'video.png
';
11179 $famime = 'file-video
';
11180 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11181 $mime = 'video/ogg
';
11182 $imgmime = 'video.png
';
11183 $famime = 'file-video
';
11184 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11185 $mime = 'video/webm
';
11186 $imgmime = 'video.png
';
11187 $famime = 'file-video
';
11188 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11189 $mime = 'video/x-msvideo
';
11190 $imgmime = 'video.png
';
11191 $famime = 'file-video
';
11192 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11193 $mime = 'video/divx
';
11194 $imgmime = 'video.png
';
11195 $famime = 'file-video
';
11196 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
11197 $mime = 'video/xvid
';
11198 $imgmime = 'video.png
';
11199 $famime = 'file-video
';
11200 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
11202 $imgmime = 'video.png
';
11203 $famime = 'file-video
';
11204 } elseif (preg_match('/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
11205 // application/xxx where zzz is zip, ...
11207 $imgmime = 'archive.png
';
11208 $famime = 'file-archive
';
11209 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
11210 $mime = 'application/octet-stream
';
11211 $imgmime = 'other.png
';
11212 $famime = 'file-o
';
11213 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
11215 $imgmime = 'library.png
';
11216 $famime = 'file-o
';
11217 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
11219 $imgmime = 'error.png
';
11220 $famime = 'file-alt
';
11223 // Return mimetype string
11224 switch ((int) $mode) {
11226 $tmp = explode('/
', $mime);
11227 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
11249function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
11253 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
11255 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
11257 if (is_null($dictvalues)) {
11258 $dictvalues = array();
11260 $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
11261 if ($checkentity) {
11262 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
11265 $resql = $db->query($sql);
11267 while ($obj = $db->fetch_object($resql)) {
11268 $dictvalues[$obj->$rowidfield] = $obj;
11274 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
11277 if (!empty($dictvalues[$id])) {
11279 $tmp = $dictvalues[$id];
11280 return (property_exists($tmp, $field) ? $tmp->$field :
'');
11295 $stringcolor = str_replace(
'#',
'', $stringcolor);
11297 if (!empty($stringcolor)) {
11299 $tmp = explode(
',', $stringcolor);
11300 if (count($tmp) > 1) {
11305 $hexr = $stringcolor[0].$stringcolor[1];
11306 $hexg = $stringcolor[2].$stringcolor[3];
11307 $hexb = $stringcolor[4].$stringcolor[5];
11308 $r = hexdec($hexr);
11309 $g = hexdec($hexg);
11310 $b = hexdec($hexb);
11312 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
11313 if ($bright > 0.6) {
11334 if (empty($menuentry[
'enabled'])) {
11337 if ($type_user && $menuentry[
'module']) {
11338 $tmploops = explode(
'|', $menuentry[
'module']);
11340 foreach ($tmploops as $tmploop) {
11341 if (in_array($tmploop, $listofmodulesforexternal)) {
11350 if (!$menuentry[
'perms'] && $type_user) {
11356 if (!$menuentry[
'perms']) {
11371 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
11385function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
11388 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
11391 if (empty($html)) {
11395 if (!empty($url)) {
11396 $attr[
'href'] = $url;
11399 if ($mode ===
'dot') {
11400 $attr[
'class'] .=
' classfortooltip';
11401 $attr[
'title'] = $html;
11402 $attr[
'aria-label'] = $label;
11407 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11408 foreach ($params[
'attr'] as $key => $value) {
11409 if ($key ==
'class') {
11410 $attr[
'class'] .=
' '.$value;
11411 } elseif ($key ==
'classOverride') {
11412 $attr[
'class'] = $value;
11414 $attr[$key] = $value;
11422 $attr = array_map(
'dol_escape_htmltag', $attr);
11424 $TCompiledAttr = array();
11425 foreach ($attr as $key => $value) {
11426 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11429 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
11431 $tag = !empty($url) ?
'a' :
'span';
11433 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11449function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11454 $dolGetBadgeParams = array();
11456 if (!empty($params[
'badgeParams'])) {
11457 $dolGetBadgeParams = $params[
'badgeParams'];
11461 if ($displayMode == 0) {
11462 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11463 } elseif ($displayMode == 1) {
11464 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11468 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11469 $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>' :
'');
11472 if (!empty($conf->dol_optimize_smallscreen)) {
11473 if ($displayMode == 0) {
11475 } elseif ($displayMode == 4) {
11477 } elseif ($displayMode == 6) {
11483 $statusImg = array(
11484 'status0' =>
'statut0',
11485 'status1' =>
'statut1',
11486 'status2' =>
'statut2',
11487 'status3' =>
'statut3',
11488 'status4' =>
'statut4',
11489 'status5' =>
'statut5',
11490 'status6' =>
'statut6',
11491 'status7' =>
'statut7',
11492 'status8' =>
'statut8',
11493 'status9' =>
'statut9'
11496 if (!empty($statusImg[$statusType])) {
11497 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11499 $htmlImg =
img_picto($statusLabel, $statusType);
11502 if ($displayMode === 2) {
11503 $return = $htmlImg.
' '.$htmlLabelShort;
11504 } elseif ($displayMode === 3) {
11505 $return = $htmlImg;
11506 } elseif ($displayMode === 4) {
11507 $return = $htmlImg.
' '.$htmlLabel;
11508 } elseif ($displayMode === 5) {
11509 $return = $htmlLabelShort.
' '.$htmlImg;
11511 $return = $htmlLabel.
' '.$htmlImg;
11515 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11517 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11518 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11520 if ($displayMode == 3) {
11521 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11522 } elseif ($displayMode === 5) {
11523 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11525 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11567function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11569 global $hookmanager, $action, $object, $langs;
11572 if (is_array($url)) {
11574 foreach ($url as $key => $subbutton) {
11575 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
11582 if (count($url) > 1) {
11583 $out .=
'<div class="dropdown inline-block dropdown-holder">';
11584 $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>';
11585 $out .=
'<div class="dropdown-content">';
11586 foreach ($url as $subbutton) {
11587 if (!empty($subbutton[
'lang'])) {
11588 $langs->load($subbutton[
'lang']);
11590 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11591 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], array(
'isDropDown' =>
true));
11596 foreach ($url as $subbutton) {
11597 if (!empty($subbutton[
'lang'])) {
11598 $langs->load($subbutton[
'lang']);
11600 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11601 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm']);
11610 if (!empty($params[
'isDropdown'])) {
11611 $class =
"dropdown-item";
11613 $class =
'butAction';
11614 if ($actionType ==
'danger' || $actionType ==
'delete') {
11615 $class =
'butActionDelete';
11616 if (!empty($url) && strpos($url,
'token=') ===
false) {
11617 $url .=
'&token='.newToken();
11623 'href' => empty($url) ?
'' : $url,
11627 if (empty($text)) {
11629 $attr[
'title'] =
'';
11631 $attr[
'title'] = $label;
11632 $attr[
'aria-label'] = $label;
11635 if (empty($userRight)) {
11636 $attr[
'class'] =
'butActionRefused';
11637 $attr[
'href'] =
'';
11638 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11646 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11647 foreach ($params[
'attr'] as $key => $value) {
11648 if ($key ==
'class') {
11649 $attr[
'class'] .=
' '.$value;
11650 } elseif ($key ==
'classOverride') {
11651 $attr[
'class'] = $value;
11653 $attr[$key] = $value;
11659 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11660 $attr[
'class'].=
' classfortooltip';
11664 if ($userRight && !empty($params[
'confirm'])) {
11665 if (!is_array($params[
'confirm'])) {
11666 $params[
'confirm'] = array();
11669 if (empty($params[
'confirm'][
'url'])) {
11670 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11674 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11675 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11676 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11677 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11678 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11679 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11680 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11682 $attr[
'class'].=
' butActionConfirm';
11685 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11686 unset($attr[
'href']);
11690 $attr = array_map(
'dol_escape_htmltag', $attr);
11692 $TCompiledAttr = array();
11693 foreach ($attr as $key => $value) {
11694 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11697 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11699 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11702 $parameters = array(
11703 'TCompiledAttr' => $TCompiledAttr,
11704 'compiledAttributes' => $compiledAttributes,
11709 'actionType' => $actionType,
11712 'userRight' => $userRight,
11713 'params' => $params
11716 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11717 if ($reshook < 0) {
11721 if (empty($reshook)) {
11723 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11725 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11728 return $hookmanager->resPrint;
11740 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11752 if (!empty($fieldValidationErrorMsg)) {
11753 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11754 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11773function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11775 global $langs, $conf, $user;
11778 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
11782 $class =
'btnTitle';
11783 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11784 $class .=
' btnTitlePlus';
11786 $useclassfortooltip = 1;
11788 if (!empty($params[
'morecss'])) {
11789 $class .=
' '.$params[
'morecss'];
11794 'href' => empty($url) ?
'' : $url
11797 if (!empty($helpText)) {
11799 } elseif (empty($attr[
'title']) && $label) {
11800 $attr[
'title'] = $label;
11801 $useclassfortooltip = 0;
11804 if ($status == 2) {
11805 $attr[
'class'] .=
' btnTitleSelected';
11806 } elseif ($status <= 0) {
11807 $attr[
'class'] .=
' refused';
11809 $attr[
'href'] =
'';
11811 if ($status == -1) {
11812 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11813 } elseif ($status == 0) {
11814 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11818 if (!empty($attr[
'title']) && $useclassfortooltip) {
11819 $attr[
'class'] .=
' classfortooltip';
11827 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11828 foreach ($params[
'attr'] as $key => $value) {
11829 if ($key ==
'class') {
11830 $attr[
'class'] .=
' '.$value;
11831 } elseif ($key ==
'classOverride') {
11832 $attr[
'class'] = $value;
11834 $attr[$key] = $value;
11839 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11840 unset($attr[
'href']);
11846 $attr = array_map(
'dol_escape_htmltag', $attr);
11848 $TCompiledAttr = array();
11849 foreach ($attr as $key => $value) {
11850 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11853 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11855 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11857 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11858 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11859 if (!empty($params[
'forcenohideoftext'])) {
11860 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11862 $button .=
'</'.$tag.
'>';
11879 global $conf, $db, $hookmanager;
11885 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11888 $module = $element_type;
11889 $element = $element_type;
11890 $subelement = $element_type;
11891 $table_element = $element_type;
11894 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11895 $element = $subelement = $regs[1];
11896 $module = $regs[2];
11901 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11902 $module = $element = $regs[1];
11903 $subelement = $regs[2];
11907 if ($element_type ==
"action" || $element_type ==
"actioncomm") {
11908 $classpath =
'comm/action/class';
11909 $subelement =
'Actioncomm';
11910 $module =
'agenda';
11911 $table_element =
'actioncomm';
11912 } elseif ($element_type ==
'cronjob') {
11913 $classpath =
'cron/class';
11915 $table_element =
'cron';
11916 } elseif ($element_type ==
'adherent_type') {
11917 $classpath =
'adherents/class';
11918 $classfile =
'adherent_type';
11919 $module =
'adherent';
11920 $subelement =
'adherent_type';
11921 $classname =
'AdherentType';
11922 $table_element =
'adherent_type';
11923 } elseif ($element_type ==
'bank_account') {
11924 $classpath =
'compta/bank/class';
11926 $classfile =
'account';
11927 $classname =
'Account';
11928 } elseif ($element_type ==
'category') {
11929 $classpath =
'categories/class';
11930 $module =
'categorie';
11931 $subelement =
'categorie';
11932 $table_element =
'categorie';
11933 } elseif ($element_type ==
'contact') {
11934 $classpath =
'contact/class';
11935 $classfile =
'contact';
11936 $module =
'societe';
11937 $subelement =
'contact';
11938 $table_element =
'socpeople';
11939 } elseif ($element_type ==
'inventory') {
11940 $module =
'product';
11941 $classpath =
'product/inventory/class';
11942 } elseif ($element_type ==
'stock' || $element_type ==
'entrepot') {
11944 $classpath =
'product/stock/class';
11945 $classfile =
'entrepot';
11946 $classname =
'Entrepot';
11947 $table_element =
'entrepot';
11948 } elseif ($element_type ==
'project') {
11949 $classpath =
'projet/class';
11950 $module =
'projet';
11951 $table_element =
'projet';
11952 } elseif ($element_type ==
'project_task') {
11953 $classpath =
'projet/class';
11954 $module =
'projet';
11955 $subelement =
'task';
11956 $table_element =
'projet_task';
11957 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11958 $classpath =
'compta/facture/class';
11959 $module =
'facture';
11960 $subelement =
'facture';
11961 $table_element =
'facture';
11962 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11963 $classpath =
'commande/class';
11964 $module =
'commande';
11965 $subelement =
'commande';
11966 $table_element =
'commande';
11967 } elseif ($element_type ==
'propal') {
11968 $classpath =
'comm/propal/class';
11969 $table_element =
'propal';
11970 } elseif ($element_type ==
'shipping') {
11971 $classpath =
'expedition/class';
11972 $classfile =
'expedition';
11973 $classname =
'Expedition';
11974 $module =
'expedition';
11975 $table_element =
'expedition';
11976 } elseif ($element_type ==
'supplier_proposal') {
11977 $classpath =
'supplier_proposal/class';
11978 $module =
'supplier_proposal';
11979 $element =
'supplierproposal';
11980 $classfile =
'supplier_proposal';
11981 $subelement =
'supplierproposal';
11982 } elseif ($element_type ==
'shipping') {
11983 $classpath =
'expedition/class';
11984 $subelement =
'expedition';
11985 $module =
'expedition_bon';
11986 } elseif ($element_type ==
'delivery') {
11987 $classpath =
'delivery/class';
11988 $subelement =
'delivery';
11989 $module =
'expedition';
11990 } elseif ($element_type ==
'contract') {
11991 $classpath =
'contrat/class';
11992 $module =
'contrat';
11993 $subelement =
'contrat';
11994 $table_element =
'contract';
11995 } elseif ($element_type ==
'mailing') {
11996 $classpath =
'comm/mailing/class';
11997 $module =
'mailing';
11998 $classfile =
'mailing';
11999 $classname =
'Mailing';
12001 } elseif ($element_type ==
'member') {
12002 $classpath =
'adherents/class';
12003 $module =
'adherent';
12004 $subelement =
'adherent';
12005 $table_element =
'adherent';
12006 } elseif ($element_type ==
'usergroup') {
12007 $classpath =
'user/class';
12009 } elseif ($element_type ==
'mo') {
12010 $classpath =
'mrp/class';
12015 $table_element =
'mrp_mo';
12016 } elseif ($element_type ==
'cabinetmed_cons') {
12017 $classpath =
'cabinetmed/class';
12018 $module =
'cabinetmed';
12019 $subelement =
'cabinetmedcons';
12020 $table_element =
'cabinetmedcons';
12021 } elseif ($element_type ==
'fichinter') {
12022 $classpath =
'fichinter/class';
12023 $module =
'ficheinter';
12024 $subelement =
'fichinter';
12025 $table_element =
'fichinter';
12026 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
12027 $classpath =
'resource/class';
12028 $module =
'resource';
12029 $subelement =
'dolresource';
12030 $table_element =
'resource';
12031 } elseif ($element_type ==
'propaldet') {
12032 $classpath =
'comm/propal/class';
12033 $module =
'propal';
12034 $subelement =
'propaleligne';
12035 } elseif ($element_type ==
'opensurvey_sondage') {
12036 $classpath =
'opensurvey/class';
12037 $module =
'opensurvey';
12038 $subelement =
'opensurveysondage';
12039 } elseif ($element_type ==
'order_supplier') {
12040 $classpath =
'fourn/class';
12041 $module =
'fournisseur';
12042 $classfile =
'fournisseur.commande';
12043 $element =
'order_supplier';
12045 $classname =
'CommandeFournisseur';
12046 $table_element =
'commande_fournisseur';
12047 } elseif ($element_type ==
'commande_fournisseurdet') {
12048 $classpath =
'fourn/class';
12049 $module =
'fournisseur';
12050 $classfile =
'fournisseur.commande';
12051 $element =
'commande_fournisseurdet';
12053 $classname =
'CommandeFournisseurLigne';
12054 $table_element =
'commande_fournisseurdet';
12055 } elseif ($element_type ==
'invoice_supplier') {
12056 $classpath =
'fourn/class';
12057 $module =
'fournisseur';
12058 $classfile =
'fournisseur.facture';
12059 $element =
'invoice_supplier';
12061 $classname =
'FactureFournisseur';
12062 $table_element =
'facture_fourn';
12063 } elseif ($element_type ==
"service") {
12064 $classpath =
'product/class';
12065 $subelement =
'product';
12066 $table_element =
'product';
12067 } elseif ($element_type ==
'salary') {
12068 $classpath =
'salaries/class';
12069 $module =
'salaries';
12070 } elseif ($element_type ==
'payment_salary') {
12071 $classpath =
'salaries/class';
12072 $classfile =
'paymentsalary';
12073 $classname =
'PaymentSalary';
12074 $module =
'salaries';
12075 } elseif ($element_type ==
'productlot') {
12076 $module =
'productbatch';
12077 $classpath =
'product/stock/class';
12078 $classfile =
'productlot';
12079 $classname =
'Productlot';
12080 $element =
'productlot';
12082 $table_element =
'product_lot';
12083 } elseif ($element_type ==
'websitepage') {
12084 $classpath =
'website/class';
12085 $classfile =
'websitepage';
12086 $classname =
'Websitepage';
12087 $module =
'website';
12088 $subelement =
'websitepage';
12089 $table_element =
'website_page';
12090 } elseif ($element_type ==
'fiscalyear') {
12091 $classpath =
'core/class';
12092 $module =
'accounting';
12093 $subelement =
'fiscalyear';
12094 } elseif ($element_type ==
'chargesociales') {
12095 $classpath =
'compta/sociales/class';
12097 $table_element =
'chargesociales';
12098 } elseif ($element_type ==
'tva') {
12099 $classpath =
'compta/tva/class';
12102 $table_element =
'tva';
12103 } elseif ($element_type ==
'emailsenderprofile') {
12105 $classpath =
'core/class';
12106 $classfile =
'emailsenderprofile';
12107 $classname =
'EmailSenderProfile';
12108 $table_element =
'c_email_senderprofile';
12110 } elseif ($element_type ==
'ccountry') {
12112 $classpath =
'core/class';
12113 $classfile =
'ccountry';
12114 $classname =
'Ccountry';
12115 $table_element =
'c_country';
12119 if (empty($classfile)) {
12120 $classfile = strtolower($subelement);
12122 if (empty($classname)) {
12123 $classname = ucfirst($subelement);
12125 if (empty($classpath)) {
12126 $classpath = $module.
'/class';
12132 if ($module && isset($conf->$module)) {
12133 if (!empty($conf->$module->multidir_output[$conf->entity])) {
12134 $dir_output = $conf->$module->multidir_output[$conf->entity];
12135 } elseif (!empty($conf->$module->output[$conf->entity])) {
12136 $dir_output = $conf->$module->output[$conf->entity];
12137 } elseif (!empty($conf->$module->dir_output)) {
12138 $dir_output = $conf->$module->dir_output;
12143 if ($element ==
'order_supplier') {
12144 $dir_output = $conf->fournisseur->commande->dir_output;
12145 } elseif ($element ==
'invoice_supplier') {
12146 $dir_output = $conf->fournisseur->facture->dir_output;
12148 $dir_output .= $subdir;
12150 $elementProperties = array(
12151 'module' => $module,
12152 'element' => $element,
12153 'table_element' => $table_element,
12154 'subelement' => $subelement,
12155 'classpath' => $classpath,
12156 'classfile' => $classfile,
12157 'classname' => $classname,
12158 'dir_output' => $dir_output
12163 if (!is_object($hookmanager)) {
12164 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
12167 $hookmanager->initHooks(array(
'elementproperties'));
12171 $parameters = array(
12172 'elementType' => $element_type,
12173 'elementProperties' => $elementProperties
12176 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
12179 $elementProperties = $hookmanager->resArray;
12180 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
12181 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
12185 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
12186 unset($hookmanager->contextarray[$key]);
12189 return $elementProperties;
12210 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
12215 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
12217 $ismodenabled = isModEnabled($element_prop[
'module']);
12222 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
12223 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
12225 if (class_exists($element_prop[
'classname'])) {
12226 $classname = $element_prop[
'classname'];
12227 $objecttmp =
new $classname($db);
12229 if ($element_id > 0 || !empty($element_ref)) {
12230 $ret = $objecttmp->fetch($element_id, $element_ref);
12232 if (empty($objecttmp->module)) {
12233 $objecttmp->module = $element_prop[
'module'];
12256 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)) {
12272 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
12284 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
12296 if (empty($conf->cache[
'nonce'])) {
12300 return $conf->cache[
'nonce'];
12320 print
'<div class="div-table-responsive-no-min">';
12321 print
'<table class="noborder centpercent">';
12322 print
'<tr class="liste_titre">';
12324 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
12326 print $langs->trans($header);
12329 if ($number > -1) {
12333 if (!empty($link)) {
12334 if (!empty($arguments)) {
12335 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12337 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12341 if ($number > -1) {
12342 print
'<span class="badge">'.$number.
'</span>';
12345 if (!empty($link)) {
12351 if ($number < 0 && !empty($link)) {
12352 print
'<th class="right">';
12354 if (!empty($arguments)) {
12355 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12357 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12360 print $langs->trans(
"FullList");
12381 if ($addLineBreak) {
12397function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
12402 print
'<tr class="oddeven">';
12403 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
12408 if ($nbofloop === 0) {
12414 $colspan = $tableColumnCount;
12415 } elseif ($num > $nbofloop) {
12416 $colspan = $tableColumnCount;
12418 $colspan = $tableColumnCount - 1;
12421 if ($extraRightColumn) {
12425 print
'<tr class="liste_total">';
12427 if ($nbofloop > 0 && $num > $nbofloop) {
12428 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
12430 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
12431 print
'<td class="right centpercent">'.price($total).
'</td>';
12434 if ($extraRightColumn) {
12451 if ($method == -1) {
12462 while (ob_get_level()) {
12467 if ($method == 0) {
12468 readfile($fullpath_original_file_osencoded);
12469 } elseif ($method == 1) {
12471 $handle = fopen($fullpath_original_file_osencoded,
"rb");
12472 while (!feof($handle)) {
12473 print fread($handle, 8192);
12476 } elseif ($method == 2) {
12478 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
12479 $handle2 = fopen(
"php://output",
"wb");
12480 stream_copy_to_stream($handle1, $handle2);
12505 if ($texttoshow ===
'none') {
12506 $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>';
12507 } elseif ($texttoshow) {
12508 $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>';
12510 $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>';
12525 $result = json_decode($stringtodecode);
12526 if ($result ===
null) {
12527 $result = unserialize($stringtodecode);
12549 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12550 $filter =
'(' . $filter .
')';
12553 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12559 return 'Filter syntax error - '.$errorstr;
12564 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12565 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12567 if (preg_match(
'/[^\(\)]/', $t)) {
12568 $errorstr =
'Bad syntax of the search string';
12572 return 'Filter syntax error - '.$errorstr;
12576 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12590 $tmp = $sqlfilters;
12592 $nb = strlen($tmp);
12595 if ($tmp[$i] ==
'(') {
12598 if ($tmp[$i] ==
')') {
12601 if ($counter < 0) {
12602 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12621 if (empty($matches[1])) {
12624 $tmp = explode(
':', $matches[1]);
12625 if (count($tmp) < 3) {
12645 if (empty($matches[1])) {
12648 $tmp = explode(
':', $matches[1]);
12649 if (count($tmp) < 3) {
12653 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12655 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12658 'NOTLIKE' =>
'NOT LIKE',
12659 'ISNOT' =>
'IS NOT',
12660 'NOTIN' =>
'NOT IN',
12664 if (array_key_exists($operator, $realOperator)) {
12665 $operator = $realOperator[$operator];
12669 $tmpescaped = $tmp[2];
12672 if ($operator ==
'IN' || $operator ==
'NOT IN') {
12674 $tmpescaped2 =
'(';
12676 $tmpelemarray = explode(
',', $tmpescaped);
12677 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
12679 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
12680 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
12682 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
12685 $tmpescaped2 .= join(
',', $tmpelemarray);
12686 $tmpescaped2 .=
')';
12688 $tmpescaped = $tmpescaped2;
12689 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12690 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12691 $tmpescaped = $regbis[1];
12694 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12695 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12696 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12698 if (strtoupper($tmpescaped) ==
'NULL') {
12699 $tmpescaped =
'NULL';
12700 } elseif (is_int($tmpescaped)) {
12701 $tmpescaped = (int) $tmpescaped;
12703 $tmpescaped = (float) $tmpescaped;
12707 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12722 global $conf, $langs;
12724 $out =
'<!-- timeline icon -->'.
"\n";
12725 $iconClass =
'fa fa-comments';
12730 if ($histo[$key][
'percent'] == -1) {
12731 $colorClass =
'timeline-icon-not-applicble';
12732 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12733 } elseif ($histo[$key][
'percent'] == 0) {
12734 $colorClass =
'timeline-icon-todo';
12735 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12736 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12737 $colorClass =
'timeline-icon-in-progress';
12738 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12739 } elseif ($histo[$key][
'percent'] >= 100) {
12740 $colorClass =
'timeline-icon-done';
12741 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12744 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12745 $iconClass =
'fa fa-ticket';
12746 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12747 $iconClass =
'fa fa-pencilxxx';
12748 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12749 $iconClass =
'fa fa-comments';
12750 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12751 $iconClass =
'fa fa-mask';
12753 if ($actionstatic->type_picto) {
12754 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12756 if ($actionstatic->type_code ==
'AC_RDV') {
12757 $iconClass =
'fa fa-handshake';
12758 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12759 $iconClass =
'fa fa-phone';
12760 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12761 $iconClass =
'fa fa-fax';
12762 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12763 $iconClass =
'fa fa-envelope';
12764 } elseif ($actionstatic->type_code ==
'AC_INT') {
12765 $iconClass =
'fa fa-shipping-fast';
12766 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12767 $iconClass =
'fa fa-robot';
12768 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12769 $iconClass =
'fa fa-robot';
12774 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12788 $documents = array();
12790 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12791 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12792 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12794 $sql .=
' ORDER BY ecm.position ASC';
12796 $resql = $db->query($sql);
12798 if ($db->num_rows($resql)) {
12799 while ($obj = $db->fetch_object($resql)) {
12800 $documents[$obj->id] = $obj;
12827function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12829 global $user, $conf;
12832 global $param, $massactionbutton;
12837 if (!is_object($filterobj) && !is_object($objcon)) {
12845 $sortfield_list = explode(
',', $sortfield);
12846 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12847 $sortfield_new_list = array();
12848 foreach ($sortfield_list as $sortfield_value) {
12849 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12851 $sortfield_new = implode(
',', $sortfield_new_list);
12853 if (isModEnabled(
'agenda')) {
12855 if (is_object($objcon) && $objcon->id > 0) {
12856 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12858 $sql =
"SELECT a.id, a.label as label,";
12860 $sql .=
" a.datep as dp,";
12861 $sql .=
" a.note as message,";
12862 $sql .=
" a.datep2 as dp2,";
12863 $sql .=
" a.percent as percent, 'action' as type,";
12864 $sql .=
" a.fk_element, a.elementtype,";
12865 $sql .=
" a.fk_contact,";
12866 $sql .=
" a.email_from as msg_from,";
12867 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12868 $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";
12869 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12870 $sql .=
", sp.lastname, sp.firstname";
12871 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12872 $sql .=
", m.lastname, m.firstname";
12873 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12875 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12877 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12879 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12881 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12884 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12885 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12886 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12888 $force_filter_contact =
false;
12889 if (is_object($objcon) && $objcon->id > 0) {
12890 $force_filter_contact =
true;
12891 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12892 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12895 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12896 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12897 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12898 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12899 $sql .=
" ON er.resource_type = 'dolresource'";
12900 $sql .=
" AND er.element_id = a.id";
12901 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12902 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12903 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12904 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12905 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12906 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12907 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12908 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12909 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12910 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12911 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12912 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12913 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12916 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12917 if ($force_filter_contact ===
false) {
12918 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12919 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12920 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12921 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12922 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12923 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12924 if ($filterobj->id) {
12925 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12927 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12928 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12929 if ($filterobj->id) {
12930 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12932 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12933 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12934 if ($filterobj->id) {
12935 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12937 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12938 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12939 if ($filterobj->id) {
12940 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12942 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12943 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12944 if ($filterobj->id) {
12945 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12947 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12948 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12949 if ($filterobj->id) {
12950 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12956 if (!empty($actioncode)) {
12958 if ($actioncode ==
'AC_NON_AUTO') {
12959 $sql .=
" AND c.type != 'systemauto'";
12960 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12961 $sql .=
" AND c.type = 'systemauto'";
12963 if ($actioncode ==
'AC_OTH') {
12964 $sql .=
" AND c.type != 'systemauto'";
12965 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12966 $sql .=
" AND c.type = 'systemauto'";
12970 if ($actioncode ==
'AC_NON_AUTO') {
12971 $sql .=
" AND c.type != 'systemauto'";
12972 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12973 $sql .=
" AND c.type = 'systemauto'";
12975 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
12979 if ($donetodo ==
'todo') {
12980 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
12981 } elseif ($donetodo ==
'done') {
12982 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
12984 if (is_array($filters) && $filters[
'search_agenda_label']) {
12985 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
12990 if (isModEnabled(
'mailing') && !empty($objcon->email)
12991 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
12992 $langs->load(
"mails");
12994 $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";
12995 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
12996 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
12997 $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";
12998 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12999 $sql2 .=
", '' as lastname, '' as firstname";
13000 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13001 $sql2 .=
", '' as lastname, '' as firstname";
13002 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13003 $sql2 .=
", '' as ref";
13004 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13005 $sql2 .=
", '' as ref";
13006 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13007 $sql2 .=
", '' as ref";
13009 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
13010 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
13011 $sql2 .=
" AND mc.statut = 1";
13012 $sql2 .=
" AND u.rowid = m.fk_user_valid";
13013 $sql2 .=
" AND mc.fk_mailing=m.rowid";
13016 if (!empty($sql) && !empty($sql2)) {
13017 $sql = $sql.
" UNION ".$sql2;
13018 } elseif (empty($sql) && !empty($sql2)) {
13024 $sql .= $db->order($sortfield_new, $sortorder);
13026 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
13027 $resql = $db->query($sql);
13030 $num = $db->num_rows($resql);
13032 while ($i < $num) {
13033 $obj = $db->fetch_object($resql);
13035 if ($obj->type ==
'action') {
13037 $contactaction->id = $obj->id;
13038 $result = $contactaction->fetchResources();
13041 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
13047 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
13048 $tododone =
'todo';
13051 $histo[$numaction] = array(
13052 'type'=>$obj->type,
13053 'tododone'=>$tododone,
13055 'datestart'=>$db->jdate($obj->dp),
13056 'dateend'=>$db->jdate($obj->dp2),
13057 'note'=>$obj->label,
13058 'message'=>$obj->message,
13059 'percent'=>$obj->percent,
13061 'userid'=>$obj->user_id,
13062 'login'=>$obj->user_login,
13063 'userfirstname'=>$obj->user_firstname,
13064 'userlastname'=>$obj->user_lastname,
13065 'userphoto'=>$obj->user_photo,
13066 'msg_from'=>$obj->msg_from,
13068 'contact_id'=>$obj->fk_contact,
13069 'socpeopleassigned' => $contactaction->socpeopleassigned,
13070 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
13071 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
13072 'fk_element'=>$obj->fk_element,
13073 'elementtype'=>$obj->elementtype,
13075 'acode'=>$obj->acode,
13076 'alabel'=>$obj->alabel,
13077 'libelle'=>$obj->alabel,
13078 'apicto'=>$obj->apicto
13081 $histo[$numaction] = array(
13082 'type'=>$obj->type,
13083 'tododone'=>
'done',
13085 'datestart'=>$db->jdate($obj->dp),
13086 'dateend'=>$db->jdate($obj->dp2),
13087 'note'=>$obj->label,
13088 'message'=>$obj->message,
13089 'percent'=>$obj->percent,
13090 'acode'=>$obj->acode,
13092 'userid'=>$obj->user_id,
13093 'login'=>$obj->user_login,
13094 'userfirstname'=>$obj->user_firstname,
13095 'userlastname'=>$obj->user_lastname,
13096 'userphoto'=>$obj->user_photo
13111 if (!isModEnabled(
'agenda')) {
13112 $langs->loadLangs(array(
"admin",
"errors"));
13113 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
13116 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
13117 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
13119 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
13120 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
13121 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
13122 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
13127 $userstatic =
new User($db);
13128 $contactstatic =
new Contact($db);
13129 $userGetNomUrlCache = array();
13130 $contactGetNomUrlCache = array();
13132 $out .=
'<div class="filters-container" >';
13133 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
13134 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
13136 if ($objcon && get_class($objcon) ==
'Contact' &&
13137 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
13138 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
13140 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
13142 if ($filterobj && get_class($filterobj) ==
'Societe') {
13143 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
13148 $out .=
'<div class="div-table-responsive-no-min">';
13149 $out .=
'<table class="noborder borderbottom centpercent">';
13151 $out .=
'<tr class="liste_titre">';
13155 $out .=
'<th class="liste_titre width50 middle">';
13156 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13157 $out .= $searchpicto;
13161 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
13163 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
13165 $out .=
'<th class="liste_titre"></th>';
13167 $out .=
'<th class="liste_titre">';
13168 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
13170 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
13172 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
13173 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
13178 $out .=
'<th class="liste_titre width50 middle">';
13179 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13180 $out .= $searchpicto;
13187 $out .=
'</table>';
13194 $out .=
'<ul class="timeline">';
13198 if (get_class($filterobj) ==
'Societe') {
13199 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
13201 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
13202 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
13203 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
13205 if (get_class($filterobj) ==
'Societe') {
13211 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
13213 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
13215 $actualCycleDate =
false;
13218 foreach ($histo as $key => $value) {
13219 $actionstatic->fetch($histo[$key][
'id']);
13221 $actionstatic->type_picto = $histo[$key][
'apicto'];
13222 $actionstatic->type_code = $histo[$key][
'acode'];
13224 $labeltype = $actionstatic->type_code;
13225 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
13226 $labeltype =
'AC_OTH';
13228 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13229 $labeltype = $langs->trans(
"Message");
13231 if (!empty($arraylist[$labeltype])) {
13232 $labeltype = $arraylist[$labeltype];
13234 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
13235 $labeltype .=
' - '.$arraylist[$actionstatic->code];
13239 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
13241 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
13243 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
13244 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
13245 $out .=
'<!-- timeline time label -->';
13246 $out .=
'<li class="time-label">';
13247 $out .=
'<span class="timeline-badge-date">';
13248 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
13251 $out .=
'<!-- /.timeline-label -->';
13255 $out .=
'<!-- timeline item -->'.
"\n";
13256 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
13259 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
13264 $out .=
'<div class="timeline-item">'.
"\n";
13266 $out .=
'<span class="time timeline-header-action2">';
13268 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
13269 $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").
' ';
13270 $out .= $histo[$key][
'id'];
13273 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
13276 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
13277 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
13278 $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).
'">';
13280 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
13287 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
13288 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
13289 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
13290 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
13291 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
13292 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
13293 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
13295 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
13299 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13302 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13305 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
13308 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13314 $out .=
"</span></span>\n";
13317 $out .=
'<h3 class="timeline-header">';
13320 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
13321 if ($histo[$key][
'userid'] > 0) {
13322 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
13323 $userstatic->fetch($histo[$key][
'userid']);
13324 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
13326 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
13327 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
13328 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
13329 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
13330 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
13332 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
13335 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
13340 $out .=
' <div class="messaging-title inline-block">';
13342 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
13343 $out .= $labeltype.
' - ';
13347 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13348 $out .= $langs->trans(
'TicketNewMessage');
13349 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13350 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
13351 } elseif (isset($histo[$key][
'type'])) {
13352 if ($histo[$key][
'type'] ==
'action') {
13353 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13354 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
13355 $libelle = $histo[$key][
'note'];
13356 $actionstatic->id = $histo[$key][
'id'];
13358 } elseif ($histo[$key][
'type'] ==
'mailing') {
13359 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
13360 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13361 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
13364 $libelle .= $histo[$key][
'note'];
13369 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
13370 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
13371 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
13373 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
13374 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
13376 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
13377 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
13380 $out .=
' - '.$link;
13389 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
13390 && $actionstatic->code !=
'AC_TICKET_CREATE'
13391 && $actionstatic->code !=
'AC_TICKET_MODIFY'
13393 $out .=
'<div class="timeline-body wordbreak">';
13394 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
13396 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
13397 $out .=
'<div class="readmore-block --closed" >';
13398 $out .=
' <div class="readmore-block__excerpt" >';
13399 $out .= $truncatedText ;
13400 $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>';
13402 $out .=
' <div class="readmore-block__full-text" >';
13403 $out .= $histo[$key][
'message'];
13404 $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>';
13408 $out .= $histo[$key][
'message'];
13418 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
13420 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
13421 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13423 $contact->fetch($cid);
13424 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13426 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13430 $contactList .= !empty($contactList) ?
', ' :
'';
13431 $contactList .= $contact->getNomUrl(1);
13432 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13433 if (!empty($contact->phone_pro)) {
13434 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
13440 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
13441 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
13442 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13444 $result = $contact->fetch($histo[$key][
'contact_id']);
13445 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13447 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13451 $footer .= $contact->getNomUrl(1);
13452 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13453 if (!empty($contact->phone_pro)) {
13454 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
13461 if (!empty($documents)) {
13462 $footer .=
'<div class="timeline-documents-container">';
13463 foreach ($documents as $doc) {
13464 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
13465 $footer .=
' data-id="'.$doc->id.
'" ';
13466 $footer .=
' data-path="'.$doc->filepath.
'"';
13467 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
13470 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
13472 $file = $actionstatic->id.
'/'.$doc->filename;
13473 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
13474 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
13475 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
13477 $mimeAttr =
' mime="'.$mime.
'" ';
13479 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
13480 $class .=
' documentpreview';
13483 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
13484 $footer .=
img_mime($filePath).
' '.$doc->filename;
13487 $footer .=
'</span>';
13489 $footer .=
'</div>';
13492 if (!empty($footer)) {
13493 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
13496 $out .=
'</div>'.
"\n";
13499 $out .=
'<!-- END timeline item -->';
13507 jQuery(document).ready(function () {
13508 $(document).on("click", "[data-read-more-action]", function(e){
13509 let readMoreBloc = $(this).closest(".readmore-block");
13510 if(readMoreBloc.length > 0){
13511 e.preventDefault();
13512 if($(this).attr("data-read-more-action") == "close"){
13513 readMoreBloc.addClass("--closed").removeClass("--open");
13514 $("html, body").animate({
13515 scrollTop: readMoreBloc.offset().top - 200
13518 readMoreBloc.addClass("--open").removeClass("--closed");
13526 if (empty($histo)) {
13527 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
13550 if ($hourTime ===
'getpost') {
13554 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
13555 $hour = intval($m[1]);
13556 $minute = intval($m[2]);
13557 $second = intval($m[3]);
13559 $hour = $minute = $second = 0;
13562 $hour = min($hour, 23);
13563 $minute = min($minute, 59);
13564 $second = min($second, 59);
13581 if ($timestamp ===
null) {
13582 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
13589 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
13590 $TParam = array_merge($TParam, array(
13597 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.
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.