54if (!function_exists(
'utf8_encode')) {
62 function utf8_encode($elements)
64 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
68if (!function_exists(
'utf8_decode')) {
76 function utf8_decode($elements)
78 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
81if (!function_exists(
'str_starts_with')) {
90 function str_starts_with($haystack, $needle)
92 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
95if (!function_exists(
'str_ends_with')) {
104 function str_ends_with($haystack, $needle)
106 return $needle !==
'' && substr($haystack, -strlen($needle)) === (string) $needle;
109if (!function_exists(
'str_contains')) {
118 function str_contains($haystack, $needle)
120 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
140 if (!is_object(
$object) && empty($module)) {
143 if (empty($module) && !empty(
$object->element)) {
148 if ($module ==
'fichinter') {
149 $module =
'ficheinter';
150 } elseif ($module ==
'invoice_supplier') {
151 $module =
'supplier_invoice';
152 } elseif ($module ==
'order_supplier') {
153 $module =
'supplier_order';
157 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
158 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_output')) {
160 if ($mode !=
'outputrel') {
163 if ($forobject &&
$object->id > 0) {
167 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_output')) {
169 if ($mode !=
'outputrel') {
170 $s =
$conf->$module->dir_output;
172 if ($forobject &&
$object->id > 0) {
177 return 'error-diroutput-not-defined-for-this-object='.$module;
179 } elseif ($mode ==
'temp') {
180 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_temp')) {
182 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_temp')) {
183 return $conf->$module->dir_temp;
185 return 'error-dirtemp-not-defined-for-this-object='.$module;
188 return 'error-bad-value-for-mode';
232 return (
string) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
247 return (
int) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
262 return (
float) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
276 return (
bool) (
$conf->global->$key ?? $default);
290 if (empty($tmpuser)) {
295 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
308 if (empty($tmpuser)) {
313 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
330 'adherent' =>
'member',
331 'member_type' =>
'adherent_type',
333 'contrat' =>
'contract',
334 'entrepot' =>
'stock',
335 'projet' =>
'project',
336 'categorie' =>
'category',
337 'commande' =>
'order',
338 'expedition' =>
'shipping',
339 'facture' =>
'invoice',
340 'fichinter' =>
'intervention',
341 'ficheinter' =>
'intervention',
342 'propale' =>
'propal',
343 'socpeople' =>
'contact',
344 'fournisseur' =>
'supplier',
346 'actioncomm' =>
'agenda',
347 'product_price' =>
'productprice',
348 'product_fournisseur_price' =>
'productsupplierprice',
358function isModEnabled($module)
368 $arrayconv[
'supplier_order'] =
'fournisseur';
369 $arrayconv[
'supplier_invoice'] =
'fournisseur';
374 if ($module ==
'delivery_note') {
378 $module =
'shipping';
382 $module_alt = $module;
383 if (!empty($arrayconv[$module])) {
384 $module_alt = $arrayconv[$module];
386 $module_bis = $module;
387 if (!empty($arrayconvbis[$module])) {
388 $module_bis = $arrayconvbis[$module];
391 return !empty(
$conf->modules[$module]) || !empty(
$conf->modules[$module_alt]) || !empty(
$conf->modules[$module_bis]);
410 $moduletomoduletouse = array(
411 'invoice' =>
'facture',
413 $moduleParmsMapping = array(
414 'product' =>
'produit',
417 if (!empty($moduletomoduletouse[$module])) {
418 $module = $moduletomoduletouse[$module];
421 $warningDelayPath = $parmlevel1;
422 if (!empty($moduleParmsMapping[$warningDelayPath])) {
423 $warningDelayPath = $moduleParmsMapping[$warningDelayPath];
427 if (!empty(
$conf->$module->$warningDelayPath->warning_delay)) {
428 if (!empty(
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay)) {
429 return (
int)
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay;
433 if (!empty(
$conf->$module->$warningDelayPath->warning_delay)) {
434 return (
int)
$conf->$module->$warningDelayPath->$parmlevel1->warning_delay;
449 if ($timestamp ===
'') {
450 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page '.$_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_NOTICE);
453 if (is_null($timestamp) || !is_numeric($timestamp)) {
473 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
475 $class =
'DoliDB'.ucfirst($type);
476 $db =
new $class($type, $host, $user, $pass, $name, $port);
497function getEntity($element, $shared = 1, $currentobject =
null)
501 if (!is_object($hookmanager)) {
502 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
509 $element =
'project';
512 $element =
'contract';
514 case 'order_supplier':
515 $element =
'supplier_order';
517 case 'invoice_supplier':
518 $element =
'supplier_invoice';
522 if (is_object($mc)) {
523 $out = $mc->getEntity($element, $shared, $currentobject);
526 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
528 $addzero[] =
'c_holiday_types';
530 if (in_array($element, $addzero)) {
533 $out .= ((int)
$conf->entity);
538 'element' => $element,
541 'currentobject' => $currentobject,
545 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
547 if (is_numeric($reshook)) {
548 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
549 $out .=
','.$hookmanager->resPrint;
550 } elseif ($reshook == 1) {
551 $out = $hookmanager->resPrint;
568 if (is_object($mc) && method_exists($mc,
'setEntity')) {
569 return $mc->setEntity($currentobject);
571 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity :
$conf->entity);
583 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
595 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
596 $r = chr($n % 26 + 0x41) . $r;
620 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
627 $user_agent = substr($user_agent, 0, 512);
629 $detectmobile =
new Mobile_Detect(
null, $user_agent);
630 $tablet = $detectmobile->isTablet();
632 if ($detectmobile->isMobile()) {
636 if ($detectmobile->is(
'AndroidOS')) {
637 $os = $phone =
'android';
638 } elseif ($detectmobile->is(
'BlackBerryOS')) {
639 $os = $phone =
'blackberry';
640 } elseif ($detectmobile->is(
'iOS')) {
643 } elseif ($detectmobile->is(
'PalmOS')) {
644 $os = $phone =
'palm';
645 } elseif ($detectmobile->is(
'SymbianOS')) {
647 } elseif ($detectmobile->is(
'webOS')) {
649 } elseif ($detectmobile->is(
'MaemoOS')) {
651 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
657 if (preg_match(
'/linux/i', $user_agent)) {
659 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
661 } elseif (preg_match(
'/windows/i', $user_agent)) {
667 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
669 $version = empty($reg[2]) ?
'' : $reg[2];
670 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
672 $version = empty($reg[2]) ?
'' : $reg[2];
673 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
675 $version = empty($reg[2]) ?
'' : $reg[2];
676 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
679 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
681 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
683 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
685 $version = empty($reg[2]) ?
'' : $reg[2];
686 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
689 $version = empty($reg[2]) ?
'' : $reg[2];
690 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
692 $version = end($reg);
693 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
696 $version = end($reg);
697 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
699 $name =
'textbrowser';
700 $version = empty($reg[3]) ?
'' : $reg[3];
701 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
703 $name =
'textbrowser';
704 $version = empty($reg[1]) ?
'' : $reg[1];
716 'browsername' => $name,
717 'browserversion' => $version,
719 'browserua' => $user_agent,
734 $disconnectdone =
false;
736 if (is_object($db) && !empty($db->connected)) {
737 $depth = $db->transaction_opened;
738 $disconnectdone = $db->close();
740 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));
752function GETPOSTISSET($paramname)
756 $relativepathstring = $_SERVER[
"PHP_SELF"];
758 if (constant(
'DOL_URL_ROOT')) {
759 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
761 $relativepathstring = ltrim($relativepathstring,
'/');
762 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
768 if (!empty($_GET[
'restore_lastsearch_values'])) {
769 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
770 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
771 if (is_array($tmp)) {
772 foreach ($tmp as $key => $val) {
773 if ($key == $paramname) {
781 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
783 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
785 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
787 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
791 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
808 if (empty($method)) {
809 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
810 } elseif ($method == 1) {
811 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
812 } elseif ($method == 2) {
813 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
814 } elseif ($method == 3) {
815 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
817 $val =
'BadFirstParameterForGETPOST';
820 return is_array($val);
853function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
855 global $mysoc, $user,
$conf;
857 if (empty($paramname)) {
858 return 'BadFirstParameterForGETPOST';
861 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);
866 if (empty($method)) {
867 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
868 } elseif ($method == 1) {
869 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
870 } elseif ($method == 2) {
871 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
872 } elseif ($method == 3) {
873 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
875 return 'BadThirdParameterForGETPOST';
878 $relativepathstring =
'';
880 if (empty($method) || $method == 3 || $method == 4) {
881 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
883 if (constant(
'DOL_URL_ROOT')) {
884 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
886 $relativepathstring = ltrim($relativepathstring,
'/');
887 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
893 if (!empty($_GET[
'restore_lastsearch_values'])) {
894 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
895 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
896 if (is_array($tmp)) {
897 foreach ($tmp as $key => $val) {
898 if ($key == $paramname) {
906 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
907 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
908 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
909 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
910 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
911 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
912 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
913 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
915 } elseif (!isset($_GET[
'sortfield'])) {
918 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
921 '@phan-var-force CommonObject $object';
922 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
924 $out =
$object->fields[$paramname][
'default'];
928 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
930 if (!empty($user->default_values)) {
931 if (isset($user->default_values[$relativepathstring][
'createform'])) {
932 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
934 if ($defkey !=
'_noquery_') {
935 $tmpqueryarraytohave = explode(
'&', $defkey);
938 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
939 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
952 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
953 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
960 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
962 if (!empty($user->default_values)) {
965 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
967 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
969 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
971 if ($defkey !=
'_noquery_') {
972 $tmpqueryarraytohave = explode(
'&', $defkey);
975 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
976 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
989 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
990 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
994 if ($paramname ==
'sortfield') {
997 if ($paramname ==
'sortorder') {
1005 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
1006 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
1007 if (!empty($_GET[
'disabledefaultvalues'])) {
1011 if ($defkey !=
'_noquery_') {
1012 $tmpqueryarraytohave = explode(
'&', $defkey);
1015 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1016 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1028 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
1030 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
1033 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1034 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1037 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1038 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1053 '@phan-var-force string $paramname';
1054 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1056 $regreplace = array();
1060 while (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out, $reg) && ($loopnb < $maxloop)) {
1064 if ($reg[1] ==
'DAY') {
1066 $newout = $tmp[
'mday'];
1067 } elseif ($reg[1] ==
'MONTH') {
1069 $newout = $tmp[
'mon'];
1070 } elseif ($reg[1] ==
'YEAR') {
1072 $newout = $tmp[
'year'];
1073 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
1076 $newout = $tmp2[
'day'];
1077 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
1080 $newout = $tmp2[
'month'];
1081 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
1083 $newout = ($tmp[
'year'] - 1);
1084 } elseif ($reg[1] ==
'NEXT_DAY') {
1087 $newout = $tmp2[
'day'];
1088 } elseif ($reg[1] ==
'NEXT_MONTH') {
1091 $newout = $tmp2[
'month'];
1092 } elseif ($reg[1] ==
'NEXT_YEAR') {
1094 $newout = ($tmp[
'year'] + 1);
1095 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1096 $newout = $mysoc->country_id;
1097 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1098 $newout = $user->id;
1099 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1100 $newout = $user->fk_user;
1101 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1102 $newout =
$conf->entity;
1103 } elseif ($reg[1] ==
'ID') {
1106 $newout =
'REGREPLACE_'.$loopnb;
1107 $regreplace[$loopnb] = $reg[0];
1110 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1112 if (!empty($regreplace)) {
1113 foreach ($regreplace as $key => $value) {
1114 $out = preg_replace(
'/REGREPLACE_'.$key.
'/', $value, $out);
1120 if (preg_match(
'/^array/', $check)) {
1121 $tmpcheck =
'alphanohtml';
1124 } elseif (!is_array($out)) {
1125 $out = explode(
',', $out);
1127 $tmparray = explode(
':', $check);
1128 if (!empty($tmparray[1])) {
1129 $tmpcheck = $tmparray[1];
1132 foreach ($out as $outkey => $outval) {
1133 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1138 if (strpos($paramname,
'search_') === 0) {
1139 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1143 $out =
sanitizeVal($out, $check, $filter, $options);
1150 if (preg_match(
'/^backto/i', $paramname)) {
1151 $out = str_replace(
'\\',
'/', $out);
1152 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1154 $oldstringtoclean = $out;
1155 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1156 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1157 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1158 }
while ($oldstringtoclean != $out);
1163 if (empty($method) || $method == 3 || $method == 4) {
1164 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1171 if ($out !=
'' && isset($user)) {
1172 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1191 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1223function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto', $saverestore =
'')
1226 if ($hourTime ===
'getpost' || $hourTime ===
'getpostend') {
1227 $hour = (GETPOSTISSET($prefix .
'hour') &&
GETPOSTINT($prefix .
'hour') >= 0) ?
GETPOSTINT($prefix .
'hour') : ($hourTime ===
'getpostend' ? 23 : 0);
1228 $minute = (GETPOSTISSET($prefix .
'min') &&
GETPOSTINT($prefix .
'min') >= 0) ?
GETPOSTINT($prefix .
'min') : ($hourTime ===
'getpostend' ? 59 : 0);
1229 $second = (GETPOSTISSET($prefix .
'sec') &&
GETPOSTINT($prefix .
'sec') >= 0) ?
GETPOSTINT($prefix .
'sec') : ($hourTime ===
'getpostend' ? 59 : 0);
1230 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
1231 $hour = intval($m[1]);
1232 $minute = intval($m[2]);
1233 $second = intval($m[3]);
1234 } elseif ($hourTime ===
'end') {
1239 $hour = $minute = $second = 0;
1244 && !GETPOSTISSET($prefix .
'day')
1245 && !GETPOSTISSET($prefix .
'month')
1246 && !GETPOSTISSET($prefix .
'year')
1247 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_day'])
1248 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_month'])
1249 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_year'])
1251 $day = $_SESSION[
'DOLDATE_'.$saverestore.
'_day'];
1252 $month = $_SESSION[
'DOLDATE_'.$saverestore.
'_month'];
1253 $year = $_SESSION[
'DOLDATE_'.$saverestore.
'_year'];
1261 $hour = (int) min($hour, 23);
1262 $minute = (int) min($minute, 59);
1263 $second = (int) min($second, 59);
1266 $_SESSION[
'DOLDATE_'.$saverestore.
'_day'] = $day;
1267 $_SESSION[
'DOLDATE_'.$saverestore.
'_month'] = $month;
1268 $_SESSION[
'DOLDATE_'.$saverestore.
'_year'] = $year;
1272 return dol_mktime($hour, $minute, $second, $month, $day, $year, $gm);
1286function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1288 return sanitizeVal($out, $check, $filter, $options);
1300function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1304 if ($out ===
null) {
1312 if (!is_numeric($out)) {
1317 if (is_array($out)) {
1318 $out = implode(
',', $out);
1320 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1325 $out = filter_var($out, FILTER_SANITIZE_STRING);
1328 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1332 $out = preg_replace(
'/[^:\/\[\]a-z0-9@\$\'\*\~\.\-_,;\?\!=%&+#]+/i',
'', $out);
1336 if (!is_array($out)) {
1338 if (preg_match(
'/[^a-z]+/i', $out)) {
1344 if (!is_array($out)) {
1346 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1352 if (!is_array($out)) {
1354 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1360 if (!is_array($out)) {
1362 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1369 if (!is_array($out)) {
1372 $oldstringtoclean = $out;
1376 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1383 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1384 }
while ($oldstringtoclean != $out);
1388 case 'alphawithlgt':
1389 if (!is_array($out)) {
1392 $oldstringtoclean = $out;
1396 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1403 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1404 }
while ($oldstringtoclean != $out);
1410 case 'restricthtmlnolink':
1411 case 'restricthtml':
1412 case 'restricthtmlallowclass':
1413 case 'restricthtmlallowiframe':
1414 case 'restricthtmlallowlinkscript':
1415 case 'restricthtmlallowunvalid':
1420 if (empty($filter)) {
1421 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1423 if (is_null($options)) {
1426 $out = filter_var($out, $filter, $options);
1430 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1431 $out =
GETPOST($out,
'alphanohtml');
1446function dolSetCookie(
string $cookiename,
string $cookievalue,
int $expire = -1)
1448 global $dolibarr_main_force_https;
1450 if ($expire == -1) {
1451 $expire = (time() + (86400 * 354));
1454 if (PHP_VERSION_ID < 70300) {
1455 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : $expire,
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
1458 $cookieparams = array(
1459 'expires' => empty($cookievalue) ? 0 : $expire,
1462 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
1466 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
1468 if (empty($cookievalue)) {
1469 unset($_COOKIE[$cookiename]);
1473if (!function_exists(
'dol_getprefix')) {
1484 function dol_getprefix($mode =
'')
1487 if ($mode ==
'email') {
1493 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1494 return $_SERVER[
"SERVER_NAME"];
1499 if (!empty(
$conf->file->instance_unique_id)) {
1500 return sha1(
'dolibarr'.
$conf->file->instance_unique_id);
1504 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1508 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1509 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1512 if (!empty($tmp_instance_unique_id)) {
1513 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1517 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1518 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1520 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1537 global
$conf, $langs, $user, $mysoc;
1541 if (!file_exists($fullpath)) {
1542 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1545 if (!empty($classname) && !class_exists($classname)) {
1546 return include $fullpath;
1548 return include_once $fullpath;
1566function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1570 $path = preg_replace(
'/^\//',
'', $path);
1573 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1574 if (is_array(
$conf->file->dol_document_root)) {
1575 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1576 if ($key ==
'main') {
1580 if (@file_exists($dirroot.
'/'.$path)) {
1581 $res = $dirroot.
'/'.$path;
1586 if ($returnemptyifnotfound) {
1588 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1600 $res = DOL_URL_ROOT.
'/'.$path;
1603 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1606 $res = DOL_URL_ROOT.
'/'.$path;
1609 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1610 if ($key ==
'main') {
1615 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1616 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1619 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1624 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1625 if (!empty($regs[1])) {
1628 if (@file_exists($dirroot.
'/'.$regs[1])) {
1630 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1631 } elseif ($type == 2) {
1632 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1633 } elseif ($type == 3) {
1637 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1638 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1641 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
$conf->file->dol_url_root[$key].
'/'.$path;
1665 if (empty($properties)) {
1666 return get_object_vars($obj);
1669 $existingProperties = [];
1670 $realProperties = get_object_vars($obj);
1673 foreach ($properties as $property) {
1674 if (array_key_exists($property, $realProperties)) {
1676 $existingProperties[$property] = $obj->{$property};
1677 } elseif (property_exists($obj, $property)) {
1679 $existingProperties[$property] = $obj->{$property};
1683 return $existingProperties;
1712 $myclone = unserialize(serialize(
$object));
1714 if (!empty($tmpsavdb)) {
1717 } elseif ($native == 2) {
1720 $tmparray = get_object_vars(
$object);
1722 if (is_array($tmparray)) {
1723 foreach ($tmparray as $propertykey => $propertyval) {
1724 if (is_scalar($propertyval) || is_array($propertyval)) {
1725 $myclone->$propertykey = $propertyval;
1745function dol_size($size, $type =
'')
1748 if (empty(
$conf->dol_optimize_smallscreen)) {
1751 if ($type ==
'width' && $size > 250) {
1777 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1778 if ($includequotes) {
1779 $filesystem_forbidden_chars[] =
"'";
1782 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1783 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1784 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1785 $tmp = str_replace(
'..',
'', $tmp);
1786 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
1808 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1815 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1816 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1817 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1818 $tmp = str_replace(
'..',
'', $tmp);
1819 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
1835 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1837 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1839 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1843 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1847 $oldstringtoclean = $stringtoclean;
1850 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1851 }
while ($oldstringtoclean != $stringtoclean);
1855 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1858 return $stringtoclean;
1870 $oldstringtoclean = $stringtoclean;
1871 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1872 }
while ($oldstringtoclean != $stringtoclean);
1874 return $stringtoclean;
1887 return preg_replace(
'/[^\w]+/',
'', $str);
1901 if (is_null($str)) {
1906 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1907 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1908 return $transliterator->transliterate($str);
1911 $string = rawurlencode($str);
1912 $replacements = array(
1913 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1915 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1916 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1918 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1920 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1921 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1922 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1924 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1925 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1927 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1929 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1930 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1932 $string = strtr($string, $replacements);
1933 return rawurldecode($string);
1938 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1939 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1940 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1941 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1942 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1943 \xF9\xFA\xFB\xFC\xFD\xFF",
1951 $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"));
1969function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1971 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1972 if (empty($keepspaces)) {
1973 $forbidden_chars_to_replace[] =
" ";
1975 $forbidden_chars_to_remove = array();
1978 if (is_array($badcharstoreplace)) {
1979 $forbidden_chars_to_replace = $badcharstoreplace;
1981 if (is_array($badcharstoremove)) {
1982 $forbidden_chars_to_remove = $badcharstoremove;
1986 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
2005 if ($removetabcrlf) {
2006 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
2008 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
2023 if (function_exists(
'iconv')) {
2024 $slug = iconv(
'UTF-8',
'ASCII//TRANSLIT//IGNORE', $slug);
2028 $slug = strtolower($slug);
2031 $slug = preg_replace(
'/[^a-z0-9]+/',
'-', $slug);
2034 $slug = trim($slug,
'-');
2047function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
2049 if (is_null($stringtoescape)) {
2054 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
2056 if (empty($noescapebackslashn)) {
2057 $substitjs[
"\n"] =
'\\n';
2058 $substitjs[
'\\'] =
'\\\\';
2061 $substitjs[
"'"] =
"\\'";
2062 $substitjs[
'"'] =
"\\'";
2063 } elseif ($mode == 1) {
2064 $substitjs[
"'"] =
"\\'";
2065 } elseif ($mode == 2) {
2066 $substitjs[
'"'] =
'\\"';
2067 } elseif ($mode == 3) {
2068 $substitjs[
"'"] =
"\\'";
2069 $substitjs[
'"'] =
"\\\"";
2071 return strtr((
string) $stringtoescape, $substitjs);
2085 return rawurlencode($stringtoescape);
2096 return str_replace(
'"',
'\"', $stringtoescape);
2108 if (is_null($stringtoescape)) {
2112 if ($stringforquotes == 2) {
2113 return str_replace(
'"',
"'", $stringtoescape);
2114 } elseif ($stringforquotes == 1) {
2120 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
2121 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
2124 return 'Bad parameter for stringforquotes in dol_escape_php';
2135 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
2146 return $stringtoescape;
2210 $allowedtags = array(
'br',
'b',
'font',
'hr',
'span');
2211 if (!empty($allowothertags) && is_array($allowothertags)) {
2212 $allowedtags = array_merge($allowedtags, $allowothertags);
2216 if ($escapeonlyhtmltags) {
2217 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 0, 0, 0, $allowedtags), 1, -1,
'', 1, 1);
2219 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, $allowedtags), 1, -1,
'', 0, 1);
2235 $escapeonlyhtmltags = 1;
2236 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 1, 1, 0, array()), 0, 0,
'', $escapeonlyhtmltags, 1);
2261 return htmlspecialchars($s, ENT_HTML5,
'UTF-8');
2281function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2283 if ($noescapetags ==
'common') {
2284 $noescapetags =
'html,body,a,b,em,hr,i,u,ul,ol,li,br,div,img,font,p,span,strong,table,tr,td,th,tbody,h1,h2,h3,h4,h5,h6,h7,h8,h9';
2286 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2288 if ($cleanalsojavascript) {
2293 if ($escapeonlyhtmltags) {
2294 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2301 $tmp = (string) $stringtoescape;
2304 $tmp = str_ireplace(
'<',
'__DONOTDECODELT', $tmp);
2305 $tmp = str_ireplace(
'>',
'__DONOTDECODEGT', $tmp);
2306 $tmp = str_ireplace(
'&',
'__DONOTDECODEAMP', $tmp);
2307 $tmp = str_ireplace(
'"',
'__DONOTDECODEQUOT', $tmp);
2308 $tmp = str_ireplace(
'&apos',
'__DONOTDECODEAPOS', $tmp);
2309 $tmp = str_ireplace(
''',
'__DONOTDECODE39', $tmp);
2311 $tmp = html_entity_decode((
string) $tmp, ENT_COMPAT,
'UTF-8');
2314 $tmp = str_ireplace(
'__DONOTDECODELT',
'<', $tmp);
2315 $tmp = str_ireplace(
'__DONOTDECODEGT',
'>', $tmp);
2316 $tmp = str_ireplace(
'__DONOTDECODEAMP',
'&', $tmp);
2317 $tmp = str_ireplace(
'__DONOTDECODEQUOT',
'"', $tmp);
2318 $tmp = str_ireplace(
'__DONOTDECODEAPOS',
'&apos', $tmp);
2319 $tmp = str_ireplace(
'__DONOTDECODE39',
''', $tmp);
2321 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE__', $tmp);
2324 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2327 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2328 } elseif ($keepn == -1) {
2329 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2332 if ($escapeonlyhtmltags) {
2333 $tmp = htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2337 $tmparrayoftags = array();
2338 if ($noescapetags) {
2339 $tmparrayoftags = explode(
',', $noescapetags);
2342 if (count($tmparrayoftags)) {
2347 $tmp = str_ireplace(array(
'__DOUBLEQUOTE',
'__BEGINTAGTOREPLACE',
'__ENDTAGTOREPLACE',
'__BEGINENDTAGTOREPLACE'),
'', $tmp);
2349 foreach ($tmparrayoftags as $tagtoreplace) {
2351 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2352 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2353 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2359 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)>/', $tmp, $reg)) {
2361 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2362 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE__', $tmpattributes);
2363 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2365 $tmp = str_replace(
'<'.$tagtoreplace.$reg[1].$reg[2].
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2368 $diff = strcmp($tmpold, $tmp);
2372 $tmp = str_ireplace(
'&',
'__ANDNOSEMICOLON__', $tmp);
2373 $tmp = str_ireplace(
'"',
'__DOUBLEQUOTENOSEMICOLON__', $tmp);
2374 $tmp = str_ireplace(
'<',
'__LESSTHAN__', $tmp);
2375 $tmp = str_ireplace(
'>',
'__GREATERTHAN__', $tmp);
2379 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2383 if (count($tmparrayoftags)) {
2385 foreach ($tmparrayoftags as $tagtoreplace) {
2386 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2387 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2388 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2389 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2390 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2393 $result = str_ireplace(
'__DOUBLEQUOTE__',
'"', $result);
2395 $result = str_ireplace(
'__ANDNOSEMICOLON__',
'&', $result);
2396 $result = str_ireplace(
'__DOUBLEQUOTENOSEMICOLON__',
'"', $result);
2397 $result = str_ireplace(
'__LESSTHAN__',
'<', $result);
2398 $result = str_ireplace(
'__GREATERTHAN__',
'>', $result);
2401 $result = str_ireplace(
'__SIMPLEQUOTE__',
''', $result);
2418 if (function_exists(
'mb_strtolower')) {
2419 return mb_strtolower($string, $encoding);
2421 return strtolower($string);
2435 if (function_exists(
'mb_strtoupper')) {
2436 return mb_strtoupper($string, $encoding);
2438 return strtoupper($string);
2452 if (function_exists(
'mb_substr')) {
2453 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2455 return ucfirst($string);
2469 if (function_exists(
'mb_convert_case')) {
2470 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2472 return ucwords($string);
2484 $backtrace = debug_backtrace();
2486 if (count($backtrace) >= 1) {
2488 if (count($backtrace) == 1) {
2491 $trace = $backtrace[$pos];
2492 if (isset($trace[
'file'], $trace[
'line'])) {
2493 $msg =
" From {$trace['file']}:{$trace['line']}.";
2521function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2523 global
$conf, $user, $debugbar;
2526 if (!isModEnabled(
'syslog')) {
2531 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2532 global $website, $websitekey;
2533 if (is_object($website) && !empty($website->ref)) {
2534 $suffixinfilename .=
'_website_'.$website->ref;
2535 } elseif (!empty($websitekey)) {
2536 $suffixinfilename .=
'_website_'.$websitekey;
2541 if (defined(
'USESUFFIXINLOG')) {
2542 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2546 foreach (
$conf->loghandlers as $loghandlerinstance) {
2547 $loghandlerinstance->setIdent($ident);
2551 if (!empty($message)) {
2554 $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');
2556 if (!array_key_exists($level, $logLevels)) {
2557 dol_syslog(
'Error Bad Log Level '.$level, LOG_ERR);
2565 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2569 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2570 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2571 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2572 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2574 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2580 print
"\n\n<!-- Log start\n";
2582 print
"Log end -->\n";
2586 'message' => $message,
2587 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
''),
2589 'user' => ((is_object($user) && $user->id) ? $user->login :
''),
2591 'osuser' => function_exists(
'posix_getuid') ? (string) posix_getuid() :
'',
2592 'ospid' => (string) getmypid()
2597 if (!empty($remoteip)) {
2598 $data[
'ip'] = $remoteip;
2602 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
2603 $tmpips = explode(
',', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
2607 foreach ($tmpips as $tmpip) {
2608 $tmpip = trim($tmpip);
2609 if (strtolower($tmpip) == strtolower($remoteip)) {
2612 if (empty($data[
'ip'])) {
2613 $data[
'ip'] = $tmpip;
2616 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',').$tmpip;
2619 if (!$foundremoteip) {
2621 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',').$remoteip;
2623 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2624 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP'])) {
2625 $tmpips = explode(
',', $_SERVER[
'HTTP_CLIENT_IP']);
2629 foreach ($tmpips as $tmpip) {
2630 $tmpip = trim($tmpip);
2631 if (strtolower($tmpip) == strtolower($remoteip)) {
2634 if (empty($data[
'ip'])) {
2635 $data[
'ip'] = $tmpip;
2638 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',').$tmpip;
2641 if (!$foundremoteip) {
2643 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',').$remoteip;
2645 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2647 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2649 $data[
'ip'] = (string) $_SERVER[
'SERVER_ADDR'];
2650 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2652 $data[
'ip'] = (string) $_SERVER[
'COMPUTERNAME'];
2654 $data[
'ip'] =
'???';
2657 if (!empty($_SERVER[
'USERNAME'])) {
2659 $data[
'osuser'] = (string) $_SERVER[
'USERNAME'];
2660 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2662 $data[
'osuser'] = (string) $_SERVER[
'LOGNAME'];
2666 foreach (
$conf->loghandlers as $loghandlerinstance) {
2667 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2670 $loghandlerinstance->export($data, $suffixinfilename);
2676 foreach (
$conf->loghandlers as $loghandlerinstance) {
2677 $loghandlerinstance->setIdent($ident);
2697 $form =
new Form($db);
2699 $templatenameforexport = $website->name_template;
2700 if (empty($templatenameforexport)) {
2701 $templatenameforexport =
'website_'.$website->ref;
2705 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2708 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2709 $out .=
'jQuery(document).ready(function () {';
2710 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2711 $out .=
' var dialogHtml = \'';
2713 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2714 $dialogcontent .=
' <div style="margin-top: 20px;">';
2715 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2716 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2717 $dialogcontent .=
' </div>';
2718 $dialogcontent .=
' <br>';
2719 $dialogcontent .=
' <div style="margin-top: 20px;">';
2720 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2721 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2722 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2723 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2724 $dialogcontent .=
' <input type="text" autofocus name="export_path" id="export-path-'.$name.
'" placeholder="'.$langs->trans(
'ExportPath').
'" style="width:400px " value="'.
dol_escape_htmltag($templatenameforexport).
'"/><br>';
2725 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2726 $dialogcontent .=
' </form>';
2727 $dialogcontent .=
' </div>';
2728 $dialogcontent .=
' </div>';
2735 // Add the content of the dialog to the body of the page
2736 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2737 $out .= ' if ($dialog.length > 0) {
2740 jQuery(
"body").append(dialogHtml);
';
2742 // Configuration of popup
2743 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2744 $out .= ' autoOpen:
false,
';
2745 $out .= ' modal:
true,
';
2746 $out .= ' height: 290,
';
2747 $out .= ' width:
"40%",
';
2748 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2751 // Simulate a click on the original "submit" input to export the site.
2752 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2753 $out .= ' console.log(
"Clic on exportsite.");
';
2754 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2755 $out .= ' console.log(
"element founded:", target.length > 0);
';
2756 $out .= ' if (target.length > 0) { target.click(); }
';
2757 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2761 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2762 $out .= ' return false;
';
2765 $out .= '</script>
';
2787function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $jsonclose = '', $accesskey = '')
2791 if (strpos($url, '?
') > 0) {
2792 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2794 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2799 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2800 $out .= '<!-- a link
for button to open url into a dialog popup -->
';
2801 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2802 if (empty($conf->use_javascript_ajax)) {
2803 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2804 } elseif ($jsonopen) {
2805 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2807 $out .= ' href=
"#"';
2809 $out .= '>
'.$buttonstring.'</a>
';
2811 if (!empty($conf->use_javascript_ajax)) {
2812 // Add code to open url using the popup.
2813 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2814 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2816 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2817 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2818 jQuery(document).ready(
function () {
2819 jQuery(
".button_'.$name.'").click(
function () {
2820 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2821 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2822 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2826 height: (window.innerHeight - 150),
2829 open: function (event, ui) {
2830 console.log(
"open popup name='.$name.'");
2832 close:
function (event, ui) {
2833 console.log(
"Popup is closed, run jsonclose = '.$jsonclose.'");
2834 '.(empty($jsonclose) ? '' : $jsonclose.';
').'
2838 $tmpdialog.dialog(\
'open\');
2863function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2865 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2885function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0, $morecssdiv =
'')
2887 global
$conf, $langs, $hookmanager;
2891 if (!empty(
$conf->dol_optimize_smallscreen)) {
2895 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2897 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2898 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2902 if ($morehtmlright) {
2903 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2910 if (is_array($links) && !empty($links)) {
2911 $keys = array_keys($links);
2913 $maxkey = max($keys);
2919 if (empty($limittoshow)) {
2922 if (!empty(
$conf->dol_optimize_smallscreen)) {
2930 for ($i = 0; $i <= $maxkey; $i++) {
2931 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2933 if ($i >= $limittoshow) {
2939 for ($i = 0; $i <= $maxkey; $i++) {
2940 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2946 if ($i < $limittoshow || $isactive) {
2948 $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])).
' -->';
2950 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2951 if (!empty($links[$i][0])) {
2952 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2954 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2956 } elseif (!empty($links[$i][1])) {
2958 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2960 if (!empty($links[$i][0])) {
2961 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2962 $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).
'">';
2965 if ($displaytab == 0 && $picto) {
2966 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
2969 $out .= $links[$i][1];
2970 if (!empty($links[$i][0])) {
2971 $out .=
'</a>'.
"\n";
2973 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2982 $outmore .=
'<div class="popuptabset wordwrap">';
2984 $outmore_content =
'';
2986 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2987 if (!empty($links[$i][0])) {
2988 $outmore_content .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2990 $outmore_content .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2992 } elseif (!empty($links[$i][1])) {
2993 $outmore_content .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2994 $outmore_content .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2995 $outmore_content .=
'</a>'.
"\n";
2997 if ($outmore_content !==
'') {
2998 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">' . $outmore_content .
'</div>';
3004 $displaytab = $i + 1;
3007 $outmore .=
'</div>';
3011 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
3012 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
3013 $widthofpopup = 240;
3015 $tabsname = $moretabssuffix;
3016 if (empty($tabsname)) {
3017 $tabsname = str_replace(
"@",
"", $picto);
3019 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
3021 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
3023 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
3026 $out .=
'<div></div>';
3029 $out .=
'<script nonce="'.getNonce().
'">';
3030 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
3031 var x = this.offsetLeft, y = this.offsetTop;
3032 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
3033 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
3034 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
3036 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
3039 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
3040 $out .=
"</script>";
3043 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3047 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
3048 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'').($notab == -4 ?
'' :
' tabBarWithBottom'))));
3049 $out .= ($morecssdiv ?
' '.$morecssdiv :
'');
3052 if (!empty($dragdropfile)) {
3053 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3056 $parameters = array(
'tabname' => $active,
'out' => $out);
3057 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
3059 $out = $hookmanager->resPrint;
3085 if (!$notab || $notab == -1) {
3086 return "\n</div>\n";
3111function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
3113 global
$conf, $form, $user, $langs, $hookmanager, $action;
3117 $maxvisiblephotos = 1;
3121 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
3122 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
3125 $modulepart =
'unknown';
3127 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
3128 $modulepart =
$object->element;
3129 } elseif (
$object->element ==
'member') {
3130 $modulepart =
'memberphoto';
3131 } elseif (
$object->element ==
'user') {
3132 $modulepart =
'userphoto';
3135 if (class_exists(
"Imagick")) {
3136 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
3137 $modulepart =
$object->element;
3138 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
3139 $modulepart =
'ficheinter';
3140 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3141 $modulepart =
'contract';
3142 } elseif (
$object->element ==
'order_supplier') {
3143 $modulepart =
'supplier_order';
3144 } elseif (
$object->element ==
'invoice_supplier') {
3145 $modulepart =
'supplier_invoice';
3149 if (
$object->element ==
'product') {
3151 '@phan-var-force Product $object';
3153 $cssclass =
'photowithmargin photoref';
3154 $showimage =
$object->is_photo_available(
$conf->product->multidir_output[$entity]);
3156 if (
$conf->browser->layout ==
'phone') {
3157 $maxvisiblephotos = 1;
3160 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$object->show_photos(
'product',
$conf->product->multidir_output[$entity], 1, $maxvisiblephotos, 0, 0, 0, 0, $width, 0,
'').
'</div>';
3164 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3166 $nophoto =
'/public/theme/common/nophoto.png';
3167 $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>';
3170 } elseif (
$object->element ==
'category') {
3172 '@phan-var-force Categorie $object';
3174 $cssclass =
'photowithmargin photoref';
3175 $showimage =
$object->isAnyPhotoAvailable(
$conf->categorie->multidir_output[$entity]);
3177 if (
$conf->browser->layout ==
'phone') {
3178 $maxvisiblephotos = 1;
3181 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$object->show_photos(
'category',
$conf->categorie->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, 0, $width, 0,
'').
'</div>';
3185 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3187 $nophoto =
'/public/theme/common/nophoto.png';
3188 $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>';
3191 } elseif (
$object->element ==
'bom') {
3193 '@phan-var-force Bom $object';
3195 $cssclass =
'photowithmargin photoref';
3196 $showimage =
$object->is_photo_available(
$conf->bom->multidir_output[$entity]);
3198 if (
$conf->browser->layout ==
'phone') {
3199 $maxvisiblephotos = 1;
3202 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$object->show_photos(
'bom',
$conf->bom->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, 0, $width, 0,
'').
'</div>';
3206 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3208 $nophoto =
'/public/theme/common/nophoto.png';
3209 $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>';
3212 } elseif (
$object->element ==
'ticket') {
3214 $cssclass =
'photoref';
3216 '@phan-var-force Ticket $object';
3217 $showimage =
$object->is_photo_available(
$conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
3219 if (
$conf->browser->layout ==
'phone') {
3220 $maxvisiblephotos = 1;
3224 $showphoto =
$object->show_photos(
'ticket',
$conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
3226 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
3234 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3236 $nophoto =
img_picto(
'No photo',
'object_ticket');
3237 $morehtmlleft .=
'<!-- No photo to show -->';
3238 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3239 $morehtmlleft .= $nophoto;
3240 $morehtmlleft .=
'</div></div>';
3245 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3248 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3250 $dir_output = (empty(
$conf->$modulepart->multidir_output[$entity]) ?
$conf->$modulepart->dir_output :
$conf->$modulepart->multidir_output[$entity]).
"/";
3251 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3253 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
3257 if (empty($subdir)) {
3258 $subdir =
'errorgettingsubdirofobject';
3261 $filepath = $dir_output.$subdir.
"/";
3263 $filepdf = $filepath.$objectref.
".pdf";
3264 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
3267 $fileimage = $filepdf.
'_preview.png';
3268 $relativepathimage = $relativepath.
'_preview.png';
3270 $pdfexists = file_exists($filepdf);
3275 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3277 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3286 if ($pdfexists && !$error) {
3287 $heightforphotref = 80;
3288 if (!empty(
$conf->dol_optimize_smallscreen)) {
3289 $heightforphotref = 60;
3292 if (file_exists($fileimage)) {
3293 $phototoshow =
'<div class="photoref">';
3294 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
3295 $phototoshow .=
'</div>';
3298 } elseif (!$phototoshow) {
3299 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0);
3303 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3304 $morehtmlleft .= $phototoshow;
3305 $morehtmlleft .=
'</div>';
3309 if (empty($phototoshow)) {
3310 if (
$object->element ==
'action') {
3312 $cssclass =
'photorefcenter';
3313 $nophoto =
img_picto(
'No photo',
'title_agenda');
3316 $cssclass =
'photorefcenter';
3318 $prefix =
'object_';
3322 if (strpos($picto,
'fontawesome_') !==
false) {
3325 $nophoto =
img_picto(
'No photo', $prefix.$picto);
3327 $morehtmlleft .=
'<!-- No photo to show -->';
3328 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3329 $morehtmlleft .= $nophoto;
3330 $morehtmlleft .=
'</div></div>';
3337 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
3340 if (
$object->element ==
'societe') {
3341 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3344 $morehtmlstatus .=
$object->getLibStatut(6);
3346 } elseif (
$object->element ==
'product') {
3348 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3349 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3351 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
3353 $morehtmlstatus .=
' ';
3355 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3356 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3358 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
3360 } elseif (in_array(
$object->element, array(
'salary'))) {
3361 '@phan-var-force Salary $object';
3363 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3366 $morehtmlstatus .= $tmptxt;
3367 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3368 '@phan-var-force Facture|FactureFournisseur|CommonInvoice $object';
3369 $totalallpayments =
$object->getSommePaiement(0);
3370 $totalallpayments +=
$object->getSumCreditNotesUsed(0);
3371 $totalallpayments +=
$object->getSumDepositsUsed(0);
3372 $tmptxt =
$object->getLibStatut(6, $totalallpayments);
3373 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3374 $tmptxt =
$object->getLibStatut(5, $totalallpayments);
3376 $morehtmlstatus .= $tmptxt;
3377 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3378 '@phan-var-force ChargeSociales|Loan|Tva $object';
3380 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3383 $morehtmlstatus .= $tmptxt;
3384 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3386 $morehtmlstatus .=
$object->getLibStatut(5);
3388 $morehtmlstatus .=
$object->getLibStatut(4);
3390 } elseif (
$object->element ==
'facturerec') {
3391 '@phan-var-force FactureRec $object';
3392 if (
$object->frequency == 0) {
3393 $morehtmlstatus .=
$object->getLibStatut(2);
3395 $morehtmlstatus .=
$object->getLibStatut(5);
3397 } elseif (
$object->element ==
'project_task') {
3398 $tmptxt =
$object->getLibStatut(4);
3399 $morehtmlstatus .= $tmptxt;
3400 } elseif (method_exists(
$object,
'getLibStatut')) {
3401 $tmptxt =
$object->getLibStatut(6);
3402 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3403 $tmptxt =
$object->getLibStatut(5);
3405 $morehtmlstatus .= $tmptxt;
3409 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3411 if (method_exists(
$object,
'getVentilExportCompta')) {
3412 $accounted =
$object->getVentilExportCompta(1);
3413 $langs->load(
"accountancy");
3414 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ?
'<a href="'.DOL_URL_ROOT.
'/accountancy/bookkeeping/list.php?search_mvt_num='.((int) $accounted).
'">'.$langs->trans(
"Accounted").
'</a>' : $langs->trans(
"NotYetAccounted")).
'</span>';
3419 if (!empty(
$object->name_alias)) {
3420 '@phan-var-force Societe $object';
3421 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3425 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3427 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3431 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3434 $morehtmlref .=
'<div class="refidno refaddress">';
3435 $morehtmlref .= $moreaddress;
3436 $morehtmlref .=
'</div>';
3440 $morehtmlref .=
'<div style="clear: both;"></div>';
3441 $morehtmlref .=
'<div class="refidno opacitymedium">';
3442 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3443 $morehtmlref .=
'</div>';
3446 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3447 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3450 } elseif (empty($reshook)) {
3451 $morehtmlref .= $hookmanager->resPrint;
3452 } elseif ($reshook > 0) {
3453 $morehtmlref = $hookmanager->resPrint;
3461 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3462 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3464 print
'<div class="underrefbanner clearboth"></div>';
3476function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3480 if ($fieldrequired) {
3481 $ret .=
'<span class="fieldrequired">';
3483 $ret .=
'<label for="'.$fieldkey.
'">';
3484 $ret .= $langs->trans($langkey);
3486 if ($fieldrequired) {
3507 global $langs, $hookmanager;
3510 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3515 $ret .= (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->
address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->
address)));
3518 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3520 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3521 $ret .= (($ret && $town) ? $sep :
'').$town;
3524 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3527 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3529 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3531 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3532 $ret .= ($ret ? $sep :
'').$town;
3534 $ret .= ($ret ?
", " :
'').
$object->state;
3537 $ret .= ($ret ? $sep :
'').
$object->zip;
3539 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3541 $ret .= ($ret ? $sep :
'').
$object->zip;
3542 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3543 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3545 $ret .= $sep.$object->state;
3547 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3550 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3552 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3554 $ret .= ($ret ? $sep :
'').
$object->zip;
3555 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3556 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3557 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3560 $town = (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3561 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3562 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3563 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3564 $ret .= ($ret ?
", " :
'').
$object->state;
3568 if (!is_object($outputlangs)) {
3569 $outputlangs = $langs;
3572 $langs->load(
"dict");
3573 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3576 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3577 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3581 $ret .= $hookmanager->resPrint;
3598function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3600 if ((abs($ts) <= 0x7FFFFFFF)) {
3603 return 'Error date outside supported range';
3628function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3630 global
$conf, $langs;
3637 if ($tzoutput ===
'auto') {
3638 $tzoutput = (empty(
$conf) ?
'tzserver' : (isset(
$conf->tzuserinputkey) ?
$conf->tzuserinputkey :
'tzserver'));
3643 $offsettz = $offsetdst = 0;
3646 if (is_string($tzoutput)) {
3647 if ($tzoutput ==
'tzserver') {
3649 $offsettzstring = @date_default_timezone_get();
3654 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3656 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3658 if (class_exists(
'DateTimeZone')) {
3659 $user_date_tz =
new DateTimeZone($offsettzstring);
3660 $user_dt =
new DateTime();
3661 $user_dt->setTimezone($user_date_tz);
3662 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3663 $offsettz = $user_dt->getOffset();
3665 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3666 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3671 if (!is_object($outputlangs)) {
3672 $outputlangs = $langs;
3675 $format =
'daytextshort';
3680 $reduceformat = (!empty(
$conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3681 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3682 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3683 if ($formatwithoutreduce != $format) {
3684 $format = $formatwithoutreduce;
3690 if ($format ==
'day') {
3691 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") :
$conf->format_date_short);
3692 } elseif ($format ==
'hour') {
3693 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") :
$conf->format_hour_short);
3694 } elseif ($format ==
'hourduration') {
3695 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") :
$conf->format_hour_short_duration);
3696 } elseif ($format ==
'daytext') {
3697 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") :
$conf->format_date_text);
3698 } elseif ($format ==
'daytextshort') {
3699 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") :
$conf->format_date_text_short);
3700 } elseif ($format ==
'dayhour') {
3701 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") :
$conf->format_date_hour_short);
3702 } elseif ($format ==
'dayhoursec') {
3703 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") :
$conf->format_date_hour_sec_short);
3704 } elseif ($format ==
'dayhourtext') {
3705 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") :
$conf->format_date_hour_text);
3706 } elseif ($format ==
'dayhourtextshort') {
3707 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") :
$conf->format_date_hour_text_short);
3708 } elseif ($format ==
'dayhourlog') {
3710 $format =
'%Y%m%d%H%M%S';
3711 } elseif ($format ==
'dayhourlogsmall') {
3713 $format =
'%y%m%d%H%M';
3714 } elseif ($format ==
'dayhourldap') {
3715 $format =
'%Y%m%d%H%M%SZ';
3716 } elseif ($format ==
'dayhourxcard') {
3717 $format =
'%Y%m%dT%H%M%SZ';
3718 } elseif ($format ==
'dayxcard') {
3720 } elseif ($format ==
'dayrfc') {
3721 $format =
'%Y-%m-%d';
3722 } elseif ($format ==
'dayhourrfc') {
3723 $format =
'%Y-%m-%dT%H:%M:%SZ';
3724 } elseif ($format ==
'standard') {
3725 $format =
'%Y-%m-%d %H:%M:%S';
3728 if ($reduceformat) {
3729 $format = str_replace(
'%Y',
'%y', $format);
3730 $format = str_replace(
'yyyy',
'yy', $format);
3734 if (preg_match(
'/%b/i', $format)) {
3736 $format = str_replace(
'%b',
'__b__', $format);
3737 $format = str_replace(
'%B',
'__B__', $format);
3739 if (preg_match(
'/%a/i', $format)) {
3741 $format = str_replace(
'%a',
'__a__', $format);
3742 $format = str_replace(
'%A',
'__A__', $format);
3747 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', (
string) $time, $reg)) {
3748 dol_print_error(
null,
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]));
3750 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3752 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);
3755 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3756 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3757 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3758 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3759 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3760 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3762 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
3765 $tzo =
new DateTimeZone(
'UTC');
3767 $tzo =
new DateTimeZone(date_default_timezone_get());
3769 $dtts =
new DateTime();
3770 $dtts->setTimestamp($time);
3771 $dtts->setTimezone($tzo);
3772 $newformat = str_replace(
3773 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3774 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3777 $ret = $dtts->format($newformat);
3779 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3780 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3785 if ($time < 100000000000) {
3786 $timetouse = $time + $offsettz + $offsetdst;
3789 $tzo =
new DateTimeZone(
'UTC');
3791 $tzo =
new DateTimeZone(date_default_timezone_get());
3793 $dtts =
new DateTime();
3794 $dtts->setTimestamp($timetouse);
3795 $dtts->setTimezone($tzo);
3796 $newformat = str_replace(
3797 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3798 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3801 $ret = $dtts->format($newformat);
3803 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3804 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3809 $ret =
'Bad value '.$time.
' for date';
3813 if (preg_match(
'/__b__/i', $format)) {
3814 $timetouse = $time + $offsettz + $offsetdst;
3817 $tzo =
new DateTimeZone(
'UTC');
3819 $tzo =
new DateTimeZone(date_default_timezone_get());
3821 $dtts =
new DateTime();
3822 $dtts->setTimestamp($timetouse);
3823 $dtts->setTimezone($tzo);
3824 $month = (int) $dtts->format(
"m");
3825 $month = sprintf(
"%02d", $month);
3826 if ($encodetooutput) {
3827 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3828 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3830 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3831 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3834 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3835 $ret = str_replace(
'__B__', $monthtext, $ret);
3839 if (preg_match(
'/__a__/i', $format)) {
3841 $timetouse = $time + $offsettz + $offsetdst;
3844 $tzo =
new DateTimeZone(
'UTC');
3846 $tzo =
new DateTimeZone(date_default_timezone_get());
3848 $dtts =
new DateTime();
3849 $dtts->setTimestamp($timetouse);
3850 $dtts->setTimezone($tzo);
3851 $w = $dtts->format(
"w");
3852 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3854 $ret = str_replace(
'__A__', $dayweek, $ret);
3855 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3882function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3884 if ($timestamp ===
'') {
3888 $datetimeobj =
new DateTime();
3889 $datetimeobj->setTimestamp($timestamp);
3890 if ($forcetimezone) {
3891 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3894 'year' => ((
int) date_format($datetimeobj,
'Y')),
3895 'mon' => ((
int) date_format($datetimeobj,
'm')),
3896 'mday' => ((
int) date_format($datetimeobj,
'd')),
3897 'wday' => ((
int) date_format($datetimeobj,
'w')),
3898 'yday' => ((
int) date_format($datetimeobj,
'z')),
3899 'hours' => ((
int) date_format($datetimeobj,
'H')),
3900 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3901 'seconds' => ((
int) date_format($datetimeobj,
's')),
3929function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3934 if ($gm ===
'auto') {
3935 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
3940 if ($hour == -1 || empty($hour)) {
3943 if ($minute == -1 || empty($minute)) {
3946 if ($second == -1 || empty($second)) {
3952 if (!$month || !$day) {
3961 if ($hour < 0 || $hour > 24) {
3964 if ($minute < 0 || $minute > 60) {
3967 if ($second < 0 || $second > 60) {
3972 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3973 $default_timezone = @date_default_timezone_get();
3974 $localtz =
new DateTimeZone($default_timezone);
3975 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3977 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3979 $localtz =
new DateTimeZone($default_timezone);
3981 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3982 $default_timezone = @date_default_timezone_get();
3984 } elseif (strrpos($gm,
"tz,") !==
false) {
3985 $timezone = str_replace(
"tz,",
"", $gm);
3987 $localtz =
new DateTimeZone($timezone);
3989 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3993 if (empty($localtz)) {
3994 $localtz =
new DateTimeZone(
'UTC');
3998 $dt =
new DateTime(
'now', $localtz);
3999 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
4000 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
4001 $date = $dt->getTimestamp();
4017function dol_now($mode =
'auto')
4021 if ($mode ===
'auto') {
4025 if ($mode ==
'gmt') {
4027 } elseif ($mode ==
'tzserver') {
4028 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
4030 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
4036 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
4039 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
4040 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
4041 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
4058 global
$conf, $langs;
4061 if (!empty(
$conf->dol_optimize_smallscreen)) {
4066 if (empty($shortvalue) || $size < ($level * 10)) {
4068 $textunitshort = $langs->trans(
"b");
4069 $textunitlong = $langs->trans(
"Bytes");
4071 $ret = round($size / $level, 0);
4072 $textunitshort = $langs->trans(
"Kb");
4073 $textunitlong = $langs->trans(
"KiloBytes");
4076 if (empty($shortunit)) {
4077 $ret .=
' '.$textunitlong;
4079 $ret .=
' '.$textunitshort;
4095function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
4103 $linkstart =
'<a href="';
4104 if (!preg_match(
'/^http/i', $url)) {
4105 $linkstart .=
'http://';
4110 $linkstart .=
' target="'.$target.
'"';
4112 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
4116 if (!preg_match(
'/^http/i', $url)) {
4123 if ($morecss ==
'float') {
4124 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
4126 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
4143function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0, $morecss =
'paddingrightonly')
4145 global $user, $langs, $hookmanager;
4156 if (empty($email)) {
4160 if ($addlink == 1) {
4161 $newemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="';
4162 if (!preg_match(
'/^mailto:/i', $email)) {
4163 $newemail .=
'mailto:';
4165 $newemail .= $email;
4166 $newemail .=
'" target="_blank">';
4168 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4173 $newemail .= $email;
4175 $newemail .=
'</a>';
4177 $langs->load(
"errors");
4178 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
4181 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4183 $linktoaddaction =
'';
4185 $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>';
4187 if ($linktoaddaction) {
4188 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
4191 } elseif ($addlink ===
'thirdparty') {
4192 $tmpnewemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="'.DOL_URL_ROOT.
'/societe/card.php?socid='.$socid.
'&action=presend&mode=init#formmailbeforetitle">';
4193 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4194 if ($withpicto == 1) {
4195 $tmpnewemail .= $newemail;
4197 $tmpnewemail .=
'</a>';
4199 $newemail = $tmpnewemail;
4201 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
4204 $langs->load(
"errors");
4205 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
4215 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
4217 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
4221 $rep .= $hookmanager->resPrint;
4236 $socialnetworks = array();
4238 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
4239 $cachekey =
'socialnetworks_' .
$conf->entity;
4241 if (!is_null($dataretrieved)) {
4242 $socialnetworks = $dataretrieved;
4244 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
4245 $sql .=
" WHERE entity=".$conf->entity;
4246 $resql = $db->query($sql);
4248 while ($obj = $db->fetch_object($resql)) {
4249 $socialnetworks[$obj->code] = array(
4250 'rowid' => $obj->rowid,
4251 'label' => $obj->label,
4253 'icon' => $obj->icon,
4254 'active' => $obj->active,
4260 return $socialnetworks;
4275 global $hookmanager, $langs, $user;
4279 if (empty($value)) {
4283 if (!empty($type)) {
4284 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4286 $htmllink .=
'<span class="fab pictofixedwidth ' . ($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link') .
'"></span>';
4287 if ($type ==
'skype') {
4289 $htmllink .=
' <a href="skype:';
4291 $htmllink .=
'?call" alt="' . $langs->trans(
"Call") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Call") .
' ' . $value) .
'">';
4292 $htmllink .=
'<img src="' . DOL_URL_ROOT .
'/theme/common/skype_callbutton.png" border="0">';
4293 $htmllink .=
'</a><a href="skype:';
4295 $htmllink .=
'?chat" alt="' . $langs->trans(
"Chat") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Chat") .
' ' . $value) .
'">';
4296 $htmllink .=
'<img class="paddingleft" src="' . DOL_URL_ROOT .
'/theme/common/skype_chatbutton.png" border="0">';
4297 $htmllink .=
'</a>';
4298 if (($contactid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4299 $addlink =
'AC_SKYPE';
4302 $link =
'<a href="' . DOL_URL_ROOT .
'/comm/action/card.php?action=create&backtopage=1&actioncode=' . $addlink .
'&contactid=' . $contactid .
'&socid=' . $socid .
'">' .
img_object($langs->trans(
"AddAction"),
"calendar") .
'</a>';
4304 $htmllink .= ($link ?
' ' . $link :
'');
4307 if (!empty($dictsocialnetworks[$type][
'url'])) {
4308 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4309 if ($tmpvirginurl) {
4310 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4311 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4313 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4314 if ($tmpvirginurl3) {
4315 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4316 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4319 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4320 if ($tmpvirginurl2) {
4321 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4322 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4325 if (preg_match(
'/^https?:\/\//i', $value)) {
4328 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4330 $valuetoshow = $value;
4331 $valuetoshow = preg_replace(
'/https:\/\/www\.(twitter|x|linkedin)\.com\/?/',
'', $valuetoshow);
4332 if (preg_match(
'/^https?:\/\//i', $link)) {
4341 $htmllink .=
'</div>';
4343 $langs->load(
"errors");
4344 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4348 $parameters = array(
4350 'cid' => $contactid,
4353 'dictsocialnetworks' => $dictsocialnetworks,
4356 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4360 $htmllink .= $hookmanager->resPrint;
4375function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4379 if (empty($profID) || empty($profIDtype)) {
4382 if (empty($countrycode)) {
4383 $countrycode = $mysoc->country_code;
4385 $newProfID = $profID;
4386 $id = substr($profIDtype, -1);
4388 if (strtoupper($countrycode) ==
'FR') {
4394 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
4398 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
4402 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
4404 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4406 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
4409 if (!empty($addcpButton)) {
4432function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4434 global
$conf, $user, $langs, $mysoc, $hookmanager;
4437 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4438 if (empty($phone)) {
4444 if (empty($countrycode) && is_object($mysoc)) {
4445 $countrycode = $mysoc->country_code;
4449 if (!empty(
$conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4454 $newphonewa = $phone;
4455 if (strtoupper($countrycode) ==
"FR") {
4458 $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);
4460 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4462 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4464 $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);
4466 $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);
4468 $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);
4470 } elseif (strtoupper($countrycode) ==
"CA") {
4472 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4474 } elseif (strtoupper($countrycode) ==
"PT") {
4476 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4478 } elseif (strtoupper($countrycode) ==
"SR") {
4480 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4482 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4484 } elseif (strtoupper($countrycode) ==
"DE") {
4486 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4488 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4490 } elseif (strtoupper($countrycode) ==
"ES") {
4492 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4494 } elseif (strtoupper($countrycode) ==
"BF") {
4496 $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);
4498 } elseif (strtoupper($countrycode) ==
"RO") {
4500 $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);
4502 } elseif (strtoupper($countrycode) ==
"TR") {
4504 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4506 } elseif (strtoupper($countrycode) ==
"US") {
4508 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4510 } elseif (strtoupper($countrycode) ==
"MX") {
4512 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4514 $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);
4516 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4518 } elseif (strtoupper($countrycode) ==
"ML") {
4520 $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);
4522 } elseif (strtoupper($countrycode) ==
"TH") {
4524 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4526 $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);
4528 } elseif (strtoupper($countrycode) ==
"MU") {
4531 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4533 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4535 } elseif (strtoupper($countrycode) ==
"ZA") {
4537 $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);
4539 } elseif (strtoupper($countrycode) ==
"SY") {
4541 $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);
4543 $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);
4545 } elseif (strtoupper($countrycode) ==
"AE") {
4547 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4549 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4551 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4553 } elseif (strtoupper($countrycode) ==
"DZ") {
4555 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4557 } elseif (strtoupper($countrycode) ==
"BE") {
4559 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4561 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4563 } elseif (strtoupper($countrycode) ==
"PF") {
4565 $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);
4567 } elseif (strtoupper($countrycode) ==
"CO") {
4569 $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);
4571 } elseif (strtoupper($countrycode) ==
"JO") {
4573 $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);
4575 } elseif (strtoupper($countrycode) ==
"JM") {
4577 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4579 } elseif (strtoupper($countrycode) ==
"MG") {
4581 $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);
4583 } elseif (strtoupper($countrycode) ==
"GB") {
4585 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4587 } elseif (strtoupper($countrycode) ==
"CH") {
4589 $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);
4591 $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);
4593 } elseif (strtoupper($countrycode) ==
"TN") {
4595 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4597 } elseif (strtoupper($countrycode) ==
"GF") {
4599 $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);
4601 } elseif (strtoupper($countrycode) ==
"GP") {
4603 $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);
4605 } elseif (strtoupper($countrycode) ==
"MQ") {
4607 $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);
4609 } elseif (strtoupper($countrycode) ==
"IT") {
4611 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4613 $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);
4615 } elseif (strtoupper($countrycode) ==
"AU") {
4619 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4621 } elseif (strtoupper($countrycode) ==
"LU") {
4624 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4626 $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);
4628 $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);
4630 $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);
4632 } elseif (strtoupper($countrycode) ==
"PE") {
4635 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4637 $newphonewa =
'+51'.$newphone;
4638 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4640 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4642 $newphonewa = $newphone;
4643 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3).$separ.substr($newphone, 14, 3);
4645 } elseif (strtoupper($countrycode) ==
"IN") {
4647 if ($withpicto ==
'phone') {
4648 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 4).$separ.substr($newphone, 9, 4);
4650 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 5).$separ.substr($newphone, 8, 5);
4655 $newphoneastart = $newphoneaend =
'';
4656 if (!empty($addlink)) {
4657 if ($addlink ==
'tel' ||
$conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4658 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4659 $newphoneaend .=
'</a>';
4660 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4661 if (empty($user->clicktodial_loaded)) {
4662 $user->fetch_clicktodial();
4666 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4667 if (!empty($user->clicktodial_url)) {
4668 $urlmask = $user->clicktodial_url;
4671 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4672 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4673 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4675 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4677 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4678 '__PHONETO__' => urlencode($phone),
4679 '__LOGIN__' => $clicktodial_login,
4680 '__PASS__' => $clicktodial_password);
4684 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4685 $newphoneaend =
'</a>';
4688 $newphoneastart =
'<a href="'.$url.
'"';
4690 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4692 $newphoneastart .=
'>';
4693 $newphoneaend .=
'</a>';
4698 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4700 $addlinktoagenda =
'';
4701 if ($addlink ==
'AC_FAX') {
4705 $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>';
4707 if ($addlinktoagenda) {
4708 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4713 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4715 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4716 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4719 if (empty($titlealt)) {
4720 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4725 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4726 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4727 $rep .= $hookmanager->resPrint;
4729 if (empty($reshook)) {
4732 if ($withpicto ==
'fax') {
4733 $picto =
'phoning_fax';
4734 } elseif ($withpicto ==
'phone') {
4736 } elseif ($withpicto ==
'mobile') {
4737 $picto =
'phoning_mobile';
4742 if ($adddivfloat == 1) {
4743 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'">';
4744 } elseif (empty($adddivfloat)) {
4745 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
'>';
4748 $rep .= $newphoneastart;
4749 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4750 if ($separ !=
'hidenum') {
4751 $rep .= ($withpicto ?
' ' :
'').$newphone;
4753 $rep .= $newphoneaend;
4755 if ($adddivfloat == 1) {
4757 } elseif (empty($adddivfloat)) {
4778 if (!isset(
$conf->cache[
'resolveips'])) {
4779 $conf->cache[
'resolveips'] = array();
4785 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4789 $ret .=
'('.$countrycode.
')';
4797 if (in_array($mode, [0, 2])) {
4800 if (!array_key_exists($ip,
$conf->cache[
'resolveips'])) {
4801 $domain = gethostbyaddr($ip);
4802 $conf->cache[
'resolveips'][$ip] = $domain;
4804 $domain =
$conf->cache[
'resolveips'][$ip];
4832 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4839 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4840 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4841 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4842 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4844 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4847 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_CLIENT_IP']);
4850 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
4866 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4868 } 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') {
4884 if (isModEnabled(
'geoipmaxmind')) {
4890 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4891 $geoip =
new DolGeoIP(
'country', $datafile);
4893 $countrycode = $geoip->getCountryCodeFromIP($ip);
4900 return $countrycode;
4912 global
$conf, $langs, $user;
4916 if (isModEnabled(
'geoipmaxmind')) {
4921 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4922 $geoip =
new DolGeoIP(
'country', $datafile);
4923 $countrycode = $geoip->getCountryCodeFromIP($ip);
4924 $ret = $countrycode;
4943 global $hookmanager;
4949 $parameters = array(
'element' => $element,
'id' =>
$id);
4950 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4951 $out .= $hookmanager->resPrint;
4953 if (empty($reshook)) {
4954 if (empty($charfornl)) {
4955 $out .= nl2br((
string) $address);
4957 $out .= preg_replace(
'/[\r\n]+/', $charfornl, (
string) $address);
4961 $showgmap = $showomap = 0;
4962 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4965 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4968 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4971 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4974 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4977 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4980 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4983 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4988 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4991 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.
$id, 1);
4992 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
5014function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
5016 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
5019 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
5022 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
5040 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
5041 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
5044 if (function_exists(
'getmxrr')) {
5047 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
5048 if (count($mxhosts) > 1) {
5051 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
5088 $tmparray = explode(
' ', $s);
5089 foreach ($tmparray as $tmps) {
5104function dol_strlen($string, $stringencoding =
'UTF-8')
5106 if (is_null($string)) {
5110 if (function_exists(
'mb_strlen')) {
5111 return mb_strlen($string, $stringencoding);
5113 return strlen($string);
5127function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
5131 if (empty($stringencoding)) {
5132 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
5136 if (empty($trunconbytes)) {
5137 if (function_exists(
'mb_substr')) {
5138 $ret = mb_substr($string, $start, $length, $stringencoding);
5140 $ret = substr($string, $start, $length);
5143 if (function_exists(
'mb_strcut')) {
5144 $ret = mb_strcut($string, $start, $length, $stringencoding);
5146 $ret = substr($string, $start, $length);
5166function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
5174 if (empty($stringencoding)) {
5175 $stringencoding =
'UTF-8';
5178 if (!empty(
$conf->dol_optimize_smallscreen) &&
$conf->dol_optimize_smallscreen == 1 && $display == 1) {
5179 $size = round($size / 3);
5183 if ($trunc ==
'right') {
5185 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5187 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
5192 } elseif ($trunc ==
'middle') {
5194 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5195 $size1 = (int) round($size / 2);
5196 $size2 = (int) round($size / 2);
5197 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
5201 } elseif ($trunc ==
'left') {
5203 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5205 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
5209 } elseif ($trunc ==
'wrap') {
5211 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5217 return 'BadParam3CallingDolTrunc';
5231 $type2picto = array(
5232 'varchar' =>
'font',
5235 'int' =>
'sort-numeric-down',
5236 'double' =>
'sort-numeric-down',
5237 'price' =>
'currency',
5238 'pricecy' =>
'multicurrency',
5239 'password' =>
'key',
5240 'boolean' =>
'check-square',
5241 'date' =>
'calendar',
5242 'datetime' =>
'calendar',
5243 'duration' =>
'hourglass',
5249 'sellist' =>
'list',
5250 'stars' =>
'fontawesome_star_fas',
5251 'radio' =>
'check-circle',
5252 'checkbox' =>
'list',
5253 'chkbxlst' =>
'list',
5255 'icon' =>
"question",
5256 'point' =>
"country",
5257 'multipts' =>
'country',
5258 'linestrg' =>
"country",
5259 'polygon' =>
"country",
5260 'separate' =>
'minus'
5263 if (!empty($type2picto[$key])) {
5264 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
5267 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
5293function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2, $allowothertags = array())
5298 $url = DOL_URL_ROOT;
5299 $theme = isset(
$conf->theme) ?
$conf->theme :
null;
5300 $path =
'theme/'.$theme;
5301 if (empty($picto)) {
5306 if ($pictoisfullpath) {
5308 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5311 $fullpathpicto = $picto;
5313 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5314 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5315 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5320 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5321 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5322 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5325 $pictoconvertkey = array(
'facture' =>
'bill',
'shipping' =>
'shipment',
'fichinter' =>
'intervention',
'agenda' =>
'calendar',
'invoice_supplier' =>
'supplier_invoice',
'order_supplier' =>
'supplier_order');
5326 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5327 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5330 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5332 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5333 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5336 if ($pictowithouttext ==
'file-o') {
5337 $pictowithouttext =
'file';
5340 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5341 $marginleftonlyshort = 0;
5343 if (!empty($pictowithouttextarray[1])) {
5345 $fakey =
'fa-'.$pictowithouttextarray[0];
5346 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5347 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5348 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5350 $fakey =
'fa-'.$pictowithouttext;
5360 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5361 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5362 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5364 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5365 $morestyle = $reg[1];
5366 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5368 $moreatt = trim($moreatt);
5370 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5371 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5372 $enabledisablehtml .=
'</span>';
5374 return $enabledisablehtml;
5378 $fakey = $pictowithouttext;
5382 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'))) {
5385 if (in_array($pictowithouttext, array(
'black-tie',
'discord',
'facebook',
'flickr',
'github',
'google',
'google-plus-g',
'instagram',
'linkedin',
'meetup',
'microsoft',
'pinterest',
'skype',
'slack',
'twitter',
'reddit',
'snapchat',
'stripe',
'stripe-s',
'tumblr',
'viadeo',
'whatsapp',
'youtube'))) {
5391 if ($pictowithouttext ==
'off') {
5392 $fakey =
'fa-square';
5394 } elseif ($pictowithouttext ==
'on') {
5395 $fakey =
'fa-check-square';
5397 } elseif ($pictowithouttext ==
'listlight') {
5398 $fakey =
'fa-download';
5399 $marginleftonlyshort = 1;
5400 } elseif ($pictowithouttext ==
'printer') {
5401 $fakey =
'fa-print';
5403 } elseif ($pictowithouttext ==
'note') {
5404 $fakey =
'fa-sticky-note';
5405 $marginleftonlyshort = 1;
5406 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5407 $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');
5408 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5409 if (preg_match(
'/selected/', $pictowithouttext)) {
5412 $marginleftonlyshort = 1;
5413 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5414 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5416 $fakey =
'fa-'.$pictowithouttext;
5419 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5420 $morecss .=
' em092';
5422 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'info_black',
'project',
'workstation'))) {
5423 $morecss .=
' em088';
5425 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5426 $morecss .=
' em080';
5430 $arrayconvpictotomarginleftonly = array(
5431 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5432 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_grey',
'switch_on_red',
'switch_off',
5433 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5435 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5436 $marginleftonlyshort = 0;
5440 $arrayconvpictotomorcess = array(
5441 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5442 'bank_account' =>
'infobox-bank_account',
5443 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5444 'bookcal' =>
'infobox-action',
5445 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5446 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5447 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5448 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5449 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5450 'incoterm' =>
'infobox-supplier_proposal',
5451 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5452 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5453 'order' =>
'infobox-commande',
5454 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5455 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5456 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'info_black' =>
'font-status1',
'invoice' =>
'infobox-commande',
5457 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5458 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5459 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5460 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5461 'resource' =>
'infobox-action',
5462 'salary' =>
'infobox-bank_account',
'shapes' =>
'infobox-adherent',
'shipment' =>
'infobox-commande',
'stripe' =>
'infobox-bank_account',
'supplier_invoice' =>
'infobox-order_supplier',
'supplier_invoicea' =>
'infobox-order_supplier',
'supplier_invoiced' =>
'infobox-order_supplier',
5463 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5464 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5465 'vat' =>
'infobox-bank_account',
5467 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode',
'calendarpertype' =>
'imgforviewmode'
5469 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5470 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5474 $arrayconvpictotocolor = array(
5475 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5476 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5477 'dynamicprice' =>
'#a69944',
5478 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5480 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5481 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5482 'other' =>
'#ddd',
'world' =>
'#986c6a',
5483 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5485 'search-plus' =>
'#808080',
'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5486 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5487 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5488 'website' =>
'#304',
'workstation' =>
'#a69944'
5490 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5491 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5498 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5499 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5500 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5502 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5503 $morestyle = $reg[1];
5504 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5506 $moreatt = trim($moreatt);
5508 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5509 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5510 $enabledisablehtml .=
'</span>';
5512 return $enabledisablehtml;
5519 } elseif (!empty(
$conf->modules_parts[
'theme']) && array_key_exists($theme,
$conf->modules_parts[
'theme'])) {
5520 $path = $theme.
'/theme/'.$theme;
5525 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5531 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5536 foreach (
$conf->file->dol_document_root as $type => $dirroot) {
5537 if ($type ==
'main') {
5541 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5542 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5548 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5552 return $fullpathpicto;
5556 return '<img src="'.$fullpathpicto.
'"'.($notitle ?
'' :
' alt="'.dolPrintHTMLForAttribute($alt, 0, $allowothertags).
'"').(($notitle || empty($titlealt)) ?
'' :
' title="'.
dolPrintHTMLForAttribute($titlealt, 0, $allowothertags).
'"').($moreatt ?
' '.$moreatt.($morecss ?
' class="'.$morecss.
'"' :
'') :
' class="inline-block'.($morecss ?
' '.$morecss :
'').
'"').
'>';
5567 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
5568 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
5569 'back',
'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
5570 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
'hourglass',
5571 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
5572 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
5573 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-up',
5574 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
5575 'commercial',
'companies',
5576 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
5577 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
5578 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
5579 'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
5580 'hands-helping',
'help',
'holiday',
5581 'id-card',
'images',
'incoterm',
'info',
'info_black',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
5582 'key',
'knowledgemanagement',
5583 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
5584 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
5585 'off',
'on',
'order',
5586 'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
5587 'resize',
'search',
'service',
'stats',
'stock',
5588 'security',
'setup',
'share-alt',
'sign-out',
'split',
'stripe',
'stripe-s',
'switch_off',
'switch_on',
'switch_on_grey',
'switch_on_warning',
'switch_on_red',
'tools',
'unlink',
'uparrow',
'user',
'user-tie',
'vcard',
'wrench',
5589 'discord',
'facebook',
'flickr',
'instagram',
'linkedin',
'github',
'google',
'jabber',
'meetup',
'microsoft',
'skype',
'slack',
'twitter',
'pinterest',
'reddit',
'snapchat',
'tumblr',
'youtube',
'viadeo',
'google-plus-g',
'whatsapp',
5590 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
5591 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
5592 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
5593 'technic',
'ticket',
5595 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
5596 'search-plus',
'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'store',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
5597 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
5598 'uncheck',
'undo',
'url',
'user-cog',
'user-injured',
'user-md',
'upload',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
5599 'conferenceorbooth',
'eventorganization',
5600 'stamp',
'signature',
5617 $arrayconvpictotofa = array(
5618 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
5619 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
5620 'back' =>
'arrow-left',
'bank_account' =>
'university',
5621 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
5622 'bookcal' =>
'calendar-check',
5623 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
5625 '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',
5626 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
5627 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
5628 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
5629 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
5630 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
5631 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
5632 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
5633 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
5634 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
5635 'info' =>
'info-circle',
'info_black' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
5636 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
5637 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
5638 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
5639 'sign-out' =>
'sign-out-alt',
5640 'switch_off' =>
'toggle-off',
'switch_on' =>
'toggle-on',
'switch_on_grey' =>
'toggle-on',
'switch_on_warning' =>
'toggle-on',
'switch_on_red' =>
'toggle-on',
'check' =>
'check',
'bookmark' =>
'star',
5641 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
5642 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
'calendarpertype' =>
'table',
5643 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
5644 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
5645 'other' =>
'square',
5646 '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',
5647 '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',
5648 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
5649 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
5650 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
5651 'service' =>
'concierge-bell',
5652 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
5653 'status' =>
'stop-circle',
5654 'stripe' =>
'stripe-s',
'supplier' =>
'building',
5655 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
5656 'title_agenda' =>
'calendar-alt',
5657 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
5658 'jabber' =>
'comment',
5659 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
5660 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
5661 'webportal' =>
'door-open'
5664 if (
$conf->currency ==
'EUR') {
5665 $arrayconvpictotofa[
'currency'] =
'euro-sign';
5666 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
5668 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
5669 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
5672 return $arrayconvpictotofa;
5690function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $allowothertags = array())
5692 if (strpos($picto,
'^') === 0) {
5693 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
5695 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
5710function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5714 if (is_numeric($picto)) {
5717 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5718 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5722 $path = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/weather/'.$picto;
5724 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5738function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5742 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5746 if ($pictoisfullpath) {
5749 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5752 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.
$conf->theme.
'/img/'.$picto;
5754 if (file_exists($themepath)) {
5760 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5776function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5780 if (empty($titlealt) || $titlealt ==
'default') {
5781 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5783 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5784 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5786 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5787 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5789 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5790 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5792 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5793 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5795 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5797 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5801 if (!is_numeric($numaction)) {
5805 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5815function img_pdf($titlealt =
'default', $size = 3)
5819 if ($titlealt ==
'default') {
5820 $titlealt = $langs->trans(
'Show');
5823 return img_picto($titlealt,
'pdf'.$size.
'.png');
5833function img_edit_add($titlealt =
'default', $other =
'')
5837 if ($titlealt ==
'default') {
5838 $titlealt = $langs->trans(
'Add');
5841 return img_picto($titlealt,
'edit_add.png', $other);
5854 if ($titlealt ==
'default') {
5855 $titlealt = $langs->trans(
'Remove');
5858 return img_picto($titlealt,
'edit_remove.png', $other);
5869function img_edit($titlealt =
'default', $float = 0, $other =
'')
5873 if ($titlealt ==
'default') {
5874 $titlealt = $langs->trans(
'Modify');
5877 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5888function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5892 if ($titlealt ==
'default') {
5893 $titlealt = $langs->trans(
'View');
5896 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5898 return img_picto($titlealt,
'eye', $moreatt);
5909function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5913 if ($titlealt ==
'default') {
5914 $titlealt = $langs->trans(
'Delete');
5917 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5927function img_printer($titlealt =
"default", $other =
'')
5930 if ($titlealt ==
"default") {
5931 $titlealt = $langs->trans(
"Print");
5933 return img_picto($titlealt,
'printer.png', $other);
5943function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5947 if ($titlealt ==
'default') {
5948 $titlealt = $langs->trans(
'Split');
5951 return img_picto($titlealt,
'split.png', $other);
5961function img_help($usehelpcursor = 1, $usealttitle = 1)
5966 if (is_string($usealttitle)) {
5969 $usealttitle = $langs->trans(
'Info');
5973 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5982function img_info($titlealt =
'default')
5986 if ($titlealt ==
'default') {
5987 $titlealt = $langs->trans(
'Informations');
5990 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
6001function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
6005 if ($titlealt ==
'default') {
6006 $titlealt = $langs->trans(
'Warning');
6010 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
6019function img_error($titlealt =
'default')
6023 if ($titlealt ==
'default') {
6024 $titlealt = $langs->trans(
'Error');
6027 return img_picto($titlealt,
'error.png');
6037function img_next($titlealt =
'default', $moreatt =
'')
6041 if ($titlealt ==
'default') {
6042 $titlealt = $langs->trans(
'Next');
6046 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
6056function img_previous($titlealt =
'default', $moreatt =
'')
6060 if ($titlealt ==
'default') {
6061 $titlealt = $langs->trans(
'Previous');
6065 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
6076function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
6080 if ($titlealt ==
'default') {
6081 $titlealt = $langs->trans(
'Down');
6084 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
6095function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
6099 if ($titlealt ==
'default') {
6100 $titlealt = $langs->trans(
'Up');
6103 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
6114function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
6118 if ($titlealt ==
'default') {
6119 $titlealt = $langs->trans(
'Left');
6122 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
6133function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
6137 if ($titlealt ==
'default') {
6138 $titlealt = $langs->trans(
'Right');
6141 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
6151function img_allow($allow, $titlealt =
'default')
6155 if ($titlealt ==
'default') {
6156 $titlealt = $langs->trans(
'Active');
6160 return img_picto($titlealt,
'tick.png');
6175 if (is_null($morecss)) {
6179 if ($brand ==
'visa' || $brand ==
'Visa') {
6181 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
6182 $brand =
'cc-mastercard';
6183 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
6185 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
6186 $brand =
'cc-discover';
6187 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
6189 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
6190 $brand =
'cc-diners-club';
6191 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
6192 $brand =
'credit-card';
6195 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
6206function img_mime($file, $titlealt =
'', $morecss =
'')
6208 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
6214 if (empty($titlealt)) {
6215 $titlealt =
'Mime type: '.$mimetype;
6219 return '<i class="fa fa-'.$mimefa.
' '.(preg_match(
'/pictofixedwidth/', $morecss) ?
'' :
'paddingright ').($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.
dolPrintHTMLForAttribute($titlealt).
'"' :
'').
'></i>';
6230function img_search($titlealt =
'default', $other =
'')
6234 if ($titlealt ==
'default') {
6235 $titlealt = $langs->trans(
'Search');
6238 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
6240 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
6241 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
6257 if ($titlealt ==
'default') {
6258 $titlealt = $langs->trans(
'Search');
6261 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
6263 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
6264 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
6281function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
6283 global
$conf, $langs;
6285 if ($infoonimgalt) {
6286 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
6288 if (empty(
$conf->use_javascript_ajax)) {
6289 $textfordropdown =
'';
6292 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
6293 $fa =
'info-circle';
6294 if ($picto ==
'warning') {
6295 $fa =
'exclamation-triangle';
6297 $result = ($nodiv ?
'' :
'<div class="wordbreak '.$class.($morecss ?
' '.$morecss :
'').($textfordropdown ?
' hidden' :
'').
'">').
'<span class="fa fa-'.$fa.
'" title="'.
dol_escape_htmltag($admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note')).
'"></span> ';
6299 $result .= ($nodiv ?
'' :
'</div>');
6301 if ($textfordropdown) {
6302 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
6303 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
6304 jQuery(document).ready(function() {
6305 jQuery(".'.$class.
'text").click(function() {
6306 console.log("toggle text");
6307 jQuery(".'.$class.
'").toggle();
6312 $result = $tmpresult.$result;
6333 global
$conf, $langs, $user, $argv;
6334 global $dolibarr_main_prod;
6341 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
6343 $langs->load(
"main");
6347 $langs->loadLangs(array(
'main',
'errors'));
6349 if ($_SERVER[
'DOCUMENT_ROOT']) {
6350 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
6352 $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";
6354 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
6356 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
6357 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
6358 if (isset(
$conf->global->MAIN_FEATURES_LEVEL)) {
6359 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
6361 if ($user instanceof
User) {
6362 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
6364 if (function_exists(
"phpversion")) {
6365 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
6367 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
6368 if (function_exists(
"php_uname")) {
6369 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
6371 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
6373 $out .=
"<b>" . $langs->trans(
"RequestedUrl") .
":</b> " . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT) :
'') .
"<br>\n";
6374 $out .=
"<b>" . $langs->trans(
"Referer") .
":</b> " . (isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'') .
"<br>\n";
6375 $out .=
"<b>" . $langs->trans(
"MenuManager") .
":</b> " . (isset(
$conf->standard_menu) ?
dol_htmlentities(
$conf->standard_menu, ENT_COMPAT) :
'') .
"<br>\n";
6377 $syslog .=
"url=" . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_escape_htmltag($_SERVER[
"REQUEST_URI"]) :
'');
6378 $syslog .=
", query_string=" . (isset($_SERVER[
"QUERY_STRING"]) ?
dol_escape_htmltag($_SERVER[
"QUERY_STRING"]) :
'');
6380 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
6381 $syslog .=
"pid=".dol_getmypid();
6384 if (!empty(
$conf->modules)) {
6385 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ',
$conf->modules).
"<br>\n";
6388 if (is_object($db)) {
6389 if ($_SERVER[
'DOCUMENT_ROOT']) {
6390 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
6391 $lastqueryerror = $db->lastqueryerror();
6393 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6395 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6396 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6397 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6401 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
6402 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6403 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6404 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6406 $syslog .=
", sql=".$db->lastquery();
6407 $syslog .=
", db_error=".$db->lasterror();
6410 if ($error || $errors) {
6412 if (is_array($error) && is_array($errors)) {
6413 $errors = array_merge($error, $errors);
6414 } elseif (is_array($error)) {
6416 } elseif (is_array($errors) && !empty($error)) {
6417 $errors = array_merge(array($error), $errors);
6418 } elseif (!empty($error)) {
6419 $errors = array_merge(array($error), array($errors));
6422 $langs->load(
"errors");
6424 foreach ($errors as $msg) {
6428 if ($_SERVER[
'DOCUMENT_ROOT']) {
6431 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
6433 $syslog .=
", msg=".$msg;
6436 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
6437 xdebug_print_function_stack();
6438 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
6439 $out .=
'File: '.xdebug_call_file().
"<br>\n";
6440 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
6441 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
6446 if (!headers_sent()) {
6447 if (function_exists(
'top_httphead')) {
6451 http_response_code(202);
6454 if (empty($dolibarr_main_prod)) {
6457 if (empty($langs->defaultlang)) {
6458 $langs->setDefaultLang();
6460 $langs->loadLangs(array(
"main",
"errors"));
6462 print
'This website or feature is currently temporarily 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";
6463 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
6464 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6465 if (!defined(
"MAIN_CORE_ERROR")) {
6466 define(
"MAIN_CORE_ERROR", 1);
6483function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6487 if (empty($email)) {
6491 $langs->load(
"errors");
6494 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
6495 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
6496 if ($errormessage) {
6497 print
'<br><br>'.$errormessage;
6499 if (is_array($errormessages) && count($errormessages)) {
6500 foreach ($errormessages as $mesgtoshow) {
6501 print
'<br><br>'.$mesgtoshow;
6504 print
'</div></div>';
6523function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $param =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6525 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $param, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6546function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6548 global $langs, $form;
6551 if ($moreattrib ==
'class="right"') {
6552 $prefix .=
'right ';
6555 $sortorder = strtoupper((
string) $sortorder);
6564 $tmpsortfield = explode(
',', (
string) $sortfield);
6565 $sortfield1 = trim($tmpsortfield[0]);
6566 $tmpfield = explode(
',', $field);
6567 $field1 = trim($tmpfield[0]);
6569 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6570 $prefix =
'wrapcolumntitle '.$prefix;
6576 $liste_titre =
'liste_titre';
6577 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6578 $liste_titre =
'liste_titre_sel';
6581 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6586 if (empty($thead) && $field && empty($disablesortlink)) {
6587 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6588 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6589 $options = preg_replace(
'/&+/i',
'&', $options);
6590 if (!preg_match(
'/^&/', $options)) {
6591 $options =
'&'.$options;
6594 $sortordertouseinlink =
'';
6595 if ($field1 != $sortfield1) {
6596 if (preg_match(
'/^DESC/i', $sortorder)) {
6597 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6599 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6602 if (preg_match(
'/^ASC/i', $sortorder)) {
6603 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6605 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6608 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6609 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.urlencode($field).
'&sortorder='.urlencode($sortordertouseinlink).
'&begin='.urlencode($begin).$options.
'"';
6615 if (strpos($tooltip,
':') !==
false) {
6616 $tmptooltip = explode(
':', $tooltip);
6618 $tmptooltip = array($tooltip);
6620 $out .= $form->textwithpicto($langs->trans((
string) $name), $langs->trans($tmptooltip[0]), (empty($tmptooltip[2]) ?
'1' : $tmptooltip[2]),
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6622 $out .= $langs->trans((
string) $name);
6625 if (empty($thead) && $field && empty($disablesortlink)) {
6629 if (empty($thead) && $field) {
6630 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6631 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6632 $options = preg_replace(
'/&+/i',
'&', $options);
6633 if (!preg_match(
'/^&/', $options)) {
6634 $options =
'&'.$options;
6637 if (!$sortorder || ($field1 != $sortfield1)) {
6640 if (preg_match(
'/^DESC/', $sortorder)) {
6641 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6643 if (preg_match(
'/^ASC/', $sortorder)) {
6644 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6649 $tagend =
'</'.$tag.
'>';
6651 $out = $tagstart.$sortimg.$out.$tagend;
6666 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6668 print
'<div class="titre">'.$title.
'</div>';
6682function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
6700function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6704 if ($picto ==
'setup') {
6709 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6710 $return .=
'<tr class="toptitle">';
6712 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6714 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6715 $return .=
'<div class="titre inline-block">';
6716 $return .=
'<span class="inline-block valignmiddle">'.$title.
'</span>';
6717 $return .=
'</div>';
6720 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6723 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6725 $return .=
'</tr></table>'.
"\n";
6753function print_barre_liste($title, $page, $file, $options =
'', $sortfield =
'', $sortorder =
'', $morehtmlcenter =
'', $num = -1, $totalnboflines =
'', $picto =
'generic', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limit = -1, $selectlimitsuffix = 0, $hidenavigation = 0, $pagenavastextinput = 0, $morehtmlrightbeforearrow =
'')
6755 global
$conf, $langs;
6758 $savtotalnboflines = $totalnboflines;
6759 if (is_numeric($totalnboflines)) {
6760 $totalnboflines = abs($totalnboflines);
6765 $tmparray = preg_split(
'/<br>/i', $title, 2);
6766 if (!empty($tmparray[1])) {
6767 $title = $tmparray[0];
6768 $subtitle = $tmparray[1];
6771 $page = (int) $page;
6773 if ($picto ==
'setup') {
6774 $picto =
'title_setup.png';
6776 if ((
$conf->browser->name ==
'ie') && $picto ==
'generic') {
6777 $picto =
'title.gif';
6780 $limit =
$conf->liste_limit;
6783 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6791 print
"<!-- Begin print_barre_liste -->\n";
6792 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'">';
6793 print
'<tr class="toptitle">';
6797 if ($picto && $title) {
6798 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
6799 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
6803 print
'<td class="nobordernopadding valignmiddle col-title">';
6804 print
'<div class="titre inline-block">';
6805 print
'<span class="inline-block valignmiddle print-barre-liste">'.$title.
'</span>';
6806 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'' && $totalnboflines > 0) {
6807 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="'.$langs->trans(
"NbRecordQualified").
'">('.$totalnboflines.
')</span>';
6810 if (!empty($subtitle)) {
6811 print
'<br><div class="subtitle inline-block hideonsmartphone">'.$subtitle.
'</div>';
6816 if ($morehtmlcenter && empty(
$conf->dol_optimize_smallscreen)) {
6817 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6821 print
'<td class="nobordernopadding valignmiddle right col-right">';
6822 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6824 $options .=
"&sortfield=".urlencode($sortfield);
6827 $options .=
"&sortorder=".urlencode($sortorder);
6831 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6832 if ($totalnboflines) {
6834 $maxnbofpage = (empty(
$conf->dol_optimize_smallscreen) ? 4 : 0);
6837 $nbpages = ceil($totalnboflines / $limit);
6841 $cpt = ($page - $maxnbofpage);
6847 if (empty($pagenavastextinput)) {
6848 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6850 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6851 } elseif ($cpt == 2) {
6852 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6858 if ($pagenavastextinput) {
6859 if ($cpt == $page) {
6860 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone heightofcombo" name="pageplusone" value="'.($page + 1).
'"></li>';
6864 if ($cpt == $page) {
6865 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6867 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6871 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6873 if (empty($pagenavastextinput)) {
6874 if ($cpt < $nbpages) {
6875 if ($cpt < $nbpages - 2) {
6876 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6877 } elseif ($cpt == $nbpages - 2) {
6878 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6880 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6884 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6887 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6891 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6892 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
6896 if ($pagenavastextinput) {
6903 print
'</table>'.
"\n";
6906 if ($morehtmlcenter && !empty(
$conf->dol_optimize_smallscreen)) {
6907 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6910 print
"<!-- End title -->\n\n";
6929function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
6931 global
$conf, $langs;
6933 print
'<div class="pagination"><ul>';
6934 if ($beforearrows) {
6935 print
'<li class="paginationbeforearrows">';
6936 print $beforearrows;
6940 if (empty($hidenavigation)) {
6941 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
6942 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6943 $pagesizechoices .=
',5000:5000';
6953 print
'<li class="pagination">';
6954 print
'<input onfocus="this.value=null;" onchange="this.blur();" class="flat selectlimit nopadding maxwidth75 right pageplusone" id="limit" name="limit" list="limitlist" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'" value="'.$limit.
'">';
6955 print
'<datalist id="limitlist">';
6957 print
'<li class="paginationcombolimit valignmiddle">';
6958 print
'<select id="limit'.(is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix).
'" name="limit" class="flat selectlimit nopadding maxwidth75 center'.(is_numeric($selectlimitsuffix) ?
'' :
' '.$selectlimitsuffix).
'" title="'.
dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
6960 $tmpchoice = explode(
',', $pagesizechoices);
6961 $tmpkey = $limit.
':'.$limit;
6962 if (!in_array($tmpkey, $tmpchoice)) {
6963 $tmpchoice[$tmpkey] = $tmpkey;
6965 $tmpkey =
$conf->liste_limit.
':'.
$conf->liste_limit;
6966 if (!in_array($tmpkey, $tmpchoice)) {
6967 $tmpchoice[$tmpkey] = $tmpkey;
6969 asort($tmpchoice, SORT_NUMERIC);
6970 foreach ($tmpchoice as $val) {
6972 $tmp = explode(
':', $val);
6975 if ($key !=
'' && $val !=
'') {
6976 if ((
int) $key == (
int) $limit) {
6977 $selected =
' selected="selected"';
6979 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6983 print
'</datalist>';
6986 print
ajax_combobox(
"limit".(is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
6990 if (
$conf->use_javascript_ajax) {
6991 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6993 jQuery(document).ready(function () {
6994 jQuery(".selectlimit").change(function() {
6995 console.log("We change limit so we submit the form");
6996 $(this).parents(\'form:first\').submit();
7005 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>';
7007 if ($betweenarrows) {
7008 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
7009 print $betweenarrows;
7010 print
'<!--</div>-->';
7012 if ($nextpage > 0) {
7013 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>';
7016 print
'<li class="paginationafterarrows">';
7021 print
'</ul></div>'.
"\n";
7036function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
7040 if (preg_match(
'/%/', $rate)) {
7041 $rate = str_replace(
'%',
'', $rate);
7045 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
7046 $morelabel =
' ('.$reg[1].
')';
7047 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
7048 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
7050 if (preg_match(
'/\*/', $rate)) {
7051 $rate = str_replace(
'*',
'', $rate);
7056 if (!preg_match(
'/\//', $rate)) {
7057 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
7060 $ret = $rate.($addpercent ?
'%' :
'');
7062 if (($info_bits & 1) && $usestarfornpr >= 0) {
7085function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
7087 global $langs,
$conf;
7090 if (empty($amount)) {
7093 $amount = (is_numeric($amount) ? $amount : 0);
7094 if ($rounding == -1) {
7097 $nbdecimal = $rounding;
7099 if ($outlangs ===
'none') {
7109 if (!($outlangs instanceof
Translate)) {
7113 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7114 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
7116 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7117 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
7119 if ($thousand ==
'None') {
7121 } elseif ($thousand ==
'Space') {
7128 $amount = str_replace(
',',
'.', $amount);
7130 $data = explode(
'.', $amount);
7131 $decpart = isset($data[1]) ? $data[1] :
'';
7132 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
7142 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
7143 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
7144 $nbdecimal = $nbdecimalmaxshown;
7152 if ((
string) $forcerounding !=
'-1' && (string) $forcerounding !=
'') {
7153 if ($forcerounding ===
'MU') {
7155 } elseif ($forcerounding ===
'MT') {
7157 } elseif ($forcerounding >= 0) {
7158 $nbdecimal = (int) $forcerounding;
7163 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
7165 $cursymbolbefore = $cursymbolafter =
'';
7166 if ($currency_code && is_object($outlangs)) {
7167 if ($currency_code ==
'auto') {
7168 $currency_code =
$conf->currency;
7171 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
7172 $listoflanguagesbefore = array(
'nl_NL');
7173 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
7174 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
7176 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
7177 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
7180 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
7182 $output = preg_replace(
'/\s/',
' ', $output);
7183 $output = preg_replace(
'/\'/',
''', $output);
7213function price2num($amount, $rounding =
'', $option = 0)
7215 global $langs,
$conf;
7218 if (is_null($amount)) {
7227 if (is_null($langs)) {
7231 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7232 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
7234 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7235 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
7238 if ($thousand ==
'None') {
7240 } elseif ($thousand ==
'Space') {
7248 if (!is_numeric($amount)) {
7249 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
7252 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
7253 $amount = str_replace($thousand,
'', $amount);
7259 if (is_numeric($amount)) {
7261 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7262 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7264 $amount = number_format($amount, $nbofdec, $dec, $thousand);
7270 if ($thousand !=
',' && $thousand !=
'.') {
7283 if (preg_match(
'/^(?<int>[^,]*,|[^.]*\.)(?<dec>[^.,]*)$/u', $amount, $matches)) {
7284 $intPart = $matches[
'int'];
7285 $decPart = $matches[
'dec'];
7288 $intPart = str_replace([
'.',
','],
'', $intPart);
7291 $amount = $intPart . $dec . $decPart;
7295 $amount = str_replace(
' ',
'', $amount);
7296 $amount = str_replace($thousand,
'', $amount);
7297 $amount = str_replace($dec,
'.', $amount);
7299 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7305 $nbofdectoround =
'';
7306 if ($rounding ==
'MU') {
7308 } elseif ($rounding ==
'MT') {
7310 } elseif ($rounding ==
'MS') {
7311 $nbofdectoround = isset(
$conf->global->MAIN_MAX_DECIMALS_STOCK) ?
getDolGlobalInt(
'MAIN_MAX_DECIMALS_STOCK') : 5;
7312 } elseif ($rounding ==
'CU') {
7314 } elseif ($rounding ==
'CT') {
7316 } elseif (is_numeric($rounding)) {
7317 $nbofdectoround = (int) $rounding;
7322 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7324 return 'ErrorBadParameterProvidedToFunction';
7330 if (is_numeric($amount)) {
7332 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7333 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7335 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7341 if ($thousand !=
',' && $thousand !=
'.') {
7342 $amount = str_replace(
',',
'.', $amount);
7345 $amount = str_replace(
' ',
'', $amount);
7346 $amount = str_replace($thousand,
'', $amount);
7347 $amount = str_replace($dec,
'.', $amount);
7349 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7367function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7369 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
7371 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7372 $dimension *= 1000000;
7374 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7377 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7378 $dimension /= 1000000;
7380 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
7397 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
7399 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
7417function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
7419 global $db,
$conf, $mysoc;
7421 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
7422 $thirdparty_seller = $mysoc;
7425 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);
7427 $vatratecleaned = $vatrate;
7429 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
7430 $vatratecleaned = trim($reg[1]);
7431 $vatratecode = $reg[2];
7440 if ($mysoc->country_code ==
'ES') {
7442 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
7445 if ($thirdparty_seller->id == $mysoc->id) {
7446 if (!$thirdparty_buyer->localtax1_assuj) {
7450 if (!$thirdparty_seller->localtax1_assuj) {
7458 if (!$mysoc->localtax2_assuj) {
7461 if ($thirdparty_seller->id == $mysoc->id) {
7462 if (!$thirdparty_buyer->localtax2_assuj) {
7466 if (!$thirdparty_seller->localtax2_assuj) {
7472 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
7475 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
7481 if (in_array($mysoc->country_code, array(
'ES'))) {
7482 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
7488 if ($thirdparty_seller != $mysoc) {
7490 return $thirdparty_seller->localtax1_value;
7499 if ($thirdparty_seller != $mysoc) {
7502 return $thirdparty_seller->localtax2_value;
7505 if (in_array($mysoc->country_code, array(
'ES'))) {
7506 return $thirdparty_buyer->localtax2_value;
7515 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
7516 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7517 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
7518 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7519 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7520 if (!empty($vatratecode)) {
7521 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
7523 $sql .=
" AND t.recuperableonly = '".$db->escape((
string) $vatnpr).
"'";
7526 $resql = $db->query($sql);
7529 $obj = $db->fetch_object($resql);
7532 return $obj->localtax1;
7533 } elseif ($local == 2) {
7534 return $obj->localtax2;
7555 $valors = explode(
":", $tax);
7557 if (count($valors) > 1) {
7574 $sql =
" SELECT t.localtax".$local.
" as localtax";
7575 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7576 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7577 $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";
7578 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7579 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7580 $sql .=
" ORDER BY t.rowid DESC";
7582 $resql = $db->query($sql);
7584 $obj = $db->fetch_object($resql);
7586 return $obj->localtax;
7607function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7611 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7614 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7615 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7616 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7617 if ($firstparamisid) {
7618 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7620 $vatratecleaned = $vatrate;
7623 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7624 $vatratecleaned = $reg[1];
7625 $vatratecode = $reg[2];
7628 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7631 $sql .=
" WHERE t.fk_pays = c.rowid";
7633 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
7635 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
7637 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7638 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7640 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7644 $resql = $db->query($sql);
7646 $obj = $db->fetch_object($resql);
7649 'rowid' => $obj->rowid,
7650 'code' => $obj->code,
7651 'rate' => $obj->rate,
7652 'localtax1' => $obj->localtax1,
7653 'localtax1_type' => $obj->localtax1_type,
7654 'localtax2' => $obj->localtax2,
7655 'localtax2_type' => $obj->localtax2_type,
7657 'accountancy_code_sell' => $obj->accountancy_code_sell,
7658 'accountancy_code_buy' => $obj->accountancy_code_buy
7690 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7693 $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";
7694 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7695 if ($firstparamisid) {
7696 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7698 $vatratecleaned = $vatrate;
7701 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7702 $vatratecleaned = $reg[1];
7703 $vatratecode = $reg[2];
7706 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7707 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7708 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7709 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7711 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7712 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7714 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7716 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7720 $resql = $db->query($sql);
7722 $obj = $db->fetch_object($resql);
7725 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7728 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7729 } elseif ($local == 2) {
7730 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7732 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);
7754 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7762 $product->fetch($idprod);
7764 if (($mysoc->country_code == $thirdpartytouse->country_code)
7765 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7766 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7769 if ($idprodfournprice > 0) {
7770 $result = $product->get_buyprice($idprodfournprice, 0, 0,
'');
7772 $ret = $product->vatrate_supplier;
7773 if ($product->default_vat_code_supplier) {
7774 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7780 $ret = $product->tva_tx;
7781 if ($product->default_vat_code) {
7782 $ret .=
' ('.$product->default_vat_code.
')';
7795 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7796 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7797 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7798 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7799 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7800 $sql .= $db->plimit(1);
7802 $resql = $db->query($sql);
7804 $obj = $db->fetch_object($resql);
7806 $ret = $obj->vat_rate;
7807 if ($obj->default_vat_code) {
7808 $ret .=
' ('.$obj->default_vat_code.
')';
7832 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7849 if (!class_exists(
'Product')) {
7850 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7859 $result = $product->fetch($idprod);
7861 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7875 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7876 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7877 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7878 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7879 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7880 $sql .= $db->plimit(1);
7882 $resql = $db->query($sql);
7884 $obj = $db->fetch_object($resql);
7887 $ret = $obj->localtax1;
7888 } elseif ($local == 2) {
7889 $ret = $obj->localtax2;
7897 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7922 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7925 $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;
7927 if (empty($thirdparty_seller->country_code)) {
7928 $thirdparty_seller->country_code = $mysoc->country_code;
7930 $seller_country_code = $thirdparty_seller->country_code;
7931 $seller_in_cee =
isInEEC($thirdparty_seller);
7933 if (empty($thirdparty_buyer->country_code)) {
7934 $thirdparty_buyer->country_code = $mysoc->country_code;
7936 $buyer_country_code = $thirdparty_buyer->country_code;
7937 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7939 dol_syslog(
"get_default_tva: seller use vat=".$seller_use_vat.
", seller country=".$seller_country_code.
", seller in cee=".((
string) (
int) $seller_in_cee).
", buyer vat number=".$thirdparty_buyer->tva_intra.
" buyer country=".$buyer_country_code.
", buyer state=".$thirdparty_buyer->state_id.
" buyer in cee=".((
string) (
int) $buyer_in_cee).
", idprod=".$idprod.
", idprodfournprice=".$idprodfournprice.
", SERVICE_ARE_ECOMMERCE_200238EC=".
getDolGlobalString(
'SERVICE_ARE_ECOMMERCE_200238EC'));
7944 if ($seller_in_cee && $buyer_in_cee) {
7945 $isacompany = $thirdparty_buyer->isACompany();
7946 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7947 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7961 if (!$seller_use_vat) {
7967 if (!empty($thirdparty_buyer->state_id)) {
7968 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
7969 $sql .=
" FROM ".$db->prefix().
"c_tva as t";
7970 $sql .=
" INNER JOIN ".$db->prefix().
"c_departements as d ON t.fk_department_buyer = d.rowid";
7971 $sql .=
" WHERE d.rowid = ".((int) $thirdparty_buyer->state_id);
7972 $sql .=
" AND t.active > 0";
7973 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7974 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7976 $res = $db->query($sql);
7978 if ($db->num_rows($res)) {
7979 $obj = $db->fetch_object($res);
7980 return $obj->vat_default_rate.
' ('.$obj->vat_default_code.
')';
7987 if (($seller_country_code == $buyer_country_code)
7988 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7989 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7994 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7998 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
8000 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
8001 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
8003 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
8015 if (($seller_in_cee && $buyer_in_cee)) {
8016 $isacompany = $thirdparty_buyer->isACompany();
8017 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
8018 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
8035 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
8036 $isacompany = $thirdparty_buyer->isACompany();
8064 if ($idprodfournprice > 0) {
8065 if (!class_exists(
'ProductFournisseur')) {
8066 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
8069 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
8070 return $prodprice->fourn_tva_npr;
8071 } elseif ($idprod > 0) {
8072 if (!class_exists(
'Product')) {
8073 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
8076 $prod->fetch($idprod);
8077 return $prod->tva_npr;
8100 if (!is_object($thirdparty_seller)) {
8103 if (!is_object($thirdparty_buyer)) {
8107 if (empty($thirdparty_seller->country_code)) {
8108 $thirdparty_seller->country_code = $mysoc->country_code;
8110 $seller_country_code = $thirdparty_seller->country_code;
8113 if (empty($thirdparty_buyer->country_code)) {
8114 $thirdparty_buyer->country_code = $mysoc->country_code;
8116 $buyer_country_code = $thirdparty_buyer->country_code;
8120 if ($mysoc->country_code ==
'ES') {
8121 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
8126 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
8129 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
8133 } elseif ($local == 2) {
8135 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
8138 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
8143 if ($seller_country_code == $buyer_country_code) {
8158function yn($yesno, $format = 1, $color = 0)
8162 $result =
'unknown';
8164 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
8165 $result = $langs->trans(
'yes');
8166 if ($format == 1 || $format == 3) {
8167 $result = $langs->trans(
"Yes");
8170 $result =
'<input type="checkbox" value="1" checked disabled>';
8173 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
8175 if ($format == 4 || !is_numeric($format)) {
8176 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
8180 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
8181 $result = $langs->trans(
"no");
8182 if ($format == 1 || $format == 3) {
8183 $result = $langs->trans(
"No");
8186 $result =
'<input type="checkbox" value="0" disabled>';
8189 $result =
'<input type="checkbox" value="0" disabled> '.$result;
8191 if ($format == 4 || !is_numeric($format)) {
8192 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
8198 $classname =
'error';
8202 return '<span class="'.$classname.
'">'.$result.
'</span>';
8225function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
8227 if (empty($modulepart) && is_object(
$object)) {
8228 if (!empty(
$object->module)) {
8229 $modulepart =
$object->module;
8230 } elseif (!empty(
$object->element)) {
8231 $modulepart =
$object->element;
8238 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
8240 $arrayforoldpath[
'product'] = 2;
8243 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8244 $level = $arrayforoldpath[$modulepart];
8246 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8248 if (empty($num) && is_object(
$object)) {
8251 if (empty($alpha)) {
8252 $num = preg_replace(
'/([^0-9])/i',
'', $num);
8254 $num = preg_replace(
'/^.*\-/i',
'', $num);
8256 $num = substr(
"000".$num, -$level);
8258 $path = substr($num, 0, 1);
8261 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
8264 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
8270 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceOf
Societe) {
8278 if (empty($withoutslash) && !empty($path)) {
8293function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
8295 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
8300 if (@is_dir($dir_osencoded)) {
8308 if (!empty($dataroot)) {
8310 $dir = str_replace($dataroot.
'/',
'', $dir);
8311 $ccdir = $dataroot.
'/';
8314 $cdir = explode(
"/", $dir);
8315 $num = count($cdir);
8316 for ($i = 0; $i < $num; $i++) {
8318 $ccdir .=
'/'.$cdir[$i];
8320 $ccdir .= $cdir[$i];
8323 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
8331 if (!@is_dir($ccdir_osencoded)) {
8332 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' is not found (does not exists or is outside open_basedir PHP setting).", LOG_DEBUG);
8335 $dirmaskdec = octdec((
string) $newmask);
8336 if (empty($newmask)) {
8339 $dirmaskdec |= octdec(
'0111');
8340 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
8342 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' (no permission to write into parent or directory already exists).", LOG_WARNING);
8345 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
8354 return ($nberr ? -$nberr : $nbcreated);
8365function dolChmod($filepath, $newmask =
'')
8367 if (!empty($newmask)) {
8368 @chmod($filepath, octdec($newmask));
8382 return '<span class="fieldrequired">*</span>';
8402function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
8404 if (is_null($stringtoclean)) {
8408 if ($removelinefeed == 2) {
8409 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
8411 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
8416 $temp = str_replace(
'< ',
'__ltspace__', $temp);
8417 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
8420 $temp = strip_tags($temp);
8423 $pattern =
"/<[^<>]+>/";
8430 $tempbis = str_replace(
'<>',
'', $temp);
8431 $tempbis = preg_replace($pattern,
'', $tempbis);
8433 }
while ($tempbis != $temp);
8438 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
8444 if ($removelinefeed == 1) {
8445 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
8449 if ($removedoublespaces) {
8450 while (strpos($temp,
" ") !==
false) {
8451 $temp = str_replace(
" ",
" ", $temp);
8455 $temp = str_replace(
'__ltspace__',
'< ', $temp);
8456 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
8480function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
8482 if (empty($allowed_tags)) {
8483 $allowed_tags = array(
8484 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
8485 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
8486 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8489 $allowed_tags[] =
"comment";
8491 if (!in_array(
'iframe', $allowed_tags)) {
8492 $allowed_tags[] =
"iframe";
8496 if (!in_array(
'link', $allowed_tags)) {
8497 $allowed_tags[] =
"link";
8501 if (!in_array(
'script', $allowed_tags)) {
8502 $allowed_tags[] =
"script";
8506 if (!in_array(
'style', $allowed_tags)) {
8507 $allowed_tags[] =
"style";
8511 $allowed_tags_string = implode(
"><", $allowed_tags);
8512 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
8514 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
8519 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
8522 $allowed_tags[] =
"commentphp";
8523 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
8524 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
8527 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
8528 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
8531 $temp = strip_tags($stringtoclean, $allowed_tags_string);
8533 if ($cleanalsosomestyles) {
8534 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
8536 if ($removeclassattribute) {
8537 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
8542 if ($cleanalsojavascript) {
8543 $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);
8546 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
8549 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
8552 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
8573 if (is_null($allowed_attributes)) {
8574 $allowed_attributes = array(
8575 "allow",
"allowfullscreen",
"alt",
"async",
"class",
"contenteditable",
"crossorigin",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"property",
"rel",
"src",
"style",
"target",
"title",
"type",
"width",
8577 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8581 if (!in_array(
"content", $allowed_attributes)) {
8582 $allowed_attributes[] =
"content";
8584 if (!in_array(
"http-equiv", $allowed_attributes)) {
8585 $allowed_attributes[] =
"http-equiv";
8588 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
8590 $stringtoclean =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>'.$stringtoclean.
'</body></html>';
8593 $dom =
new DOMDocument(
'',
'UTF-8');
8595 $savwarning = error_reporting();
8596 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
8597 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
8598 error_reporting($savwarning);
8600 if ($dom instanceof DOMDocument) {
8601 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
8602 $el = $els->item($i);
8603 if (!$el instanceof DOMElement) {
8606 $attrs = $el->attributes;
8607 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
8609 if (!empty($attrs->item($ii)->name)) {
8610 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
8612 $els->item($i)->removeAttribute($attrs->item($ii)->name);
8613 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
8615 $valuetoclean = $attrs->item($ii)->value;
8617 if (isset($valuetoclean)) {
8619 $oldvaluetoclean = $valuetoclean;
8620 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
8621 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
8622 if ($els->item($i)->tagName ==
'a') {
8623 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
8624 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
8625 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
8629 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
8630 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8631 }
while ($oldvaluetoclean != $valuetoclean);
8634 $attrs->item($ii)->value = $valuetoclean;
8641 $dom->encoding =
'UTF-8';
8643 $return = $dom->saveHTML();
8647 $return = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]*'.preg_quote(
'></head><body>',
'/').
'/',
'', $return);
8648 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', trim($return));
8650 return trim($return);
8652 return $stringtoclean;
8669 $temp = $stringtoclean;
8670 foreach ($disallowed_tags as $tagtoremove) {
8671 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8672 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8675 if ($cleanalsosomestyles) {
8676 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8694 if ($nboflines == 1) {
8696 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8697 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8700 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8705 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8709 $text = preg_replace(
'/\n/',
'', $text);
8711 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8713 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8716 $text = strtr($text, $repTable);
8717 if ($charset ==
'UTF-8') {
8718 $pattern =
'/(<br[^>]*>)/Uu';
8721 $pattern =
'/(<br[^>]*>)/U';
8723 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8728 $lastaddediscontent = 1;
8729 while ($countline < $nboflines && isset($a[$i])) {
8730 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8731 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8732 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8734 if (!$lastaddediscontent) {
8737 $lastaddediscontent = 0;
8740 $firstline .= $a[$i];
8741 $lastaddediscontent = 1;
8747 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8749 $ret = $firstline.($adddots ?
'...' :
'');
8767function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8769 if (is_null($stringtoencode)) {
8774 return nl2br($stringtoencode, $forxml);
8776 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8790function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8792 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8797 return $stringtoencode;
8799 $out = $stringtoencode;
8803 $oldstringtoclean = $out;
8811 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8813 libxml_use_internal_errors(
false);
8814 if (LIBXML_VERSION < 20900) {
8818 libxml_disable_entity_loader(
true);
8821 $dom =
new DOMDocument();
8829 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.$out.
'</div></body></html>';
8833 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.dol_nl2br($out).
'</div></body></html>';
8837 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8839 $dom->encoding =
'UTF-8';
8841 $out = trim($dom->saveHTML());
8845 $out = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]+'.preg_quote(
'></head><body><div class="tricktoremove">',
'/').
'/',
'', $out);
8846 $out = preg_replace(
'/'.preg_quote(
'</div></body></html>',
'/').
'$/',
'', trim($out));
8852 $out = str_replace(
'<br>',
'', $out);
8857 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8864 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript')) && $outishtml) {
8870 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8877 'quote-marks' =>
false,
8878 'doctype' =>
'strict',
8879 'show-body-only' =>
true,
8880 "indent-attributes" =>
false,
8881 "vertical-space" =>
false,
8884 'preserve-entities' =>
true
8894 $out = $tidy->repairString($out, $config,
'utf8');
8903 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8908 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8911 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8915 $out = preg_replace(
'/'/i',
''', $out);
8920 if (function_exists(
'realCharForNumericEntities')) {
8921 $out = preg_replace_callback(
8922 '/&#(x?[0-9][0-9a-f]+;?)/i',
8927 static function ($m) {
8935 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8938 if ($check ==
'restricthtmlallowlinkscript') {
8940 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
8942 } elseif ($check ==
'restricthtmlallowiframe') {
8955 $out = preg_replace(
'/'/i',
"'", $out);
8959 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8960 $out = preg_replace(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i',
'', $out);
8961 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8962 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8963 $out = preg_replace(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i',
'', $out);
8964 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8966 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8967 }
while ($oldstringtoclean != $out);
8974 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8975 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8976 $nblinks = count($reg[0]);
8977 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8978 $out =
'ErrorTooManyLinksIntoHTMLString';
8981 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8983 $out =
'ErrorHTMLLinksNotAllowed';
8985 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8988 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8991 if (preg_match_all($pattern, $out, $matches)) {
8993 $urls = $matches[1];
8996 foreach ($urls as $url) {
8998 echo
"Found url = ".$url .
"\n";
9001 $out =
'ErrorHTMLExternalLinksNotAllowed';
9030function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
9032 if (is_null($stringtoencode)) {
9036 $newstring = $stringtoencode;
9038 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
9039 if ($removelasteolbr) {
9040 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
9042 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
9043 $newstring = strtr($newstring, array(
'&' =>
'__PROTECTand__',
'<' =>
'__PROTECTlt__',
'>' =>
'__PROTECTgt__',
'"' =>
'__PROTECTdquot__'));
9045 $newstring = strtr($newstring, array(
'__PROTECTand__' =>
'&',
'__PROTECTlt__' =>
'<',
'__PROTECTgt__' =>
'>',
'__PROTECTdquot__' =>
'"'));
9047 if ($removelasteolbr) {
9048 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
9067 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
9068 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
9069 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
9070 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
9082 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
9083 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
9099 if ($keepsomeentities) {
9100 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
9102 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string)
$c);
9103 if ($keepsomeentities) {
9104 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
9120function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
9122 return htmlentities($string, $flags, $encoding, $double_encode);
9141 for ($scursor = 0; $scursor < $len; $scursor++) {
9142 $ordchar = ord($s[$scursor]);
9144 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
9147 } elseif ($ordchar > 126 && $ordchar < 160) {
9151 $out .= $s[$scursor];
9173 $arraystring = explode(
"\n", $s);
9174 $nb = count($arraystring);
9191 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9193 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9196 $text = strtr($text, $repTable);
9197 if ($charset ==
'UTF-8') {
9198 $pattern =
'/(<br[^>]*>)/Uu';
9201 $pattern =
'/(<br[^>]*>)/U';
9203 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9205 $nblines = (int) floor((count($a) + 1) / 2);
9208 foreach ($a as $line) {
9211 $line_dec = html_entity_decode($line);
9213 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
9214 $nblines += substr_count($line_dec,
'\n');
9234 if (is_null($msg)) {
9239 if (preg_match(
'/<(html|link|script)/i', $msg)) {
9241 } elseif (preg_match(
'/<body/i', $msg)) {
9243 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9245 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9247 } elseif (preg_match(
'/<br/i', $msg)) {
9253 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
9254 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
9256 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9258 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9260 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
9262 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
9264 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
9266 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
9268 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
9270 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
9272 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
9275 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
9277 } elseif (preg_match(
'/&#x[a-f0-9][a-f0-9];/i', $msg)) {
9299function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
9301 if (!empty($invert)) {
9309 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
9329function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude =
null,
$object =
null, $include =
null)
9331 global $db,
$conf, $mysoc, $user, $extrafields;
9333 $substitutionarray = array();
9335 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
9339 $emailsendersignature = $user->signature;
9340 $usersignature = $user->signature;
9341 $substitutionarray = array_merge($substitutionarray, array(
9342 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
9346 if (is_object($user) && ($user instanceof
User)) {
9347 $substitutionarray = array_merge($substitutionarray, array(
9348 '__USER_ID__' => (
string) $user->id,
9349 '__USER_LOGIN__' => (
string) $user->login,
9350 '__USER_EMAIL__' => (
string) $user->email,
9351 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
9352 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
9353 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
9354 '__USER_FAX__' => (
string) $user->office_fax,
9355 '__USER_LASTNAME__' => (
string) $user->lastname,
9356 '__USER_FIRSTNAME__' => (
string) $user->firstname,
9357 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
9358 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
9359 '__USER_JOB__' => (string) $user->job,
9361 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
9365 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
9366 $substitutionarray = array_merge($substitutionarray, array(
9367 '__MYCOMPANY_NAME__' => $mysoc->name,
9368 '__MYCOMPANY_EMAIL__' => $mysoc->email,
9369 '__MYCOMPANY_URL__' => $mysoc->url,
9370 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
9371 '__MYCOMPANY_PHONEMOBILE__' =>
dol_print_phone($mysoc->phone_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
9372 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
9373 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
9374 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
9375 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
9376 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
9377 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
9378 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
9379 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
9380 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
9381 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
9382 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
9383 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
9384 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
9385 '__MYCOMPANY_ADDRESS__' => $mysoc->
address,
9386 '__MYCOMPANY_ZIP__' => $mysoc->zip,
9387 '__MYCOMPANY_TOWN__' => $mysoc->town,
9388 '__MYCOMPANY_STATE__' => $mysoc->state,
9389 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
9390 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
9391 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
9392 '__MYCOMPANY_CURRENCY_CODE__' =>
$conf->currency
9396 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
9398 $substitutionarray[
'__ID__'] =
'__ID__';
9399 $substitutionarray[
'__REF__'] =
'__REF__';
9400 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
9401 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
9402 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
9403 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
9404 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
9405 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
9406 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
9408 if (isModEnabled(
"societe")) {
9409 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
9410 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
9411 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
9412 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
9413 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
9414 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
9416 $substitutionarray[
'__THIRDPARTY_URL__'] =
'__THIRDPARTY_URL__';
9418 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
9419 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
9420 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
9421 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
9422 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
9423 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
9424 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
9425 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
9426 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
9427 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
9428 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
9429 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
9430 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
9431 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
9432 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
9433 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
9434 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
9435 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
9436 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
9438 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
9439 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
9440 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
9441 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
9442 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
9443 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
9448 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
9449 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
9450 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
9451 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
9452 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
9453 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
9454 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
9455 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
9456 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
9457 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
9460 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
9461 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
9462 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
9463 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
9465 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
9466 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
9467 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
9468 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
9472 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
9473 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
9474 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
9475 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
9476 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
9478 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
9479 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
9481 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
9482 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
9484 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
9485 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
9486 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
9487 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
9488 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
9489 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
9490 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
9492 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
9493 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
9494 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
9495 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
9496 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
9498 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
9499 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
9500 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
9501 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
9503 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
9504 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
9505 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
9508 '@phan-var-force Adherent|Delivery $object';
9510 $substitutionarray[
'__ID__'] =
$object->id;
9511 $substitutionarray[
'__REF__'] =
$object->ref;
9512 $substitutionarray[
'__NEWREF__'] =
$object->newref;
9514 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9515 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9516 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
9517 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
9519 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
9520 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
9521 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
9524 $date_delivery =
null;
9525 if (property_exists(
$object,
'date_delivery')) {
9526 $date_delivery =
$object->date_delivery;
9527 } elseif (property_exists(
$object,
'delivery_date')) {
9528 $date_delivery =
$object->delivery_date;
9530 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
9531 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
9532 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
9533 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
9534 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
9535 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
9536 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
9537 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
9538 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
9541 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9542 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9544 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
9545 $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 :
'')) :
'');
9549 '@phan-var-force Adherent $object';
9553 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
9554 if (method_exists(
$object,
'getCivilityLabel')) {
9555 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
9557 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
9558 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
9559 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
9560 if (method_exists(
$object,
'getFullName')) {
9561 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
9563 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
9564 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
9565 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
9566 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
9567 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
9568 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
9569 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
9570 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
9571 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
9572 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
9573 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
9577 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
9578 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
9580 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
9581 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
9582 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
9583 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
9584 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
9585 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
9586 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
9587 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
9588 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
9589 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
9590 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
9595 '@phan-var-force Societe $object';
9596 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->id ??
'';
9597 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->name ??
'';
9598 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->name_alias ??
'';
9599 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->code_client ??
'';
9600 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->code_fournisseur ??
'';
9601 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->email ??
'';
9602 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->email ??
'');
9603 $substitutionarray[
'__THIRDPARTY_URL__'] =
$object->url ??
'';
9604 $substitutionarray[
'__THIRDPARTY_URL_URLENCODED__'] = urlencode(
$object->url ??
'');
9607 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->address ??
'';
9608 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->zip ??
'';
9609 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->town ??
'';
9610 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->state ??
'';
9611 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->country_id > 0 ?:
'');
9612 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->country_code ??
'';
9613 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->idprof1 ??
'';
9614 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->idprof2 ??
'';
9615 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->idprof3 ??
'';
9616 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->idprof4 ??
'';
9617 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->idprof5 ??
'';
9618 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->idprof6 ??
'';
9619 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->tva_intra ??
'';
9622 } elseif (is_object(
$object) && is_object(
$object->thirdparty)) {
9623 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->thirdparty->id ??
'';
9624 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->thirdparty->name ??
'';
9625 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->thirdparty->name_alias ??
'';
9626 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->thirdparty->code_client ??
'';
9627 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->thirdparty->code_fournisseur ??
'';
9628 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->thirdparty->email ??
'';
9629 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->thirdparty->email ??
'');
9632 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->thirdparty->address ??
'';
9633 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->thirdparty->zip ??
'';
9634 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->thirdparty->town ??
'';
9635 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->thirdparty->state ??
'';
9636 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->thirdparty->country_id > 0 ?:
'');
9637 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->thirdparty->country_code ??
'';
9638 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->thirdparty->idprof1 ??
'';
9639 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->thirdparty->idprof2 ??
'';
9640 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->thirdparty->idprof3 ??
'';
9641 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->thirdparty->idprof4 ??
'';
9642 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->thirdparty->idprof5 ??
'';
9643 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->thirdparty->idprof6 ??
'';
9644 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->thirdparty->tva_intra ??
'';
9649 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
9650 '@phan-var-force RecruitmentCandidature $object';
9652 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
9653 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9654 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9656 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
9657 '@phan-var-force ConferenceOrBoothAttendee $object';
9659 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
9660 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9661 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9665 '@phan-var-force Project $object';
9667 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
9668 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
9669 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
9670 } elseif (is_object(
$object)) {
9672 if (!empty(
$object->project)) {
9674 } elseif (!empty(
$object->projet)) {
9677 if (!is_null($project) && is_object($project)) {
9678 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
9679 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
9680 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
9685 $project_id =
$object->fk_project;
9686 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
9687 $project_id =
$object->fk_project;
9689 if ($project_id > 0) {
9691 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9692 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9693 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9699 '@phan-var-force Facture $object';
9701 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
9704 '@phan-var-force Expedition $object';
9706 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9707 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9708 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9711 '@phan-var-force Reception $object';
9713 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9714 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9718 '@phan-var-force Contrat $object';
9720 $dateplannedstart =
'';
9721 $datenextexpiration =
'';
9722 foreach (
$object->lines as $line) {
9723 if ($line->date_start > $dateplannedstart) {
9724 $dateplannedstart = $line->date_start;
9726 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9727 $datenextexpiration = $line->date_end;
9730 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9731 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9732 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9734 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9735 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9736 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9740 '@phan-var-force Ticket $object';
9742 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9743 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9744 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9745 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9746 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9747 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9748 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9749 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9750 $userstat =
new User($db);
9751 if (
$object->fk_user_assign > 0) {
9752 $userstat->fetch(
$object->fk_user_assign);
9753 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9756 if (
$object->fk_user_create > 0) {
9757 $userstat->fetch(
$object->fk_user_create);
9758 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9764 if (!is_object($extrafields)) {
9767 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9769 if (
$object->fetch_optionals() > 0) {
9770 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9771 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9772 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9773 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9774 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9775 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9776 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9777 $datetime =
$object->array_options[
'options_'.$key];
9778 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9779 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9780 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9781 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9782 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9783 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9784 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9785 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9786 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9787 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9788 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9789 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9797 if (empty($substitutionarray[
'__REF__'])) {
9801 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9802 $outputlangs->loadLangs(array(
'paypal',
'other'));
9805 $typeforonlinepayment =
'free';
9807 $typeforonlinepayment =
'order';
9810 $typeforonlinepayment =
'invoice';
9813 $typeforonlinepayment =
'member';
9814 if (!empty(
$object->last_subscription_amount)) {
9815 $amounttouse =
$object->last_subscription_amount;
9819 $typeforonlinepayment =
'contract';
9822 $typeforonlinepayment =
'ficheinter';
9825 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9830 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9831 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9835 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions_be.lib.php';
9840 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9842 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9845 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9847 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9850 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9852 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9855 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9857 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9860 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9862 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9865 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9867 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9871 '@phan-var-force Propal $object';
9873 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9874 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9875 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9878 '@phan-var-force Commande $object';
9880 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9883 '@phan-var-force Facture $object';
9885 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9888 '@phan-var-force Contrat $object';
9890 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9891 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9892 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9895 '@phan-var-force Fichinter $object';
9897 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9898 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9899 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9901 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9902 '@phan-var-force SupplierProposal $object';
9904 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9906 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9907 '@phan-var-force FactureFournisseur $object';
9909 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9912 '@phan-var-force Expedition $object';
9914 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9919 '@phan-var-force ActionComm $object';
9921 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9922 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9924 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9928 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9929 '@phan-var-force Facture|FactureRec $object';
9931 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9934 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
9936 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
9938 $already_payed_all = 0;
9943 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9947 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9951 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9953 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9957 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9958 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9960 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9961 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9965 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9966 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9967 $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc - $already_payed_all, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9968 $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'] = 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)) :
'';
9969 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9970 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9972 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9973 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9976 if ($onlykey != 2) {
9977 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9978 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9979 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9980 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9981 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9982 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9984 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9985 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9989 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9990 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9991 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9992 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
9996 if ($onlykey != 2) {
9997 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9998 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
10004 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
10005 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
10015 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
10017 $substitutionarray = array_merge($substitutionarray, array(
10018 '__NOW_TMS__' => (
string) $now,
10019 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
10020 '__DAY__' => (
string) $tmp[
'mday'],
10021 '__DAY_TEXT__' => $daytext,
10022 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
10023 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
10024 '__MONTH__' => (
string) $tmp[
'mon'],
10025 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
10026 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
10027 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
10028 '__YEAR__' => (
string) $tmp[
'year'],
10029 '__YEAR_PREVIOUS_MONTH__' => (
string) $tmp3[
'year'],
10030 '__YEAR_NEXT_MONTH__' => (
string) $tmp5[
'year'],
10031 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
10032 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
10033 '__PREVIOUS_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp3[
'month'])),
10034 '__PREVIOUS_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp3[
'month'])),
10035 '__PREVIOUS_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp3[
'month'])),
10036 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
10037 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
10038 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
10039 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
10040 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
10041 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
10042 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
10046 if (isModEnabled(
'multicompany')) {
10047 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' =>
$conf->entity));
10049 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
10050 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
10051 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
10052 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
10053 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
10058 return $substitutionarray;
10077function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
10079 global
$conf, $db, $langs;
10081 if (!is_array($substitutionarray)) {
10082 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
10085 if (empty($outputlangs)) {
10086 $outputlangs = $langs;
10096 if (is_object($outputlangs)) {
10098 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
10100 $tmp = explode(
'|', $reg[1]);
10101 if (!empty($tmp[1])) {
10102 $outputlangs->load($tmp[1]);
10105 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
10107 if (empty($converttextinhtmlifnecessary)) {
10109 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10111 if (! $msgishtml) {
10115 if ($valueishtml) {
10123 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
10131 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
10132 $keyfound = $reg[1];
10134 $value =
'*****forbidden*****';
10136 $value = empty(
$conf->global->$keyfound) ?
'' :
$conf->global->$keyfound;
10139 if (empty($converttextinhtmlifnecessary)) {
10141 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10143 if (! $msgishtml) {
10146 if ($valueishtml) {
10154 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
10159 foreach ($substitutionarray as $key => $value) {
10160 if (!isset($value)) {
10164 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
10168 if (empty($converttextinhtmlifnecessary)) {
10169 $text = str_replace((
string) $key, (
string) $value, $text);
10171 if (! $msgishtml) {
10174 if ($valueishtml) {
10181 $text = str_replace((
string) $key, (
string) $value, $text);
10197 $memory_object_list = array();
10198 foreach ($substitutionarray as $key => $value) {
10199 $lazy_load_arr = array();
10200 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
10201 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
10202 $key_to_substitute = $lazy_load_arr[1];
10203 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
10204 $param_arr = explode(
':', (
string) $value);
10206 if (count($param_arr) == 4) {
10207 $path = $param_arr[0];
10208 $class = $param_arr[1];
10209 $method = $param_arr[2];
10210 $id = (int) $param_arr[3];
10213 if (!isset($memory_object_list[$class])) {
10215 require_once DOL_DOCUMENT_ROOT . $path;
10216 if (class_exists($class)) {
10217 $memory_object_list[$class] = array(
10225 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
10226 if (method_exists($class, $method)) {
10227 if (!isset($memory_object_list[$class][
'list'][
$id])) {
10228 $tmpobj =
new $class($db);
10230 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
10231 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
10234 $tmpobj = $memory_object_list[$class][
'list'][
$id];
10236 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
10239 $text = str_replace((
string) $key_to_substitute, (
string) $valuetouseforsubstitution, $text);
10265 global
$conf, $user;
10267 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
10272 $dirsubstitutions = array_merge(array(), (array)
$conf->modules_parts[
'substitutions']);
10274 foreach ($dirsubstitutions as $reldir) {
10282 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
10283 foreach ($substitfiles as $substitfile) {
10285 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
10288 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
10290 require_once $dir.$substitfile[
'name'];
10292 $function_name = $module.
"_".$callfunc;
10293 if (function_exists($function_name)) {
10294 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
10302 foreach ($substitutionarray as $key => $value) {
10303 $tags .=
'{'.$key.
'} => '.$value.
"\n";
10305 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
10318function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
10320 print
get_date_range($date_start, $date_end, $format, $outputlangs);
10333function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
10339 if (!is_object($outputlangs)) {
10340 $outputlangs = $langs;
10343 if ($date_start && $date_end) {
10344 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
10346 if ($date_start && !$date_end) {
10347 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
10349 if (!$date_start && $date_end) {
10350 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
10370 if ($nameorder < 0) {
10373 if ($nameorder == 1) {
10374 $ret .= $firstname;
10375 if ($firstname && $lastname) {
10379 } elseif ($nameorder == 2 || $nameorder == 3) {
10380 $ret .= $firstname;
10381 if (empty($ret) && $nameorder == 3) {
10386 if (empty($ret) && $nameorder == 5) {
10387 $ret .= $firstname;
10389 if ($nameorder == 0) {
10390 if ($firstname && $lastname) {
10393 $ret .= $firstname;
10412function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
10415 if (!is_array($mesgs)) {
10416 $mesgs = trim((
string) $mesgs);
10419 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
10423 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
10425 $_SESSION[
'dol_events'][$style][] = $mesgs;
10430 foreach ($mesgs as $mesg) {
10431 $mesg = trim((
string) $mesg);
10433 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
10437 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
10439 $_SESSION[
'dol_events'][$style][] = $mesg;
10459function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
10461 if (empty($mesg) && empty($mesgs)) {
10469 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE".$messagekey])) {
10470 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
10471 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
10473 if (empty($mesgs)) {
10476 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
10497 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
10498 if (empty($disabledoutputofmessages)) {
10501 unset($_SESSION[
'dol_events'][
'mesgs']);
10504 if (isset($_SESSION[
'dol_events'][
'errors'])) {
10505 if (empty($disabledoutputofmessages)) {
10508 unset($_SESSION[
'dol_events'][
'errors']);
10512 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
10513 if (empty($disabledoutputofmessages)) {
10516 unset($_SESSION[
'dol_events'][
'warnings']);
10534function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
10536 global
$conf, $langs;
10541 $divstart = $divend =
'';
10544 if ((empty(
$conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
10545 $divstart =
'<div class="'.$style.
' clearboth">';
10546 $divend =
'</div>';
10549 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
10550 $langs->load(
"errors");
10552 if (is_array($mesgarray) && count($mesgarray)) {
10553 foreach ($mesgarray as $message) {
10555 $out .= $langs->trans($message);
10556 if ($ret < count($mesgarray)) {
10563 $out .= $langs->trans($mesgstring);
10569 if (!empty(
$conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
10570 $return =
'<script nonce="'.getNonce().
'">
10571 $(document).ready(function() {
10572 /* jnotify(message, preset of message type, keepmessage) */
10573 $.jnotify("'.
dol_escape_js($out).
'", "'.($style ==
"ok" ? 3000 : $style).
'", '.($style ==
"ok" ?
"false" :
"true").
',{ remove: function (){} } );
10613function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
10615 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
10621 if (is_array($mesgarray)) {
10622 foreach ($mesgarray as $val) {
10623 if ($val && preg_match(
'/class="error"/i', $val)) {
10627 if ($val && preg_match(
'/class="warning"/i', $val)) {
10632 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
10634 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
10637 if ($style ==
'error') {
10640 if ($style ==
'warning') {
10644 if ($iserror || $iswarning) {
10646 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
10647 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
10648 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
10650 if (is_array($mesgarray)) {
10651 $newmesgarray = array();
10652 foreach ($mesgarray as $val) {
10653 if (is_string($val)) {
10654 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
10655 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
10656 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
10657 $newmesgarray[] = $tmpmesgstring;
10659 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
10662 $mesgarray = $newmesgarray;
10664 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
10706function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
10709 $order = strtolower($order);
10711 if (is_array($array)) {
10712 $sizearray = count($array);
10713 if ($sizearray > 0) {
10715 foreach (array_keys($array) as $key) {
10716 if (is_object($array[$key])) {
10717 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
10720 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
10722 if ($natsort == -1) {
10723 $temp[$key] =
'___'.$temp[$key];
10727 if (empty($natsort) || $natsort == -1) {
10728 if ($order ==
'asc') {
10734 if ($case_sensitive) {
10737 natcasesort($temp);
10739 if ($order !=
'asc') {
10740 $temp = array_reverse($temp,
true);
10746 foreach (array_keys($temp) as $key) {
10747 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10766 $str = (string) $str;
10769 $strLength = strlen($str);
10770 for ($i = 0; $i < $strLength; $i++) {
10771 if (ord($str[$i]) < 0x80) {
10773 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10775 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10777 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10779 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10781 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10786 for ($j = 0; $j < $n; $j++) {
10787 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10808 return preg_match(
'//u', $str) ? true :
false;
10820 if (function_exists(
'mb_check_encoding')) {
10822 if (!mb_check_encoding($str,
'ASCII')) {
10826 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10844 $tmp = ini_get(
"unicode.filesystem_encoding");
10845 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10846 $tmp =
'iso-8859-1';
10855 if ($tmp ==
'iso-8859-1') {
10856 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10877function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
10887 if ($useCache && isset(
$conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10888 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10891 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10893 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10894 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10895 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
10896 $sql .=
" WHERE ".$fieldkey.
" = ".((int) $key);
10898 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10900 if (!empty($entityfilter)) {
10901 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10907 $resql = $db->query($sql);
10909 $obj = $db->fetch_object($resql);
10912 $valuetoget = $obj->valuetoget;
10913 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
10915 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10919 return $valuetoget;
10936 if ($matchrule == 1) {
10937 if ($var ==
'mainmenu') {
10939 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10940 } elseif ($var ==
'leftmenu') {
10942 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10944 return 'This variable is not accessible with dol_eval';
10947 return 'This value for matchrule is not implemented';
10961function verifCond($strToEvaluate, $onlysimplestring =
'1')
10965 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10968 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10969 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10989function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10991 if ($returnvalue != 1) {
10992 dol_syslog(
"Use of dol_eval with parameter returnvalue = 0 is now forbidden. Please fix this", LOG_ERR);
11015 $db, $langs, $user, $website, $websitepage,
11016 $action, $mainmenu, $leftmenu,
11025 defined(
'T_COALESCE_EQUAL') || define(
'T_COALESCE_EQUAL', PHP_INT_MAX);
11026 defined(
'T_FN') || define(
'T_FN', PHP_INT_MAX);
11029 defined(
'T_ATTRIBUTE') || define(
'T_ATTRIBUTE', PHP_INT_MAX);
11030 defined(
'T_MATCH') || define(
'T_MATCH', PHP_INT_MAX);
11031 defined(
'T_NAME_FULLY_QUALIFIED') || define(
'T_NAME_FULLY_QUALIFIED', PHP_INT_MAX);
11032 defined(
'T_NAME_QUALIFIED') || define(
'T_NAME_QUALIFIED', PHP_INT_MAX);
11033 defined(
'T_NAME_RELATIVE') || define(
'T_NAME_RELATIVE', PHP_INT_MAX);
11036 defined(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11037 defined(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11038 defined(
'T_ENUM') || define(
'T_ENUM', PHP_INT_MAX);
11039 defined(
'T_READONLY') || define(
'T_READONLY', PHP_INT_MAX);
11042 defined(
'T_PRIVATE_SET') || define(
'T_PRIVATE_SET', PHP_INT_MAX);
11043 defined(
'T_PROTECTED_SET') || define(
'T_PROTECTED_SET', PHP_INT_MAX);
11044 defined(
'T_PUBLIC_SET') || define(
'T_PUBLIC_SET', PHP_INT_MAX);
11046 $prohibited_token_ids = [
11052 'T_ABSTRACT',
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
'T_ATTRIBUTE',
11057 'T_CALLABLE',
'T_CATCH',
'T_CLASS',
'T_CLOSE_TAG',
'T_CONST',
11060 'T_DECLARE',
'T_DIR',
11063 'T_ECHO',
'T_ENDDECLARE',
'T_ENUM',
'T_EVAL',
'T_EXIT',
'T_EXTENDS',
11065 'T_FILE',
'T_FINAL',
'T_FINALLY',
'T_FN',
'T_FUNCTION',
'T_FUNC_C',
11066 'T_GLOBAL',
'T_GOTO',
11070 'T_IMPLEMENTS',
'T_INCLUDE',
'T_INCLUDE_ONCE',
'T_INSTEADOF',
'T_INTERFACE',
11080 'T_OPEN_TAG',
'T_OPEN_TAG_WITH_ECHO',
11082 'T_PRINT',
'T_PRIVATE',
'T_PROTECTED',
'T_PUBLIC',
11084 'T_READONLY',
'T_REQUIRE',
'T_REQUIRE_ONCE',
'T_RETURN',
11088 'T_THROW',
'T_TRAIT',
'T_TRAIT_C',
'T_TRY',
11089 'T_UNSET',
'T_UNSET_CAST',
'T_USE',
11102 $prohibited_variables = [
11103 '$_COOKIE',
'$_ENV',
'$_FILES',
'$GLOBALS',
'$_GET',
'$_POST',
'$_REQUEST',
'$_SERVER',
'$_SESSION',
11106 $prohibited_functions = [
11109 'override_function',
'session_id',
'session_create_id',
'session_regenerate_id',
11110 'call_user_func',
'call_user_func_array',
11111 'exec',
'passthru',
'shell_exec',
'system',
'proc_open',
'popen',
11112 'dol_eval',
'dol_eval_new',
'dol_eval_standard',
'dol_contctdesc',
'executeCLI',
'verifCond',
'GETPOST',
11113 'create_function',
'assert',
'mb_ereg_replace',
'mb_eregi_replace',
11114 'dol_compress_dir',
'dol_decode',
'dol_delete_file',
'dol_delete_dir',
'dol_delete_dir_recursive',
'dol_copy',
'archiveOrBackupFile',
11115 'fopen',
'file_put_contents',
'fputs',
'fputscsv',
'fwrite',
'fpassthru',
'mkdir',
'rmdir',
'symlink',
'touch',
'unlink',
'umask',
11116 'invoke',
'invokeArgs',
11117 'filter_input',
'filter_input_array',
'GETPOST',
11120 $prohibited_token_arrangements = [
11122 ' T_VARIABLE ( ',
' " ( ',
' \' ( ',
' T_CONSTANT_ENCAPSED_STRING ( ',
' ) ( ',
11125 $tokens = token_get_all(
"<?php return {$s};", TOKEN_PARSE);
11127 $tokens_arrangement =
' ';
11129 for ($i = 2,
$c = count($tokens) - 1; $i <
$c; ++$i) {
11130 if (is_array($tokens[$i])) {
11131 $token_id = $tokens[$i][0];
11132 $token_value = $tokens[$i][1];
11133 $token_name = token_name($tokens[$i][0]);
11135 $token_id = $tokens[$i];
11136 $token_value = $tokens[$i];
11137 $token_name = $tokens[$i];
11141 if (T_WHITESPACE === $token_id) {
11146 $tokens_arrangement .=
"{$token_name} ";
11149 if (T_VARIABLE === $token_id
11150 && in_array($token_value, $prohibited_variables,
true)
11152 return "« {$token_value} » is prohibited in « {$s} »";
11156 if (T_STRING === $token_id
11157 && in_array($token_value, $prohibited_functions,
true)
11159 return "« {$token_value} » is prohibited in « {$s} »";
11164 $maxi = count($prohibited_token_ids);
11165 for ($i = 0; $i < $maxi; ++$i) {
11166 if (
false !== strpos($tokens_arrangement,
" {$prohibited_token_ids[$i]} ")) {
11167 return "« {$prohibited_token_ids[$i]} » is prohibited in « {$s} »";
11172 $maxi = count($prohibited_token_arrangements);
11173 for ($i = 0; $i < $maxi; ++$i) {
11174 if (
false !== strpos($tokens_arrangement, $prohibited_token_arrangements[$i])) {
11175 return "« {$prohibited_token_arrangements[$i]} » is prohibited in « {$s} »";
11181 return @eval(
"return {$s};") ??
'';
11182 }
catch (Throwable $ex) {
11183 return "Exception during evaluation: ".$s.
" - ".$ex->getMessage();
11201function dol_eval_standard($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
11205 global $db, $langs, $user, $website, $websitepage;
11206 global $action, $mainmenu, $leftmenu;
11208 global $objectoffield;
11214 $isObBufferActive =
false;
11215 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
11216 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
11218 if (!is_scalar($s)) {
11219 return "Bad call of dol_eval. First parameter must be a string, found ".var_export($s,
true);
11224 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
11230 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
11231 if ($onlysimplestring ==
'2') {
11232 $specialcharsallowed .=
'<[]';
11235 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
11237 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
11238 if ($returnvalue) {
11239 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): '.$s;
11241 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): '.$s, LOG_WARNING);
11247 $tmps = str_replace(
' ? ',
'__XXX__', $s);
11248 if (strpos($tmps,
'?') !==
false) {
11249 if ($returnvalue) {
11250 return 'Bad string syntax to evaluate (The char ? can be used only with a space before and after): '.$s;
11252 dol_syslog(
'Bad string syntax to evaluate (The char ? can be used only with a space before and after): '.$s, LOG_WARNING);
11258 if (preg_match(
'/<=?[^\s]/', $s)) {
11259 if ($returnvalue) {
11260 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a < or <= without space before and after): '.$s;
11262 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a < or <= without space before and after): '.$s, LOG_WARNING);
11268 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
11269 if ($returnvalue) {
11270 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a call using "$abc(" or "$abc (" instead of using the direct name of the function): '.$s;
11272 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a call using "$abc(" or "$abc (" instead of using the direct name of the function): '.$s, LOG_WARNING);
11281 while ($scheck && $savescheck != $scheck) {
11282 $savescheck = $scheck;
11283 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
11284 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
11285 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
11286 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
11287 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
11288 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
11289 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
11290 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
11291 $scheck = preg_replace(
'/\s!\(/',
' __NOTANDPARENTHESIS__', $scheck);
11292 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
11297 if (strpos($scheck,
'(') !==
false) {
11298 if ($returnvalue) {
11299 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
11301 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s, LOG_WARNING);
11310 if ($s ===
'Array') {
11311 if ($returnvalue) {
11312 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
11314 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
11319 if (!
getDolGlobalString(
'MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL') && strpos($s,
'::') !==
false) {
11320 if ($returnvalue) {
11321 return 'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s;
11323 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s, LOG_WARNING);
11328 if (strpos($s,
'`') !==
false) {
11329 if ($returnvalue) {
11330 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
11332 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
11339 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
11340 if ($returnvalue) {
11341 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
11343 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
11350 $forbiddenphpstrings = array(
'$$',
'$_',
'}[',
')(');
11351 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_GLOBAL',
'_POST',
'_REQUEST',
'ReflectionFunction'));
11356 $forbiddenphpfunctions = array();
11357 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
11358 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
11359 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
11361 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"array_all",
"array_any",
"array_diff_ukey",
"array_filter",
"array_find",
"array_find_key",
"array_map",
"array_reduce",
"array_intersect_uassoc",
"array_intersect_ukey",
"array_walk",
"array_walk_recursive"));
11362 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
11363 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"error_log",
"set_error_handler",
"set_exception_handler",
"libxml_set_external_entity_loader",
"register_shutdown_function",
"register_tick_function",
"unregister_tick_function"));
11364 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
11365 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
11367 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
11369 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
11370 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
11371 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"dol_concatdesc",
"executeCLI",
"verifCond",
"GETPOST",
"dolEncrypt",
"dolDecrypt"));
11372 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
11373 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
11374 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_dir_list",
"dol_dir_list_in_database",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
11375 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"chdir",
"dir",
"fopen",
"file",
"file_exists",
"file_get_contents",
"file_put_contents",
"fget",
"fgetc",
"fgetcsv",
"fputs",
"fputscsv",
"fpassthru",
"fscanf",
"fseek",
"fwrite",
"is_file",
"is_dir",
"is_link",
"mkdir",
"opendir",
"rmdir",
"scandir",
"symlink",
"touch",
"unlink",
"umask"));
11376 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
11379 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
11380 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concatdesc"));
11383 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
11385 $forbiddenphpregex =
'global\s*\$';
11386 $forbiddenphpregex .=
'|';
11387 $forbiddenphpregex .=
'\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
11389 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
11392 $oldstringtoclean = $s;
11393 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
11394 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
11395 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
11397 }
while ($oldstringtoclean != $s);
11400 if (strpos($s,
'__forbiddenstring__') !==
false) {
11401 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
11402 if ($returnvalue) {
11403 return 'Bad string syntax to evaluate: '.$s;
11405 dol_syslog(
'Bad string syntax to evaluate: '.$s);
11411 if ($returnvalue) {
11413 $isObBufferActive =
true;
11414 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
11415 $tmpo = ob_get_clean();
11416 $isObBufferActive =
false;
11418 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
11422 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
11430 }
catch (Error $e) {
11431 if ($isObBufferActive) {
11433 $tmpo = ob_get_clean();
11434 $isObBufferActive =
false;
11436 $error =
'dol_eval try/catch error : ';
11437 $error .= $e->getMessage();
11439 if ($returnvalue) {
11440 return 'Exception during evaluation: '.$s;
11456 return (trim($element) !=
'');
11469 if (empty($codelang)) {
11473 if ($codelang ==
'auto') {
11474 return '<span class="fa fa-language"></span>';
11477 $langtocountryflag = array(
11479 'ca_ES' =>
'catalonia',
11483 'sw_SW' =>
'unknown',
11493 if (isset($langtocountryflag[$codelang])) {
11494 $flagImage = $langtocountryflag[$codelang];
11496 $tmparray = explode(
'_', $codelang);
11497 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
11502 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
11503 $morecss = $reg[1];
11508 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
11522 if (empty($countrycode)) {
11526 if (strtoupper($countrycode) ==
'MQ') {
11529 if (strtoupper($countrycode) ==
'SE') {
11532 if (strtoupper($countrycode) ==
'CH') {
11533 if ($mysoc->country_code ==
'FR') {
11536 if ($mysoc->country_code ==
'DE') {
11539 if ($mysoc->country_code ==
'IT') {
11721 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
11722 if (in_array($buildprimarykeytotest, $locales)) {
11723 return strtolower($countrycode).
'_'.strtoupper($countrycode);
11726 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
11727 foreach ($locales as $locale) {
11728 $locale_language = locale_get_primary_language($locale);
11729 $locale_region = locale_get_region($locale);
11730 if (strtoupper($countrycode) == $locale_region) {
11732 return strtolower($locale_language).
'_'.strtoupper($locale_region);
11736 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
11774 global $hookmanager, $db;
11776 if (isset(
$conf->modules_parts[
'tabs'][$type]) && is_array(
$conf->modules_parts[
'tabs'][$type])) {
11777 foreach (
$conf->modules_parts[
'tabs'][$type] as $value) {
11778 $values = explode(
':', $value);
11781 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
11786 $posstart = strpos($str,
'(');
11787 if ($posstart > 0) {
11788 $posend = strpos($str,
')');
11789 if ($posstart > 0) {
11790 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
11791 if (is_numeric($res1)) {
11792 $postab = (int) $res1;
11793 $values[1] =
'+' . substr($str, $posend + 1);
11797 if (count($values) == 6) {
11801 if ($values[0] != $type) {
11807 if ($filterorigmodule) {
11808 if (strpos($values[3],
'@')) {
11809 if ($filterorigmodule !=
'external') {
11813 if ($filterorigmodule !=
'core') {
11818 $langs->load($values[3]);
11820 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11822 $substitutionarray = array();
11827 $labeltemp = explode(
',', $values[2]);
11828 $label = $langs->trans($labeltemp[0]);
11830 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
11832 $classtoload = $labeltemp[1];
11833 if (class_exists($classtoload)) {
11834 $obj =
new $classtoload($db);
11835 $function = $labeltemp[3];
11836 if ($obj && $function && method_exists($obj, $function)) {
11838 $nbrec = $obj->$function(
$object->id, $obj);
11839 if (!empty($nbrec)) {
11840 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
11848 $newtab[1] = $label;
11849 $newtab[2] = str_replace(
'+',
'', $values[1]);
11854 } elseif (count($values) == 5) {
11855 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
11857 if ($values[0] != $type) {
11861 if ($filterorigmodule) {
11862 if (strpos($values[3],
'@')) {
11863 if ($filterorigmodule !=
'external') {
11867 if ($filterorigmodule !=
'core') {
11872 $langs->load($values[3]);
11874 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11875 $substitutionarray = array();
11879 $label = $langs->trans($values[2]);
11883 $newtab[1] = $label;
11884 $newtab[2] = str_replace(
'+',
'', $values[1]);
11888 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
11889 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
11890 if ($values[0] != $type) {
11893 $tabname = str_replace(
'-',
'', $values[1]);
11894 foreach ($head as $key => $val) {
11895 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
11897 if ($head[$key][2] == $tabname && $condition) {
11898 unset($head[$key]);
11907 if (!empty($hookmanager)) {
11908 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
11910 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
11911 if ($reshook > 0) {
11912 $head = $hookmanager->resArray;
11914 $head = array_merge($head, $hookmanager->resArray);
11933 global
$conf, $hookmanager, $user, $langs;
11936 global $micro_start_time;
11938 if ($zone ==
'private') {
11939 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
11941 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
11945 print
"\n<!-- A div to store page_y POST parameter -->\n";
11946 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
11948 $parameters = array();
11949 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
11950 if (empty($reshook)) {
11956 if (!empty(
$conf->use_javascript_ajax)) {
11957 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
11958 print
'<script>'.
"\n";
11959 print
'jQuery(document).ready(function() {'.
"\n";
11961 if ($zone ==
'private' && empty(
$conf->dol_use_jmobile)) {
11963 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
11964 print
'jQuery("li.menuhider").click(function(event) {';
11965 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
11966 print
' console.log("We click on .menuhider");'.
"\n";
11967 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
11972 if ($action ==
'create' || $action ==
'add' || $action ==
'edit' || (empty($action) && (preg_match(
'/new\.php/', $_SERVER[
"PHP_SELF"]))) || ((empty($action) || $action ==
'addline') && (preg_match(
'/card\.php/', $_SERVER[
"PHP_SELF"])))) {
11973 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
11974 $relativepathstring = $_SERVER[
"PHP_SELF"];
11976 if (constant(
'DOL_URL_ROOT')) {
11977 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
11979 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
11980 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
11983 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
11984 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
11986 if ($defkey !=
'_noquery_') {
11987 $tmpqueryarraytohave = explode(
'&', $defkey);
11989 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11990 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
11992 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
11996 if (!$foundintru) {
12005 print
'console.log("set the focus by executing jQuery(...).focus();")'.
"\n";
12006 foreach ($defval as $paramkey => $paramval) {
12008 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
12009 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // TODO KO with ckeditor
12010 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
12015 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
12016 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
12018 if ($defkey != '_noquery_') {
12019 $tmpqueryarraytohave = explode('&', $defkey);
12021 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
12022 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
12023 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
12024 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
12028 if (!$foundintru) {
12031 //var_dump($defkey.'-'.$qualified);
12037 print 'console.log("set the js code to manage fields that are
set as mandatory
");'."\n
";
12039 foreach ($defval as $paramkey => $paramval) {
12040 // Solution 1: Add handler on submit to check if mandatory fields are empty
12041 print 'var form = $(\'[name="'.dol_escape_js($paramkey).'"]\').closest("form
");'."\n
";
12042 print "form.on(
'submit',
function(event) {
12043 var submitter = \$(
this).find(
':submit:focus').get(0);
12044 var buttonName = submitter ? \$(submitter).attr(
'name') :
'save';
12046 if (buttonName ==
'cancel') {
12047 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
12051 console.log(
'We did not click on cancel button but on something else, we check that field [name=".dol_escape_js($paramkey)."] is not empty');
12053 var tmpvalue = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').val();
12054 let tmptypefield = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').prop(
'nodeName').toLowerCase();
12056 if (tmptypefield ==
'textarea') {
12058 var tmpeditor = CKEDITOR.instances[
'".dol_escape_js($paramkey)."'];
12060 tmpvalue = tmpeditor.getData();
12061 console.log(
'For textarea tmpvalue is '+tmpvalue);
12065 let tmpvalueisempty =
false;
12066 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1) {
12067 tmpvalueisempty =
true;
12069 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
12070 tmpvalueisempty =
true;
12072 if (tmpvalueisempty && buttonName !==
'cancel') {
12073 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
12074 event.preventDefault();
12075 event.stopPropagation();
12077 alert(
'".dol_escape_js($langs->transnoentitiesnoconv("ErrorFieldRequired", $paramkey).' (
'.$langs->transnoentitiesnoconv("CustomMandatoryFieldRule").')
')."');
12081 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
12086 // Solution 2: Add property 'required' on input
12087 // so browser will check value and try to focus on it when submitting the form.
12088 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
12089 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
12090 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
12091 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
12092 //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
";
12093 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
12099 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");'.
"\n";
12103 print
'jQuery("input[name=\'cancel\']").click(function() {
12104 console.log("We click on cancel button so removed all required attribute");
12105 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
12115 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
12117 print
"/* JS CODE TO ENABLE to add memory info */\n";
12118 print
'window.console && console.log("';
12123 if (!empty($micro_start_time)) {
12124 $micro_end_time = microtime(
true);
12125 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
12128 if (function_exists(
"memory_get_usage")) {
12129 print
' - Mem: '.memory_get_usage();
12131 if (function_exists(
"memory_get_peak_usage")) {
12132 print
' - Real mem peak: '.memory_get_peak_usage(
true);
12134 if (function_exists(
"zend_loader_file_encoded")) {
12135 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
12140 print
"\n".
'</script>'.
"\n";
12146 foreach ($tmptagarray as $tmptag) {
12148 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
12150 <!-- Global site tag (gtag.js) - Google Analytics -->
12151 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
12153 window.dataLayer = window.dataLayer || [];
12154 function gtag(){dataLayer.push(arguments);}
12155 gtag(\'js\', new Date());
12157 gtag(\'config\', \''.trim($tmptag).
'\');
12164 // Add Xdebug coverage of code
12165 if (defined('XDEBUGCOVERAGE
')) {
12166 print_r(xdebug_get_code_coverage());
12169 // Add DebugBar data
12170 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
12171 if (isset($debugbar['time
'])) {
12172 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
12173 $debugbar['time
']->stopMeasure('pageaftermaster
');
12175 print '<!-- Output debugbar data -->
'."\n";
12176 $renderer = $debugbar->getJavascriptRenderer();
12177 print $renderer->render();
12178 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
12180 print "<!-- Start of log output\n";
12181 //print '<div
class=
"hidden">
'."\n";
12182 foreach ($conf->logbuffer as $logline) {
12183 print $logline."<br>\n";
12185 //print '</div>
'."\n";
12186 print "End of log output -->\n";
12200function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
12202 if (is_null($string)) {
12206 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
12207 // This is a regex string
12208 $newdelimiter = $delimiter;
12210 // This is a simple string
12211 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
12212 $newdelimiter = preg_quote($delimiter, '/
');
12215 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
12217 foreach ($a as $s) { // each part
12219 if ($pos = strpos($s, $kv)) { // key/value delimiter
12220 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
12221 } else { // key delimiter not found
12239function dolExplodeKeepIfQuotes($input)
12241 // Use regexp to capture words and section in quotes
12242 $matches = array();
12243 preg_match_all('/
"([^"]*)
"|\'([^\']*)\'|(\S+)/', $input, $matches);
12245 // Merge result and delete empty values
12247 $result = array_map(
12254 static function ($a, $b, $c) {
12270 return array_values(array_filter(
12278 static function ($val) {
12279 return $val !== '';
12291function dol_set_focus($selector)
12293 print "\n
".'<!-- Set focus onto a specific field -->'."\n
";
12294 print '<script nonce="'.getNonce().'">jQuery(document).ready(function() { console.log("Force focus by
dol_set_focus"); jQuery("'.dol_escape_js($selector).'").focus(); });</script>'."\n
";
12305function dol_getmypid()
12307 if (!function_exists('getmypid')) {
12308 return mt_rand(99900000, 99965535);
12310 return getmypid(); // May be a number on 64 bits (depending on OS)
12335function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
12337 global $db, $langs;
12339 $value = trim($value);
12342 $value = preg_replace('/\*/', '%', $value); // Replace * with %
12345 $value = preg_replace('/([!<>=]+)\s+([0-9'.preg_quote($langs->trans("SeparatorDecimal
"), '/').'\-])/', '\1\2', $value); // Clean string '< 10' into '<10' so we can then explode on space to get all tests to do
12348 $value = preg_replace('/\s*\|\s*/', '|', $value);
12350 // Split criteria on ' ' but not if we are inside quotes.
12351 // For mode 3, the split is done later on the , only and not on the ' '.
12352 if ($mode != -3 && $mode != 3) {
12353 $crits = dolExplodeKeepIfQuotes($value);
12355 $crits = array($value);
12359 if (!is_array($fields)) {
12360 $fields = array($fields);
12362 $i1 = 0; // count the nb of "and
" criteria added (all fields / criteria)
12363 foreach ($crits as $crit) { // Loop on each AND criteria
12364 $crit = trim($crit);
12365 $i2 = 0; // count the nb of valid criteria added for this this first criteria
12368 foreach ($fields as $field) {
12370 $tmpcrits = explode('|', $crit);
12371 $i3 = 0; // count the nb of valid criteria added for this current field
12372 foreach ($tmpcrits as $tmpcrit) {
12373 if ($tmpcrit !== '0' && empty($tmpcrit)) {
12376 $tmpcrit = trim($tmpcrit);
12378 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
12381 $newcrit = preg_replace('/([!<>=]+)/', '', $tmpcrit);
12384 preg_match('/([!<>=]+)/', $tmpcrit, $reg);
12385 if (!empty($reg[1])) {
12386 $operator = $reg[1];
12388 if ($newcrit != '') {
12389 $numnewcrit = price2num($newcrit);
12390 if (is_numeric($numnewcrit)) {
12391 $newres .= $db->sanitize($field).' '.$operator.' '.((float) $numnewcrit); // should be a numeric
12393 $newres .= '1 = 2'; // force false, we received a corrupted data
12395 $i3++; // a criteria was added to string
12398 $i2++; // a criteria for 1 more field was added to string
12399 } elseif ($mode == 2 || $mode == -2) {
12400 $crit = preg_replace('/[^\-0-9,]/', '', $crit); // ID are always integer
12401 $newres .= ($i2 > 0 ? ' OR ' : '').$db->sanitize($field)." ".($mode == -2 ? 'NOT ' : '');
12402 $newres .= $crit ? "IN (
".$db->sanitize($db->escape($crit)).")
" : "IN (0)
";
12404 $newres .= ' OR '.$db->sanitize($field).' IS NULL';
12406 $i2++; // a criteria for 1 more field was added to string
12407 } elseif ($mode == 3 || $mode == -3) {
12408 $tmparray = explode(',', $crit);
12409 if (count($tmparray)) {
12411 foreach ($tmparray as $val) {
12414 $listofcodes .= ($listofcodes ? ',' : '');
12415 $listofcodes .= "'".$db->escape($val)."'";
12418 $newres .= ($i2 > 0 ? ' OR ' : '').$db->sanitize($field)." ".($mode == -3 ? 'NOT ' : '')."IN (
".$db->sanitize($listofcodes, 1, 0, 1).")
";
12419 $i2++; // a criteria for 1 more field was added to string
12422 $newres .= ' OR '.$db->sanitize($field).' IS NULL';
12424 } elseif ($mode == 4) {
12425 $tmparray = explode(',', $crit);
12426 if (count($tmparray)) {
12428 foreach ($tmparray as $val) {
12431 $newres .= ($i2 > 0 ? " OR (
" : "(
").$db->sanitize($field)." LIKE
'".$db->escape($val).",%'";
12432 $newres .= ' OR '.$db->sanitize($field)." =
'".$db->escape($val)."'";
12433 $newres .= ' OR '.$db->sanitize($field)." LIKE
'%,".$db->escape($val)."'";
12434 $newres .= ' OR '.$db->sanitize($field)." LIKE
'%,".$db->escape($val).",%'";
12436 $i2++; // a criteria for 1 more field was added to string (we can add several criteria for the same field as it is a multiselect search criteria)
12440 } else { // $mode=0
12441 $tmpcrits = explode('|', $crit);
12442 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
12443 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
12444 if ($tmpcrit !== '0' && empty($tmpcrit)) {
12447 $tmpcrit = trim($tmpcrit);
12449 if ($tmpcrit == '^$' || strpos($crit, '!') === 0) { // If we search empty, we must combined different OR fields with AND
12450 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND ' : '');
12452 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
12455 if (preg_match('/\.(id|rowid)$/', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
12456 $newres .= $db->sanitize($field)." =
".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0');
12458 $tmpcrit2 = $tmpcrit;
12463 if (preg_match('/^!/', $tmpcrit)) {
12464 $tmps .= $db->sanitize($field)." NOT LIKE
"; // ! as exclude character
12465 $tmpcrit2 = preg_replace('/^!/', '', $tmpcrit2);
12467 $tmps .= $db->sanitize($field)." LIKE
";
12471 if (preg_match('/^[\^\$]/
', $tmpcrit)) {
12473 $tmpcrit2 = preg_replace('/^[\^\$]/
', '', $tmpcrit2);
12475 if (preg_match('/[\^\$]$/
', $tmpcrit)) {
12477 $tmpcrit2 = preg_replace('/[\^\$]$/
', '', $tmpcrit2);
12480 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
12484 $newres .= $tmpbefore;
12485 $newres .= $db->escape($tmpcrit2);
12486 $newres .= $tmpafter;
12488 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
12489 $newres .= " OR
".$field." IS NULL)
";
12496 $i2++; // a criteria for 1 more field was added to string
12500 $res = $res.($res ? ' AND ' : '').($i2 > 1 ? '(' : '').$newres.($i2 > 1 ? ')' : '');
12504 $res = ($nofirstand ? "" : " AND
")."(
".$res.")
";
12515function showDirectDownloadLink($object)
12520 $url = $object->getLastMainDocLink($object->element);
12522 $out .= img_picto($langs->trans("PublicDownloadLinkDesc
"), 'globe').' <span class="opacitymedium
">'.$langs->trans("DirectDownloadLink
").'</span><br>';
12524 $out .= '<div class="urllink
"><input type="text
" id="directdownloadlink
" class="quatrevingtpercent
" value="'.$url.'"></div>';
12525 $out .= ajax_autoselect("directdownloadlink
", '');
12527 $out .= '<div class="urllink
">'.$langs->trans("FileNotShared
").'</div>';
12541function getImageFileNameForSize($file, $extName, $extImgTarget = '')
12543 $dirName = dirname($file);
12544 if ($dirName == '.') {
12548 if (!in_array($extName, array('', '_small', '_mini'))) {
12549 return 'Bad parameter extName';
12552 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i', '', $file); // We remove image extension, whatever is its case
12553 $fileName = basename($fileName);
12555 if (empty($extImgTarget)) {
12556 $extImgTarget = (preg_match('/\.jpg$/i', $file) ? '.jpg' : '');
12558 if (empty($extImgTarget)) {
12559 $extImgTarget = (preg_match('/\.jpeg$/i', $file) ? '.jpeg' : '');
12561 if (empty($extImgTarget)) {
12562 $extImgTarget = (preg_match('/\.gif$/i', $file) ? '.gif' : '');
12564 if (empty($extImgTarget)) {
12565 $extImgTarget = (preg_match('/\.png$/i', $file) ? '.png' : '');
12567 if (empty($extImgTarget)) {
12568 $extImgTarget = (preg_match('/\.bmp$/i', $file) ? '.bmp' : '');
12570 if (empty($extImgTarget)) {
12571 $extImgTarget = (preg_match('/\.webp$/i', $file) ? '.webp' : '');
12574 if (!$extImgTarget) {
12580 $subdir = 'thumbs/';
12583 return ($dirName ? $dirName.'/' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
12596function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '')
12598 global $conf, $langs;
12600 if (empty($conf->use_javascript_ajax)) {
12604 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
12606 if ($alldata == 1) {
12607 if ($isAllowedForPreview) {
12608 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));
12614 // old behavior, return a string
12615 if ($isAllowedForPreview) {
12616 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart='.urlencode($modulepart).'&attachment=0&file='.urlencode($relativepath).($param ? '&'.$param : '');
12617 $title = $langs->transnoentities("Preview
");
12618 //$title = '%27-alert(document.domain)-%27'; // An example of js injection into a corrupted title string, that should be blocked by the dol_escape_uri().
12619 //$tmpurl = 'file='.urlencode("'-alert(document.domain)-'_small.jpg
"); // An example of tmpurl that should be blocked by the dol_escape_uri()
12621 // We need to do a dol_escape_uri() on the full string after the javascript: because such parts are the URI and when we click on such links, a RFC3986 decode is done,
12622 // by the browser, converting the %27 (like when having param file=abc%27def), or when having a corrupted title), into a ', BEFORE interpreting the content that can be a js code.
12623 // Using the dol_escape_uri guarantee that we encode for URI so decode retrieve original expected value.
12624 return 'javascript:'.dol_escape_uri('document_preview(\''.dol_escape_js($tmpurl).'\', \''.dol_escape_js(dol_mimetype($relativepath)).'\', \''.dol_escape_js($title).'\')');
12636function getLabelSpecialCode($idcode)
12640 $arrayspecialines = array(1 => 'Transport', 2 => 'EcoTax', 3 => 'Option');
12641 if ($idcode > 10) {
12642 return 'Module ID '.$idcode;
12644 if (!empty($arrayspecialines[$idcode])) {
12645 return $langs->trans($arrayspecialines[$idcode]);
12658function ajax_autoselect($htmlname, $addlink = '', $textonlink = 'Link')
12661 $out = '<script nonce="
'.getNonce().'">
12662 jQuery(document).ready(function () {
12663 jQuery("'.((strpos($htmlname, '.
') === 0 ? '' : '#
').$htmlname).'").click(function() { jQuery(this).select(); } );
12667 if ($textonlink === 'image') {
12668 $out .= ' <a href="'.$addlink.'" target="_blank
" rel="noopener noreferrer
">'.img_picto('', 'globe').'</a>';
12670 $out .= ' <a href="'.$addlink.'" target="_blank
" rel="noopener noreferrer
">'.$langs->trans("Link").'</a>';
12683function dolIsAllowedForPreview($file)
12685 // Check .noexe extension in filename
12686 if (preg_match('/\.noexe$/i', $file)) {
12690 // Check mime types
12691 $mime_preview = array('bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css', 'webp');
12692 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES')) {
12693 $mime_preview[] = 'svg+xml';
12695 //$mime_preview[]='vnd.oasis.opendocument.presentation';
12696 //$mime_preview[]='archive';
12697 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
12698 if ($num_mime !== false) {
12702 // By default, not allowed for preview
12716function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0)
12719 $imgmime = 'other.png';
12720 $famime = 'file-o';
12723 $tmpfile = preg_replace('/\.noexe$/', '', $file);
12725 // Plain text files
12726 if (preg_match('/\.txt$/i', $tmpfile)) {
12727 $mime = 'text/plain';
12728 $imgmime = 'text.png';
12729 $famime = 'file-alt';
12730 } elseif (preg_match('/\.rtx$/i', $tmpfile)) {
12731 $mime = 'text/richtext';
12732 $imgmime = 'text.png';
12733 $famime = 'file-alt';
12734 } elseif (preg_match('/\.csv$/i', $tmpfile)) {
12735 $mime = 'text/csv';
12736 $imgmime = 'text.png';
12737 $famime = 'file-csv';
12738 } elseif (preg_match('/\.tsv$/i', $tmpfile)) {
12739 $mime = 'text/tab-separated-values';
12740 $imgmime = 'text.png';
12741 $famime = 'file-alt';
12742 } elseif (preg_match('/\.(cf|conf|log)$/i', $tmpfile)) {
12743 $mime = 'text/plain';
12744 $imgmime = 'text.png';
12745 $famime = 'file-alt';
12746 } elseif (preg_match('/\.ini$/i', $tmpfile)) {
12747 $mime = 'text/plain';
12748 $imgmime = 'text.png';
12750 $famime = 'file-alt';
12751 } elseif (preg_match('/\.md$/i', $tmpfile)) {
12752 $mime = 'text/plain';
12753 $imgmime = 'text.png';
12755 $famime = 'file-alt';
12756 } elseif (preg_match('/\.css$/i', $tmpfile)) {
12757 $mime = 'text/css';
12758 $imgmime = 'css.png';
12760 $famime = 'file-alt';
12761 } elseif (preg_match('/\.lang$/i', $tmpfile)) {
12762 $mime = 'text/plain';
12763 $imgmime = 'text.png';
12765 $famime = 'file-alt';
12766 } elseif (preg_match('/\.(crt|cer|key|pub)$/i', $tmpfile)) { // Certificate files
12767 $mime = 'text/plain';
12768 $imgmime = 'text.png';
12769 $famime = 'file-alt';
12770 } elseif (preg_match('/\.(html|htm|shtml)$/i', $tmpfile)) { // XML based (HTML/XML/XAML)
12771 $mime = 'text/html';
12772 $imgmime = 'html.png';
12774 $famime = 'file-alt';
12775 } elseif (preg_match('/\.(xml|xhtml)$/i', $tmpfile)) {
12776 $mime = 'text/xml';
12777 $imgmime = 'other.png';
12779 $famime = 'file-alt';
12780 } elseif (preg_match('/\.xaml$/i', $tmpfile)) {
12781 $mime = 'text/xml';
12782 $imgmime = 'other.png';
12784 $famime = 'file-alt';
12785 } elseif (preg_match('/\.bas$/i', $tmpfile)) { // Languages
12786 $mime = 'text/plain';
12787 $imgmime = 'text.png';
12789 $famime = 'file-code';
12790 } elseif (preg_match('/\.(c)$/i', $tmpfile)) {
12791 $mime = 'text/plain';
12792 $imgmime = 'text.png';
12794 $famime = 'file-code';
12795 } elseif (preg_match('/\.(cpp)$/i', $tmpfile)) {
12796 $mime = 'text/plain';
12797 $imgmime = 'text.png';
12799 $famime = 'file-code';
12800 } elseif (preg_match('/\.cs$/i', $tmpfile)) {
12801 $mime = 'text/plain';
12802 $imgmime = 'text.png';
12804 $famime = 'file-code';
12805 } elseif (preg_match('/\.(h)$/i', $tmpfile)) {
12806 $mime = 'text/plain';
12807 $imgmime = 'text.png';
12809 $famime = 'file-code';
12810 } elseif (preg_match('/\.(java|jsp)$/i', $tmpfile)) {
12811 $mime = 'text/plain';
12812 $imgmime = 'text.png';
12814 $famime = 'file-code';
12815 } elseif (preg_match('/\.php([0-9]{1})?$/i', $tmpfile)) {
12816 $mime = 'text/plain';
12817 $imgmime = 'php.png';
12819 $famime = 'file-code';
12820 } elseif (preg_match('/\.phtml$/i', $tmpfile)) {
12821 $mime = 'text/plain';
12822 $imgmime = 'php.png';
12824 $famime = 'file-code';
12825 } elseif (preg_match('/\.(pl|pm)$/i', $tmpfile)) {
12826 $mime = 'text/plain';
12827 $imgmime = 'pl.png';
12829 $famime = 'file-code';
12830 } elseif (preg_match('/\.sql$/i', $tmpfile)) {
12831 $mime = 'text/plain';
12832 $imgmime = 'text.png';
12834 $famime = 'file-code';
12835 } elseif (preg_match('/\.js$/i', $tmpfile)) {
12836 $mime = 'text/x-javascript';
12837 $imgmime = 'jscript.png';
12839 $famime = 'file-code';
12840 } elseif (preg_match('/\.odp$/i', $tmpfile)) { // Open office
12841 $mime = 'application/vnd.oasis.opendocument.presentation';
12842 $imgmime = 'ooffice.png';
12843 $famime = 'file-powerpoint';
12844 } elseif (preg_match('/\.ods$/i', $tmpfile)) {
12845 $mime = 'application/vnd.oasis.opendocument.spreadsheet';
12846 $imgmime = 'ooffice.png';
12847 $famime = 'file-excel';
12848 } elseif (preg_match('/\.odt$/i', $tmpfile)) {
12849 $mime = 'application/vnd.oasis.opendocument.text';
12850 $imgmime = 'ooffice.png';
12851 $famime = 'file-word';
12852 } elseif (preg_match('/\.mdb$/i', $tmpfile)) { // MS Office
12853 $mime = 'application/msaccess';
12854 $imgmime = 'mdb.png';
12856 } elseif (preg_match('/\.doc[xm]?$/i', $tmpfile)) {
12857 $mime = 'application/msword';
12858 $imgmime = 'doc.png';
12859 $famime = 'file-word';
12860 } elseif (preg_match('/\.dot[xm]?$/i', $tmpfile)) {
12861 $mime = 'application/msword';
12862 $imgmime = 'doc.png';
12863 $famime = 'file-word';
12864 } elseif (preg_match('/\.xlt(x)?$/i', $tmpfile)) {
12865 $mime = 'application/vnd.ms-excel';
12866 $imgmime = 'xls.png';
12867 $famime = 'file-excel';
12868 } elseif (preg_match('/\.xla(m)?$/i', $tmpfile)) {
12869 $mime = 'application/vnd.ms-excel';
12870 $imgmime = 'xls.png';
12871 $famime = 'file-excel';
12872 } elseif (preg_match('/\.xls$/i', $tmpfile)) {
12873 $mime = 'application/vnd.ms-excel';
12874 $imgmime = 'xls.png';
12875 $famime = 'file-excel';
12876 } elseif (preg_match('/\.xls[bmx]$/i', $tmpfile)) {
12877 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
12878 $imgmime = 'xls.png';
12879 $famime = 'file-excel';
12880 } elseif (preg_match('/\.pps[mx]?$/i', $tmpfile)) {
12881 $mime = 'application/vnd.ms-powerpoint';
12882 $imgmime = 'ppt.png';
12883 $famime = 'file-powerpoint';
12884 } elseif (preg_match('/\.ppt[mx]?$/i', $tmpfile)) {
12885 $mime = 'application/x-mspowerpoint';
12886 $imgmime = 'ppt.png';
12887 $famime = 'file-powerpoint';
12888 } elseif (preg_match('/\.pdf$/i', $tmpfile)) { // Other
12889 $mime = 'application/pdf';
12890 $imgmime = 'pdf.png';
12891 $famime = 'file-pdf';
12892 } elseif (preg_match('/\.bat$/i', $tmpfile)) { // Scripts
12893 $mime = 'text/x-bat';
12894 $imgmime = 'script.png';
12896 $famime = 'file-code';
12897 } elseif (preg_match('/\.sh$/i', $tmpfile)) {
12898 $mime = 'text/x-sh';
12899 $imgmime = 'script.png';
12901 $famime = 'file-code';
12902 } elseif (preg_match('/\.ksh$/i', $tmpfile)) {
12903 $mime = 'text/x-ksh';
12904 $imgmime = 'script.png';
12906 $famime = 'file-code';
12907 } elseif (preg_match('/\.bash$/i', $tmpfile)) {
12908 $mime = 'text/x-bash';
12909 $imgmime = 'script.png';
12911 $famime = 'file-code';
12912 } elseif (preg_match('/\.ico$/i', $tmpfile)) { // Images
12913 $mime = 'image/x-icon';
12914 $imgmime = 'image.png';
12915 $famime = 'file-image';
12916 } elseif (preg_match('/\.(jpg|jpeg)$/i', $tmpfile)) {
12917 $mime = 'image/jpeg';
12918 $imgmime = 'image.png';
12919 $famime = 'file-image';
12920 } elseif (preg_match('/\.png$/i', $tmpfile)) {
12921 $mime = 'image/png';
12922 $imgmime = 'image.png';
12923 $famime = 'file-image';
12924 } elseif (preg_match('/\.gif$/i', $tmpfile)) {
12925 $mime = 'image/gif';
12926 $imgmime = 'image.png';
12927 $famime = 'file-image';
12928 } elseif (preg_match('/\.bmp$/i', $tmpfile)) {
12929 $mime = 'image/bmp';
12930 $imgmime = 'image.png';
12931 $famime = 'file-image';
12932 } elseif (preg_match('/\.(tif|tiff)$/i', $tmpfile)) {
12933 $mime = 'image/tiff';
12934 $imgmime = 'image.png';
12935 $famime = 'file-image';
12936 } elseif (preg_match('/\.svg$/i', $tmpfile)) {
12937 $mime = 'image/svg+xml';
12938 $imgmime = 'image.png';
12939 $famime = 'file-image';
12940 } elseif (preg_match('/\.webp$/i', $tmpfile)) {
12941 $mime = 'image/webp';
12942 $imgmime = 'image.png';
12943 $famime = 'file-image';
12944 } elseif (preg_match('/\.vcs$/i', $tmpfile)) { // Calendar
12945 $mime = 'text/calendar';
12946 $imgmime = 'other.png';
12947 $famime = 'file-alt';
12948 } elseif (preg_match('/\.ics$/i', $tmpfile)) {
12949 $mime = 'text/calendar';
12950 $imgmime = 'other.png';
12951 $famime = 'file-alt';
12952 } elseif (preg_match('/\.torrent$/i', $tmpfile)) { // Other
12953 $mime = 'application/x-bittorrent';
12954 $imgmime = 'other.png';
12955 $famime = 'file-o';
12956 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) { // Audio
12958 $imgmime = 'audio.png';
12959 $famime = 'file-audio';
12960 } elseif (preg_match('/\.mp4$/i', $tmpfile)) { // Video
12961 $mime = 'video/mp4';
12962 $imgmime = 'video.png';
12963 $famime = 'file-video';
12964 } elseif (preg_match('/\.ogv$/i', $tmpfile)) {
12965 $mime = 'video/ogg';
12966 $imgmime = 'video.png';
12967 $famime = 'file-video';
12968 } elseif (preg_match('/\.webm$/i', $tmpfile)) {
12969 $mime = 'video/webm';
12970 $imgmime = 'video.png';
12971 $famime = 'file-video';
12972 } elseif (preg_match('/\.avi$/i', $tmpfile)) {
12973 $mime = 'video/x-msvideo';
12974 $imgmime = 'video.png';
12975 $famime = 'file-video';
12976 } elseif (preg_match('/\.divx$/i', $tmpfile)) {
12977 $mime = 'video/divx';
12978 $imgmime = 'video.png';
12979 $famime = 'file-video';
12980 } elseif (preg_match('/\.xvid$/i', $tmpfile)) {
12981 $mime = 'video/xvid';
12982 $imgmime = 'video.png';
12983 $famime = 'file-video';
12984 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
12986 $imgmime = 'video.png';
12987 $famime = 'file-video';
12988 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) { // Archive
12989 // application/xxx where zzz is zip, ...
12991 $imgmime = 'archive.png';
12992 $famime = 'file-archive';
12993 } elseif (preg_match('/\.(exe|com)$/i', $tmpfile)) { // Exe
12994 $mime = 'application/octet-stream';
12995 $imgmime = 'other.png';
12996 $famime = 'file-o';
12997 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i', $tmpfile)) { // Lib
12999 $imgmime = 'library.png';
13000 $famime = 'file-o';
13001 } elseif (preg_match('/\.err$/i', $tmpfile)) { // phpcs:ignore
13003 $imgmime = 'error.png';
13004 $famime = 'file-alt';
13007 if ($famime == 'file-o') {
13008 // file-o seems to not work in fontawesome 5
13012 // Return mimetype string
13013 switch ((int) $mode) {
13015 $tmp = explode('/', $mime);
13016 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
13038function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid')
13042 $tablename = preg_replace('/^'.preg_quote(MAIN_DB_PREFIX, '/').'/', '', $tablename); // Clean name of table for backward compatibility.
13044 $dictvalues = (isset($conf->cache['dictvalues_'.$tablename]) ? $conf->cache['dictvalues_'.$tablename] : null);
13046 if (is_null($dictvalues)) {
13047 $dictvalues = array();
13049 $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
13050 if ($checkentity) {
13051 $sql .= ' AND entity IN (0,'.getEntity($tablename).')';
13054 $resql = $db->query($sql);
13056 while ($obj = $db->fetch_object($resql)) {
13057 $dictvalues[$obj->$rowidfield] = $obj; // $obj is stdClass
13060 dol_print_error($db);
13063 $conf->cache['dictvalues_'.$tablename] = $dictvalues;
13066 if (!empty($dictvalues[$id])) {
13068 $tmp = $dictvalues[$id];
13069 return (property_exists($tmp, $field) ? $tmp->$field : '');
13082function colorIsLight($stringcolor)
13084 $stringcolor = str_replace('#', '', $stringcolor);
13086 if (!empty($stringcolor)) {
13088 $tmp = explode(',', $stringcolor);
13089 if (count($tmp) > 1) { // This is a comma RGB ('255','255','255')
13094 $hexr = $stringcolor[0].$stringcolor[1];
13095 $hexg = $stringcolor[2].$stringcolor[3];
13096 $hexb = $stringcolor[4].$stringcolor[5];
13097 $r = hexdec($hexr);
13098 $g = hexdec($hexg);
13099 $b = hexdec($hexb);
13101 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0; // HSL algorithm
13102 if ($bright > 0.6) {
13117function isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
13121 //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms'];
13122 //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal);
13123 if (empty($menuentry['enabled'])) {
13124 return 0; // Entry disabled by condition
13126 if ($type_user && array_key_exists('module', $menuentry) && $menuentry['module']) {
13127 $tmploops = explode('|', $menuentry['module']);
13129 foreach ($tmploops as $tmploop) {
13130 if (in_array($tmploop, $listofmodulesforexternal)) {
13136 return 0; // Entry is for menus all excluded to external users
13139 if (!$menuentry['perms'] && $type_user) {
13140 return 0; // No permissions and user is external
13142 if (!$menuentry['perms'] && getDolGlobalString('MAIN_MENU_HIDE_UNAUTHORIZED')) {
13143 return 0; // No permissions and option to hide when not allowed, even for internal user, is on
13145 if (!$menuentry['perms']) {
13146 return 2; // No permissions and user is external
13158function roundUpToNextMultiple($n, $x = 5)
13160 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
13161 return (int) $result;
13175function dolGetBadge($label, $html = '', $type = 'primary', $mode = '', $url = '', $params = array())
13177 $csstouse = 'badge';
13178 $csstouse .= (!empty($mode) ? ' badge-'.$mode : '');
13179 $csstouse .= (!empty($type) ? ' badge-'.$type : '');
13180 $csstouse .= (empty($params['css']) ? '' : ' '.$params['css']);
13183 'class' => $csstouse
13186 if (empty($html)) {
13190 if (!empty($url)) {
13191 $attr['href'] = $url;
13194 if ($mode === 'dot') {
13195 $attr['class'] .= ' classfortooltip';
13196 $attr['title'] = $html;
13197 $attr['aria-label'] = $label;
13202 if (!empty($params['attr']) && is_array($params['attr'])) {
13203 foreach ($params['attr'] as $key => $value) {
13204 if ($key == 'class') {
13205 $attr['class'] .= ' '.$value;
13206 } elseif ($key == 'classOverride') {
13207 $attr['class'] = $value;
13209 $attr[$key] = $value;
13216 // escape all attribute
13217 $attr = array_map('dolPrintHTMLForAttribute', $attr);
13219 $TCompiledAttr = array();
13220 foreach ($attr as $key => $value) {
13221 $TCompiledAttr[] = $key.'="
'.$value.'"';
13224 $compiledAttributes = !empty($TCompiledAttr) ? implode(' ', $TCompiledAttr) : '';
13226 $tag = !empty($url) ? 'a' : 'span';
13228 return '<'.$tag.' '.$compiledAttributes.'>'.$html.'</'.$tag.'>';
13244function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $statusType = 'status0', $displayMode = 0, $url = '', $params = array())
13249 $dolGetBadgeParams = array();
13251 if (!empty($params['badgeParams'])) {
13252 $dolGetBadgeParams = $params['badgeParams'];
13255 // TODO : add a hook
13256 if ($displayMode == 0) {
13257 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
13258 } elseif ($displayMode == 1) {
13259 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
13260 } elseif (getDolGlobalString('MAIN_STATUS_USES_IMAGES')) {
13261 // Use status with images (for backward compatibility)
13263 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ? '<span class="hideonsmartphone
">' : '').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ? '</span>' : '');
13264 $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>' : '');
13266 // For small screen, we always use the short label instead of long label.
13267 if (!empty($conf->dol_optimize_smallscreen)) {
13268 if ($displayMode == 0) {
13270 } elseif ($displayMode == 4) {
13272 } elseif ($displayMode == 6) {
13277 // For backward compatibility. Image's filename are still in French, so we use this array to convert
13278 $statusImg = array(
13279 'status0' => 'statut0',
13280 'status1' => 'statut1',
13281 'status2' => 'statut2',
13282 'status3' => 'statut3',
13283 'status4' => 'statut4',
13284 'status5' => 'statut5',
13285 'status6' => 'statut6',
13286 'status7' => 'statut7',
13287 'status8' => 'statut8',
13288 'status9' => 'statut9'
13291 if (!empty($statusImg[$statusType])) {
13292 $htmlImg = img_picto($statusLabel, $statusImg[$statusType]);
13294 $htmlImg = img_picto($statusLabel, $statusType);
13297 if ($displayMode === 2) {
13298 $return = $htmlImg.' '.$htmlLabelShort;
13299 } elseif ($displayMode === 3) {
13300 $return = $htmlImg;
13301 } elseif ($displayMode === 4) {
13302 $return = $htmlImg.' '.$htmlLabel;
13303 } elseif ($displayMode === 5) {
13304 $return = $htmlLabelShort.' '.$htmlImg;
13305 } else { // $displayMode >= 6
13306 $return = $htmlLabel.' '.$htmlImg;
13308 } elseif (!getDolGlobalString('MAIN_STATUS_USES_IMAGES') && !empty($displayMode)) {
13310 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
13312 $dolGetBadgeParams['attr']['class'] = 'badge-status';
13313 if (empty($dolGetBadgeParams['attr']['title'])) {
13314 $dolGetBadgeParams['attr']['title'] = empty($params['tooltip']) ? $statusLabel : ($params['tooltip'] != 'no' ? $params['tooltip'] : '');
13315 } else { // If a title was forced from $params['badgeParams']['attr']['title'], we set the class to get it as a tooltip.
13316 $dolGetBadgeParams['attr']['class'] .= ' classfortooltip';
13317 // And if we use tooltip, we can output title in HTML @phan-suppress-next-line PhanTypeInvalidDimOffset
13318 $dolGetBadgeParams['attr']['title'] = dol_htmlentitiesbr((string) $dolGetBadgeParams['attr']['title'], 1);
13321 if ($displayMode == 3) {
13322 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), '', $statusType, 'dot', $url, $dolGetBadgeParams);
13323 } elseif ($displayMode === 5) {
13324 $return = dolGetBadge($statusLabelShort, $html, $statusType, '', $url, $dolGetBadgeParams);
13326 $return = dolGetBadge(((empty($conf->dol_optimize_smallscreen) && $displayMode != 2) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType, '', $url, $dolGetBadgeParams);
13369function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = '', $id = '', $userRight = 1, $params = array())
13371 global $hookmanager, $action, $object, $langs;
13373 // If $url is an array, we must build a dropdown button or recursively iterate over each value
13374 if (is_array($url)) {
13375 // Loop on $url array to remove entries of disabled modules
13376 foreach ($url as $key => $subbutton) {
13377 if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
13384 if (array_key_exists('areDropdownButtons', $params) && $params["areDropdownButtons
"] === false) { // @phan-suppress-current-line PhanTypeInvalidDimOffset
13385 foreach ($url as $button) {
13386 if (!empty($button['lang'])) {
13387 $langs->load($button['lang']);
13389 $label = $langs->trans($button['label']);
13390 $text = $button['text'] ?? '';
13391 $actionType = $button['actionType'] ?? '';
13392 $tmpUrl = DOL_URL_ROOT.$button['url'].(empty($params['backtopage']) ? '' : '&backtopage='.urlencode($params['backtopage']));
13393 $id = $button['id'] ?? '';
13394 $userRight = $button['perm'] ?? 1;
13395 $button['params'] = $button['params'] ?? []; // @phan-suppress-current-line PhanPluginDuplicateExpressionAssignmentOperation
13397 $out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
13402 if (count($url) > 1) {
13403 $out .= '<div class="dropdown
inline-block dropdown-holder
">';
13404 $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>';
13405 $out .= '<div class="dropdown-content
">';
13406 foreach ($url as $subbutton) {
13407 if (!empty($subbutton['lang'])) {
13408 $langs->load($subbutton['lang']);
13411 if (!empty($subbutton['urlraw'])) {
13412 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
13414 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
13415 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
13418 $subbuttonparam = array();
13419 if (!empty($subbutton['attr'])) {
13420 $subbuttonparam['attr'] = $subbutton['attr'];
13422 $subbuttonparam['isDropDown'] = (empty($params['isDropDown']) ? ($subbutton['isDropDown'] ?? false) : $params['isDropDown']);
13424 $out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, $subbutton['id'] ?? '', $subbutton['perm'], $subbuttonparam);
13429 foreach ($url as $subbutton) { // Should loop on 1 record only
13430 if (!empty($subbutton['lang'])) {
13431 $langs->load($subbutton['lang']);
13434 if (!empty($subbutton['urlraw'])) {
13435 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
13437 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
13438 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
13441 $out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, '', $subbutton['perm'], $params);
13448 // Here, $url is a simple link
13450 if (!empty($params['isDropdown']) || !empty($params['isDropDown'])) { // Use the dropdown-item style (not for action button)
13451 $class = "dropdown-item
";
13453 $class = 'butAction';
13454 if ($actionType == 'danger' || $actionType == 'delete') {
13455 $class = 'butActionDelete';
13456 if (!empty($url) && strpos($url, 'token=') === false) {
13457 $url .= '&token='.newToken();
13463 'href' => empty($url) ? '' : $url,
13467 if (empty($text)) {
13469 $attr['title'] = ''; // if html not set, leave label on title is redundant
13471 $attr['title'] = $label;
13472 $attr['aria-label'] = $label;
13475 if (empty($userRight) || $userRight < 0) {
13476 $attr['class'] = 'butActionRefused';
13477 $attr['href'] = '';
13478 $attr['title'] = (($label && $text && $label != $text) ? $label : '');
13479 $attr['title'] = ($attr['title'] ? $attr['title'] . (empty($userRight) ? '<br>' : '') : '').(empty($userRight) ? $langs->trans('NotEnoughPermissions') : '');
13487 if (!empty($params['attr']) && is_array($params['attr'])) {
13488 foreach ($params['attr'] as $key => $value) {
13489 if ($key == 'class') {
13490 $attr['class'] .= ' '.$value;
13491 } elseif ($key == 'classOverride') {
13492 $attr['class'] = $value;
13494 $attr[$key] = $value;
13499 // automatic add tooltip when title is detected
13500 if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
13501 $attr['class'] .= ' classfortooltip';
13504 // Js Confirm button
13505 if ($userRight && !empty($params['confirm'])) {
13506 if (!is_array($params['confirm'])) {
13507 $params['confirm'] = array();
13510 if (empty($params['confirm']['url'])) {
13511 $params['confirm']['url'] = $url . (strpos($url, '?') > 0 ? '&' : '?') . 'confirm=yes';
13514 // for js disabled compatibility set $url as call to confirm action and $params['confirm']['url'] to confirmed action
13515 $attr['data-confirm-url'] = $params['confirm']['url'];
13516 $attr['data-confirm-title'] = !empty($params['confirm']['title']) ? $params['confirm']['title'] : $langs->trans('ConfirmBtnCommonTitle', $label);
13517 $attr['data-confirm-content'] = !empty($params['confirm']['content']) ? $params['confirm']['content'] : $langs->trans('ConfirmBtnCommonContent', $label);
13518 $attr['data-confirm-content'] = preg_replace("/\r|\n/
", "", $attr['data-confirm-content']);
13519 $attr['data-confirm-action-btn-label'] = !empty($params['confirm']['action-btn-label']) ? $params['confirm']['action-btn-label'] : $langs->trans('Confirm');
13520 $attr['data-confirm-cancel-btn-label'] = !empty($params['confirm']['cancel-btn-label']) ? $params['confirm']['cancel-btn-label'] : $langs->trans('CloseDialog');
13521 $attr['data-confirm-modal'] = !empty($params['confirm']['modal']) ? $params['confirm']['modal'] : true;
13523 $attr['class'] .= ' butActionConfirm';
13526 if (isset($attr['href']) && empty($attr['href'])) {
13527 unset($attr['href']);
13530 $TCompiledAttr = array();
13531 foreach ($attr as $key => $value) {
13532 if (!empty($params['use_unsecured_unescapedattr']) && is_array($params['use_unsecured_unescapedattr']) && in_array($key, $params['use_unsecured_unescapedattr'])) {
13534 $value = dol_htmlentities($value, ENT_QUOTES | ENT_SUBSTITUTE);
13535 } elseif ($key == 'href') {
13536 $value = dolPrintHTMLForAttributeUrl($value);
13538 $value = dolPrintHTMLForAttribute($value);
13541 $TCompiledAttr[] = $key.'="'.$value.'"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
13544 $compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
13546 $tag = !empty($attr['href']) ? 'a' : 'span';
13549 $parameters = array(
13550 'TCompiledAttr' => $TCompiledAttr, // array
13551 'compiledAttributes' => $compiledAttributes, // string
13556 'actionType' => $actionType,
13559 'userRight' => $userRight,
13560 'params' => $params
13563 $reshook = $hookmanager->executeHooks('dolGetButtonAction', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
13564 if ($reshook < 0) {
13565 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
13568 if (empty($reshook)) {
13569 if (dol_textishtml($text)) { // If content already HTML encoded
13570 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . $text . '</span></' . $tag . '>';
13572 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . dol_escape_htmltag($text) . '</span></' . $tag . '>';
13575 return $hookmanager->resPrint;
13588function dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot = true)
13594 $parsedUrl = parse_url($url);
13595 if ((isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], ['javascript', 'mailto', 'tel'])) || strpos($url, '#') === 0) {
13599 if (!empty($parsedUrl['query'])) {
13600 // Use parse_str() function to parse the string passed via URL
13601 parse_str($parsedUrl['query'], $urlQuery);
13602 if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
13603 $url .= '&backtopage='.urlencode($params['backtopage']);
13607 if (!isset($parsedUrl['scheme']) && $addDolUrlRoot) {
13608 $url = DOL_URL_ROOT.$url;
13621function dolGetButtonTitleSeparator($moreClass = "
")
13623 return '<span class="button-title-separator
'.$moreClass.'" ></span>';
13632function getFieldErrorIcon($fieldValidationErrorMsg)
13635 if (!empty($fieldValidationErrorMsg)) {
13636 $out .= '<span class="field-error-icon classfortooltip
" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).'" role="alert
" >'; // role alert is used for accessibility
13637 $out .= '<span class="fa fa-exclamation-circle
" aria-hidden="true" ></span>'; // For accessibility icon is separated and aria-hidden
13656function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $url = '', $id = '', $status = 1, $params = array())
13658 global $langs, $user;
13660 // Actually this conf is used in css too for external module compatibility and smooth transition to this function
13661 if (getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
13664 // Fix old picto fa-th-list to use fa-grid-vertical instead
13665 if ($iconClass == 'fa fa-th-list imgforviewmode') {
13666 $iconClass = ' fa fa-grip-horizontal imgforviewmode';
13669 $class = 'btnTitle';
13670 if (in_array($iconClass, array('fa fa-plus-circle', 'fa fa-plus-circle size15x', 'fa fa-comment-dots', 'fa fa-paper-plane'))) {
13671 $class .= ' btnTitlePlus';
13673 $useclassfortooltip = 1;
13675 if (!empty($params['morecss'])) {
13676 $class .= ' '.$params['morecss'];
13681 'href' => empty($url) ? '' : $url
13684 if (!empty($helpText)) {
13685 $attr['title'] = $helpText;
13686 } elseif ($label) { // empty($attr['title']) &&
13687 $attr['title'] = $label;
13688 $useclassfortooltip = 0;
13691 if ($status == 2) {
13692 $attr['class'] .= ' btnTitleSelected';
13693 } elseif ($status <= 0) {
13694 $attr['class'] .= ' refused';
13696 $attr['href'] = '';
13698 if ($status == -1) { // disable
13699 $attr['title'] = $langs->transnoentitiesnoconv("FeatureDisabled
");
13700 } elseif ($status == 0) { // Not enough permissions
13701 $attr['title'] = $langs->transnoentitiesnoconv("NotEnoughPermissions
");
13705 if (!empty($attr['title']) && $useclassfortooltip) {
13706 $attr['class'] .= ' classfortooltip';
13714 if (!empty($params['attr']) && is_array($params['attr'])) {
13715 foreach ($params['attr'] as $key => $value) {
13716 if ($key == 'class') {
13717 $attr['class'] .= ' '.$value;
13718 } elseif ($key == 'classOverride') {
13719 $attr['class'] = $value;
13721 $attr[$key] = $value;
13726 if (isset($attr['href']) && empty($attr['href'])) {
13727 unset($attr['href']);
13730 // TODO : add a hook
13732 // Generate attributes with escapement
13733 $TCompiledAttr = array();
13734 foreach ($attr as $key => $value) {
13735 $TCompiledAttr[] = $key.'="'.dol_escape_htmltag($value).'"'; // Do not use dolPrintHTMLForAttribute() here, we must accept "javascript:
string"
13738 $compiledAttributes = (empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr));
13740 $tag = (empty($attr['href']) ? 'span' : 'a');
13742 $button = '<'.$tag.' '.$compiledAttributes.'>';
13743 $button .= '<span class="'.$iconClass.' valignmiddle btnTitle-icon
"></span>';
13744 if (!empty($params['forcenohideoftext'])) {
13745 $button .= '<span class="valignmiddle text-plus-circle btnTitle-label
'.(empty($params['forcenohideoftext
']) ? ' hideonsmartphone
' : '').'">'.$label.'</span>';
13747 $button .= '</'.$tag.'>';
13761function getElementProperties($elementType)
13763 global $conf, $db, $hookmanager;
13767 //$element_type='facture';
13769 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element = '';
13771 // Parse element/subelement
13772 $module = $elementType;
13773 $element = $elementType;
13774 $subelement = $elementType;
13775 $table_element = $elementType;
13777 // If we ask a resource form external module (instead of default path)
13778 if (preg_match('/^([^@]+)@([^@]+)$/i', $elementType, $regs)) { // 'myobject@mymodule'
13779 $element = $subelement = $regs[1];
13780 $module = $regs[2];
13783 // If we ask a resource for a string with an element and a subelement
13784 // Example 'project_task'
13785 if (preg_match('/^([^_]+)_([^_]+)/i', $element, $regs)) { // 'myobject_mysubobject' with myobject=mymodule
13786 $module = $element = $regs[1];
13787 $subelement = $regs[2];
13790 // Object lines will use parent classpath and module ref
13791 if (substr($elementType, -3) == 'det') {
13792 $module = preg_replace('/det$/', '', $element);
13793 $subelement = preg_replace('/det$/', '', $subelement);
13794 $classpath = $module.'/class';
13795 $classfile = $module;
13796 $classname = preg_replace('/det$/', 'Line', $element);
13797 if (in_array($module, array('expedition', 'propale', 'facture', 'contrat', 'fichinter', 'commandefournisseur'))) {
13798 $classname = preg_replace('/det$/', 'Ligne', $element);
13801 // For compatibility and to work with non standard path
13802 if ($elementType == "action
" || $elementType == "actioncomm
") {
13803 $classpath = 'comm/action/class';
13804 $subelement = 'Actioncomm';
13805 $module = 'agenda';
13806 $table_element = 'actioncomm';
13807 } elseif ($elementType == 'cronjob') {
13808 $classpath = 'cron/class';
13810 $table_element = 'cron';
13811 } elseif ($elementType == 'adherent_type') {
13812 $classpath = 'adherents/class';
13813 $classfile = 'adherent_type';
13814 $module = 'adherent';
13815 $subelement = 'adherent_type';
13816 $classname = 'AdherentType';
13817 $table_element = 'adherent_type';
13818 } elseif ($elementType == 'bank_account') {
13819 $classpath = 'compta/bank/class';
13820 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
13821 $classfile = 'account';
13822 $classname = 'Account';
13823 } elseif ($elementType == 'bank_line') {
13824 $classpath = 'compta/bank/class';
13825 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
13826 $classfile = 'account';
13827 $classname = 'AccountLine';
13828 } elseif ($elementType == 'category') {
13829 $classpath = 'categories/class';
13830 $module = 'categorie';
13831 $subelement = 'categorie';
13832 $table_element = 'categorie';
13833 } elseif ($elementType == 'contact') {
13834 $classpath = 'contact/class';
13835 $classfile = 'contact';
13836 $module = 'societe';
13837 $subelement = 'contact';
13838 $table_element = 'socpeople';
13839 } elseif ($elementType == 'inventory') {
13840 $module = 'product';
13841 $classpath = 'product/inventory/class';
13842 } elseif ($elementType == 'inventoryline') {
13843 $module = 'product';
13844 $classpath = 'product/inventory/class';
13845 $table_element = 'inventorydet';
13846 $parent_element = 'inventory';
13847 } elseif ($elementType == 'stock' || $elementType == 'entrepot' || $elementType == 'warehouse') {
13849 $classpath = 'product/stock/class';
13850 $classfile = 'entrepot';
13851 $classname = 'Entrepot';
13852 $table_element = 'entrepot';
13853 } elseif ($elementType == 'project') {
13854 $classpath = 'projet/class';
13855 $module = 'projet';
13856 $table_element = 'projet';
13857 } elseif ($elementType == 'project_task') {
13858 $classpath = 'projet/class';
13859 $module = 'projet';
13860 $subelement = 'task';
13861 $table_element = 'projet_task';
13862 } elseif ($elementType == 'facture' || $elementType == 'invoice') {
13863 $classpath = 'compta/facture/class';
13864 $module = 'facture';
13865 $subelement = 'facture';
13866 $table_element = 'facture';
13867 } elseif ($elementType == 'facturedet') {
13868 $classpath = 'compta/facture/class';
13869 $classfile = 'facture';
13870 $classname = 'FactureLigne';
13871 $module = 'facture';
13872 $table_element = 'facturedet';
13873 $parent_element = 'facture';
13874 } elseif ($elementType == 'facturerec') {
13875 $classpath = 'compta/facture/class';
13876 $classfile = 'facture-rec';
13877 $module = 'facture';
13878 $classname = 'FactureRec';
13879 } elseif ($elementType == 'commande' || $elementType == 'order') {
13880 $classpath = 'commande/class';
13881 $module = 'commande';
13882 $subelement = 'commande';
13883 $table_element = 'commande';
13884 } elseif ($elementType == 'commandedet') {
13885 $classpath = 'commande/class';
13886 $classfile = 'commande';
13887 $classname = 'OrderLine';
13888 $module = 'commande';
13889 $table_element = 'commandedet';
13890 $parent_element = 'commande';
13891 } elseif ($elementType == 'propal') {
13892 $classpath = 'comm/propal/class';
13893 $table_element = 'propal';
13894 } elseif ($elementType == 'propaldet') {
13895 $classpath = 'comm/propal/class';
13896 $classfile = 'propal';
13897 $subelement = 'propaleligne';
13898 $module = 'propal';
13899 $table_element = 'propaldet';
13900 $parent_element = 'propal';
13901 } elseif ($elementType == 'shipping') {
13902 $classpath = 'expedition/class';
13903 $classfile = 'expedition';
13904 $classname = 'Expedition';
13905 $module = 'expedition';
13906 $table_element = 'expedition';
13907 } elseif ($elementType == 'expeditiondet' || $elementType == 'shippingdet') {
13908 $classpath = 'expedition/class';
13909 $classfile = 'expedition';
13910 $classname = 'ExpeditionLigne';
13911 $module = 'expedition';
13912 $table_element = 'expeditiondet';
13913 $parent_element = 'expedition';
13914 } elseif ($elementType == 'delivery_note') {
13915 $classpath = 'delivery/class';
13916 $subelement = 'delivery';
13917 $module = 'expedition';
13918 } elseif ($elementType == 'delivery') {
13919 $classpath = 'delivery/class';
13920 $subelement = 'delivery';
13921 $module = 'expedition';
13922 } elseif ($elementType == 'deliverydet') {
13924 } elseif ($elementType == 'supplier_proposal') {
13925 $classpath = 'supplier_proposal/class';
13926 $module = 'supplier_proposal';
13927 $element = 'supplierproposal';
13928 $classfile = 'supplier_proposal';
13929 $subelement = 'supplierproposal';
13930 } elseif ($elementType == 'supplier_proposaldet') {
13931 $classpath = 'supplier_proposal/class';
13932 $module = 'supplier_proposal';
13933 $classfile = 'supplier_proposal';
13934 $classname = 'SupplierProposalLine';
13935 $table_element = 'supplier_proposaldet';
13936 $parent_element = 'supplier_proposal';
13937 } elseif ($elementType == 'contract') {
13938 $classpath = 'contrat/class';
13939 $module = 'contrat';
13940 $subelement = 'contrat';
13941 $table_element = 'contract';
13942 } elseif ($elementType == 'contratdet') {
13943 $classpath = 'contrat/class';
13944 $module = 'contrat';
13945 $table_element = 'contratdet';
13946 $parent_element = 'contrat';
13947 } elseif ($elementType == 'mailing') {
13948 $classpath = 'comm/mailing/class';
13949 $module = 'mailing';
13950 $classfile = 'mailing';
13951 $classname = 'Mailing';
13953 } elseif ($elementType == 'member' || $elementType == 'adherent') {
13954 $classpath = 'adherents/class';
13955 $module = 'adherent';
13956 $subelement = 'adherent';
13957 $table_element = 'adherent';
13958 } elseif ($elementType == 'subscription') {
13959 $classpath = 'adherents/class';
13960 $classfile = 'subscription';
13961 $module = 'adherent';
13962 $subelement = 'subscription';
13963 $classname = 'Subscription';
13964 $table_element = 'subscription';
13965 } elseif ($elementType == 'usergroup') {
13966 $classpath = 'user/class';
13968 } elseif ($elementType == 'mo') {
13969 $classpath = 'mrp/class';
13974 $table_element = 'mrp_mo';
13975 } elseif ($elementType == 'mrp_production') {
13976 $classpath = 'mrp/class';
13978 $classname = 'MoLine';
13981 $table_element = 'mrp_production';
13982 $parent_element = 'mo';
13983 } elseif ($elementType == 'cabinetmed_cons') {
13984 $classpath = 'cabinetmed/class';
13985 $module = 'cabinetmed';
13986 $subelement = 'cabinetmedcons';
13987 $table_element = 'cabinetmedcons';
13988 } elseif ($elementType == 'fichinter') {
13989 $classpath = 'fichinter/class';
13990 $module = 'ficheinter';
13991 $subelement = 'fichinter';
13992 $table_element = 'fichinter';
13993 } elseif ($elementType == 'dolresource' || $elementType == 'resource') {
13994 $classpath = 'resource/class';
13995 $module = 'resource';
13996 $subelement = 'dolresource';
13997 $table_element = 'resource';
13998 } elseif ($elementType == 'opensurvey_sondage') {
13999 $classpath = 'opensurvey/class';
14000 $module = 'opensurvey';
14001 $subelement = 'opensurveysondage';
14002 } elseif ($elementType == 'order_supplier' || $elementType == 'supplier_order' ||$elementType == 'commande_fournisseur' || $elementType == 'commandefournisseur') {
14003 $classpath = 'fourn/class';
14004 $module = 'fournisseur';
14005 $classfile = 'fournisseur.commande';
14006 $element = 'order_supplier';
14008 $classname = 'CommandeFournisseur';
14009 $table_element = 'commande_fournisseur';
14010 } elseif ($elementType == 'commande_fournisseurdet') {
14011 $classpath = 'fourn/class';
14012 $module = 'fournisseur';
14013 $classfile = 'fournisseur.commande';
14014 $element = 'commande_fournisseurdet';
14016 $classname = 'CommandeFournisseurLigne';
14017 $table_element = 'commande_fournisseurdet';
14018 $parent_element = 'commande_fournisseur';
14019 } elseif ($elementType == 'invoice_supplier' || $elementType == 'supplier_invoice' || $elementType == 'facture_fourn') {
14020 $classpath = 'fourn/class';
14021 $module = 'fournisseur';
14022 $classfile = 'fournisseur.facture';
14023 $element = 'invoice_supplier';
14025 $classname = 'FactureFournisseur';
14026 $table_element = 'facture_fourn';
14027 } elseif ($elementType == 'facture_fourn_det') {
14028 $classpath = 'fourn/class';
14029 $module = 'fournisseur';
14030 $classfile = 'fournisseur.facture';
14031 $element = 'facture_fourn_det';
14033 $classname = 'SupplierInvoiceLine';
14034 $table_element = 'facture_fourn_det';
14035 $parent_element = 'invoice_supplier';
14036 } elseif ($elementType == "service
") {
14037 $classpath = 'product/class';
14038 $subelement = 'product';
14039 $table_element = 'product';
14040 } elseif ($elementType == 'salary') {
14041 $classpath = 'salaries/class';
14042 $module = 'salaries';
14043 } elseif ($elementType == 'payment_salary') {
14044 $classpath = 'salaries/class';
14045 $classfile = 'paymentsalary';
14046 $classname = 'PaymentSalary';
14047 $module = 'salaries';
14048 } elseif ($elementType == 'productlot') {
14049 $module = 'productbatch';
14050 $classpath = 'product/stock/class';
14051 $classfile = 'productlot';
14052 $classname = 'Productlot';
14053 $element = 'productlot';
14055 $table_element = 'product_lot';
14056 } elseif ($elementType == 'societeaccount') {
14057 $classpath = 'societe/class';
14058 $classfile = 'societeaccount';
14059 $classname = 'SocieteAccount';
14060 $module = 'societe';
14061 } elseif ($elementType == 'websitepage' || $elementType == 'website_page') {
14062 $classpath = 'website/class';
14063 $classfile = 'websitepage';
14064 $classname = 'Websitepage';
14065 $module = 'website';
14066 $subelement = 'websitepage';
14067 $table_element = 'website_page';
14068 } elseif ($elementType == 'fiscalyear') {
14069 $classpath = 'core/class';
14070 $module = 'accounting';
14071 $subelement = 'fiscalyear';
14072 } elseif ($elementType == 'chargesociales') {
14073 $classpath = 'compta/sociales/class';
14075 $table_element = 'chargesociales';
14076 } elseif ($elementType == 'tva') {
14077 $classpath = 'compta/tva/class';
14080 $table_element = 'tva';
14081 } elseif ($elementType == 'emailsenderprofile') {
14083 $classpath = 'core/class';
14084 $classfile = 'emailsenderprofile';
14085 $classname = 'EmailSenderProfile';
14086 $table_element = 'c_email_senderprofile';
14088 } elseif ($elementType == 'conferenceorboothattendee') {
14089 $classpath = 'eventorganization/class';
14090 $classfile = 'conferenceorboothattendee';
14091 $classname = 'ConferenceOrBoothAttendee';
14092 $module = 'eventorganization';
14093 } elseif ($elementType == 'conferenceorbooth') {
14094 $classpath = 'eventorganization/class';
14095 $classfile = 'conferenceorbooth';
14096 $classname = 'ConferenceOrBooth';
14097 $module = 'eventorganization';
14098 } elseif ($elementType == 'ccountry') {
14100 $classpath = 'core/class';
14101 $classfile = 'ccountry';
14102 $classname = 'Ccountry';
14103 $table_element = 'c_country';
14105 } elseif ($elementType == 'ecmfiles') {
14107 $classpath = 'ecm/class';
14108 $classfile = 'ecmfiles';
14109 $classname = 'Ecmfiles';
14110 $table_element = 'ecmfiles';
14112 } elseif ($elementType == 'knowledgerecord' || $elementType == 'knowledgemanagement') {
14113 $module = 'knowledgemanagement';
14114 $classpath = 'knowledgemanagement/class';
14115 $classfile = 'knowledgerecord';
14116 $classname = 'KnowledgeRecord';
14117 $table_element = 'knowledgemanagement_knowledgerecord';
14119 } elseif ($elementType == 'customer') {
14120 $module = 'societe';
14121 $classpath = 'societe/class';
14122 $classfile = 'client';
14123 $classname = 'Client';
14124 $table_element = 'societe';
14126 } elseif ($elementType == 'fournisseur' || $elementType == 'supplier') {
14127 $module = 'societe';
14128 $classpath = 'fourn/class';
14129 $classfile = 'fournisseur';
14130 $classname = 'Fournisseur';
14131 $table_element = 'societe';
14136 if (empty($classfile)) {
14137 $classfile = strtolower($subelement);
14139 if (empty($classname)) {
14140 $classname = ucfirst($subelement);
14142 if (empty($classpath)) {
14143 $classpath = $module.'/class';
14146 //print 'getElementProperties subdir='.$subdir;
14149 if ($module && isset($conf->$module)) { // The generic case
14150 if (!empty($conf->$module->multidir_output[$conf->entity])) {
14151 $dir_output = $conf->$module->multidir_output[$conf->entity];
14152 } elseif (!empty($conf->$module->output[$conf->entity])) {
14153 $dir_output = $conf->$module->output[$conf->entity];
14154 } elseif (!empty($conf->$module->dir_output)) {
14155 $dir_output = $conf->$module->dir_output;
14157 if (!empty($conf->$module->multidir_temp[$conf->entity])) {
14158 $dir_temp = $conf->$module->multidir_temp[$conf->entity];
14159 } elseif (!empty($conf->$module->temp[$conf->entity])) {
14160 $dir_temp = $conf->$module->temp[$conf->entity];
14161 } elseif (!empty($conf->$module->dir_temp)) {
14162 $dir_temp = $conf->$module->dir_temp;
14166 // Overwrite value for special cases
14167 if ($element == 'order_supplier' && isModEnabled('fournisseur')) {
14168 $dir_output = $conf->fournisseur->commande->dir_output;
14169 $dir_temp = $conf->fournisseur->commande->dir_temp;
14170 } elseif ($element == 'invoice_supplier' && isModEnabled('fournisseur')) {
14171 $dir_output = $conf->fournisseur->facture->dir_output;
14172 $dir_temp = $conf->fournisseur->facture->dir_temp;
14174 $dir_output .= $subdir;
14175 $dir_temp .= $subdir;
14177 $elementProperties = array(
14178 'module' => $module,
14179 'element' => $element,
14180 'table_element' => $table_element,
14181 'subelement' => $subelement,
14182 'classpath' => $classpath,
14183 'classfile' => $classfile,
14184 'classname' => $classname,
14185 'dir_output' => $dir_output,
14186 'dir_temp' => $dir_temp,
14187 'parent_element' => $parent_element,
14192 if (!is_object($hookmanager)) {
14193 include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
14194 $hookmanager = new HookManager($db);
14196 $hookmanager->initHooks(array('elementproperties'));
14200 $parameters = array(
14201 'elementType' => $elementType,
14202 'elementProperties' => $elementProperties
14205 $reshook = $hookmanager->executeHooks('getElementProperties', $parameters);
14208 $elementProperties = $hookmanager->resArray;
14209 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for sécurity against misconfigured external modules
14210 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
14213 // context of elementproperties doesn't need to exist out of this function so delete it to avoid elementproperties context is equal to all
14214 if (($key = array_search('elementproperties', $hookmanager->contextarray)) !== false) {
14215 unset($hookmanager->contextarray[$key]);
14218 return $elementProperties;
14233function fetchObjectByElement($element_id, $element_type, $element_ref = '', $useCache = 0, $maxCacheByType = 10)
14239 $element_prop = getElementProperties($element_type);
14241 if ($element_prop['module'] == 'product' || $element_prop['module'] == 'service') {
14242 // For example, for an extrafield 'product' (shared for both product and service) that is a link to an object,
14243 // this is called with $element_type = 'product' when we need element properties of a service, we must return a product. If we create the
14244 // extrafield for a service, it is not supported and not found when editing the product/service card. So we must keep 'product' for extrafields
14245 // of service and we will return properties of a product.
14246 $ismodenabled = (isModEnabled('product') || isModEnabled('service'));
14247 } elseif ($element_prop['module'] == 'societeaccount') {
14248 $ismodenabled = isModEnabled('website') || isModEnabled('webportal');
14250 $ismodenabled = isModEnabled($element_prop['module']);
14252 //var_dump('element_type='.$element_type);
14253 //var_dump($element_prop);
14254 //var_dump($element_prop['module'].' '.$ismodenabled);
14255 if (is_array($element_prop) && (empty($element_prop['module']) || $ismodenabled)) {
14256 if ($useCache === 1 && $element_id > 0
14257 && !empty($conf->cache['fetchObjectByElement'][$element_type])
14258 && !empty($conf->cache['fetchObjectByElement'][$element_type][$element_id])
14259 && is_object($conf->cache['fetchObjectByElement'][$element_type][$element_id])
14261 return $conf->cache['fetchObjectByElement'][$element_type][$element_id];
14264 dol_include_once('/'.$element_prop['classpath'].'/'.$element_prop['classfile'].'.class.php');
14266 if (class_exists($element_prop['classname'])) {
14267 $className = $element_prop['classname'];
14268 $objecttmp = new $className($db);
14269 '@phan-var-force CommonObject $objecttmp';
14271 if ($element_id > 0 || !empty($element_ref)) {
14272 $ret = $objecttmp->fetch($element_id, $element_ref);
14274 if (empty($objecttmp->module)) {
14275 $objecttmp->module = $element_prop['module'];
14278 if ($useCache > 0) {
14279 if (!isset($conf->cache['fetchObjectByElement'][$element_type])) {
14280 $conf->cache['fetchObjectByElement'][$element_type] = [];
14283 // Manage cache limit
14284 if (! empty($conf->cache['fetchObjectByElement'][$element_type]) && is_array($conf->cache['fetchObjectByElement'][$element_type]) && count($conf->cache['fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
14285 array_shift($conf->cache['fetchObjectByElement'][$element_type]);
14288 $conf->cache['fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
14294 return $objecttmp; // returned an object without fetch
14297 dol_syslog($element_prop['classname'].' doesn\'t exists in /'.$element_prop['classpath'].'/'.$element_prop['classfile'].'.class.php');
14310function getExecutableContent()
14312 $arrayofregexextension = array(
14313 'htm', 'html', 'shtml', 'js', 'phar', 'php', 'php3', 'php4', 'php5', 'phtml', 'pht', 'pl', 'py', 'cgi', 'ksh', 'sh', 'shtml',
14314 'bash', 'bat', 'cmd', 'wpk', 'exe', 'dmg', 'appimage'
14317 return $arrayofregexextension;
14326function isAFileWithExecutableContent($filename)
14328 $arrayofregexextension = getExecutableContent();
14330 foreach ($arrayofregexextension as $fileextension) {
14331 if (preg_match('/\.'.preg_quote($fileextension, '/').'$/i', $filename)) {
14348 return empty($_SESSION['newtoken']) ? '' : $_SESSION['newtoken'];
14358function currentToken()
14360 return isset($_SESSION['token']) ? $_SESSION['token'] : '';
14372 if (empty($conf->cache['nonce'])) {
14373 $conf->cache['nonce'] = dolGetRandomBytes(8);
14376 return $conf->cache['nonce'];
14393function startSimpleTable($header, $link = "
", $arguments = "", $emptyColumns = 0, $number = -1, $pictofulllist = '')
14397 print '<div class="div-
table-responsive-no-min
">';
14398 print '<table class="noborder centpercent
">';
14399 print '<tr class="liste_titre
">';
14401 print ($emptyColumns < 1) ? '<th>' : '<th colspan="'.($emptyColumns + 1).'">';
14403 print '<span class="valignmiddle
">'.$langs->trans($header).'</span>';
14405 if (!empty($link)) {
14406 if (!empty($arguments)) {
14407 print '<a href="'.DOL_URL_ROOT.'/
'.$link.'?
'.$arguments.'">';
14409 print '<a href="'.DOL_URL_ROOT.'/
'.$link.'">';
14413 if ($number > -1) {
14414 print '<span class="badge marginleftonlyshort
">'.$number.'</span>';
14415 } elseif (!empty($link)) {
14416 print '<span class="badge marginleftonlyshort
">...</span>';
14419 if (!empty($link)) {
14425 if ($number < 0 && !empty($link)) {
14426 print '<th class="right
">';
14441function finishSimpleTable($addLineBreak = false)
14446 if ($addLineBreak) {
14462function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord = "None
", $extraRightColumn = false)
14467 print '<tr class="oddeven
">';
14468 print '<td colspan="'.$tableColumnCount.'"><span class="opacitymedium
">'.$langs->trans($noneWord).'</span></td>';
14473 if ($nbofloop === 0) {
14474 // don't show a summary line
14478 /* Case already handled above, commented to satisfy phpstan.
14480 $colspan = $tableColumnCount;
14483 if ($num > $nbofloop) {
14484 $colspan = $tableColumnCount;
14486 $colspan = $tableColumnCount - 1;
14489 if ($extraRightColumn) {
14493 print '<tr class="liste_total
">';
14495 if ($nbofloop > 0 && $num > $nbofloop) {
14496 print '<td colspan="'.$colspan.'" class="right
">'.$langs->trans("XMoreLines
", ($num - $nbofloop)).'</td>';
14498 print '<td colspan="'.$colspan.'" class="right
"> '.$langs->trans("Total
").'</td>';
14499 print '<td class="right centpercent
">'.price($total).'</td>';
14502 if ($extraRightColumn) {
14517function readfileLowMemory($fullpath_original_file_osencoded, $method = -1)
14519 if ($method == -1) {
14521 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_FREAD')) {
14524 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_STREAM_COPY')) {
14529 // Be sure we don't have output buffering enabled to have readfile working correctly
14530 while (ob_get_level()) {
14535 if ($method == 0) {
14536 readfile($fullpath_original_file_osencoded);
14537 } elseif ($method == 1) {
14539 $handle = fopen($fullpath_original_file_osencoded, "rb
");
14540 while (!feof($handle)) {
14541 print fread($handle, 8192);
14544 } elseif ($method == 2) {
14546 $handle1 = fopen($fullpath_original_file_osencoded, "rb
");
14547 $handle2 = fopen("php:
14548 stream_copy_to_stream($handle1, $handle2);
14569 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'">';
14570 if ($texttoshow ===
'none') {
14571 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
14572 $result .=
'<span class="clipboardCPValueToPrint"></span>';
14573 } elseif ($texttoshow) {
14574 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
14575 $result .=
'<span class="clipboardCPValueToPrint">'.dol_escape_htmltag($texttoshow, 1, 1).
'</span>';
14577 $result .=
'<'.$tag.
' class="clipboardCPValue">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
14579 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="'.dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")).
'"></span>';
14580 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
14581 $result .=
'<span class="clipboardCPText"></span>';
14582 $result .=
'</span>';
14596 $result = json_decode($stringtodecode);
14597 if ($result ===
null) {
14598 $result = unserialize($stringtodecode);
14625 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
14628 if (!preg_match(
'/^\(.*\)$/', $filter)) {
14629 $filter =
'(' . $filter .
')';
14632 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
14633 $firstandlastparenthesis = 0;
14635 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
14639 return 'Filter syntax error - '.$errorstr;
14644 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
14645 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
14648 if (preg_match(
'/[^\(\)]/', $t)) {
14649 $tmperrorstr =
'Bad syntax of the search string';
14650 $errorstr =
'Bad syntax of the search string: '.$filter;
14654 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - ".$errorstr, LOG_WARNING);
14655 return 'Filter error - '.$tmperrorstr;
14659 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeSQLCriteriaCallback', $filter).($nopar ?
"" :
')');
14661 if (is_object($db)) {
14662 $ret = str_replace(
'__NOW__',
"'".$db->idate(
dol_now()).
"'", $ret);
14664 if (is_object($user)) {
14665 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
14680 $arrayofandtags = array();
14684 $parenthesislevel = 0;
14689 if ($parenthesislevel >= 1) {
14690 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
14695 $countparenthesis = 0;
14696 while ($i < $nbofchars) {
14699 if ($char ==
'(') {
14700 $countparenthesis++;
14701 } elseif ($char ==
')') {
14702 $countparenthesis--;
14705 if ($countparenthesis == 0) {
14706 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
14707 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
14708 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
14711 if (!preg_match(
'/^\(.*\)$/', $s)) {
14714 $arrayofandtags[] = $s;
14727 if (!preg_match(
'/^\(.*\)$/', $s)) {
14730 $arrayofandtags[] = $s;
14733 return $arrayofandtags;
14745function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
14749 $tmp = $sqlfilters;
14753 $parenthesislevel = 0;
14761 if ($char ==
'(') {
14762 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
14764 $parenthesislevel++;
14767 } elseif ($char ==
')') {
14768 $nbcharremaining = ($nb - $i - 1);
14769 if ($nbcharremaining >= $counter) {
14770 $parenthesislevel = min($parenthesislevel, $counter - 1);
14772 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
14773 $parenthesislevel = $counter;
14778 if ($counter < 0) {
14779 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
14780 $parenthesislevel = 0;
14788 if ($counter > 0) {
14789 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
14790 $parenthesislevel = 0;
14808 if (empty($matches[1])) {
14811 $tmp = explode(
':', $matches[1]);
14812 if (count($tmp) < 3) {
14832 if (empty($matches[1])) {
14835 $tmp = explode(
':', $matches[1], 3);
14836 if (count($tmp) < 3) {
14840 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
14842 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
14845 'NOTLIKE' =>
'NOT LIKE',
14846 'ISNOT' =>
'IS NOT',
14847 'NOTIN' =>
'NOT IN',
14851 if (array_key_exists($operator, $realOperator)) {
14852 $operator = $realOperator[$operator];
14855 $tmpescaped = $tmp[2];
14861 if ($operator ==
'IN' || $operator ==
'NOT IN') {
14863 $tmpescaped2 =
'(';
14865 $tmpelemarray = explode(
',', $tmpescaped);
14866 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
14868 $tmpelem = trim($tmpelem);
14869 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
14870 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 2, 1, 1, 1)).
"'";
14871 } elseif (ctype_digit((
string) $tmpelem)) {
14872 $tmpelemarray[$tmpkey] = (int) $tmpelem;
14873 } elseif (is_numeric((
string) $tmpelem)) {
14874 $tmpelemarray[$tmpkey] = (float) $tmpelem;
14875 } elseif (!
getDolGlobalString(
"MAIN_DISALLOW_UNSECURED_SELECT_INTO_EXTRAFIELDS_FILTER")) {
14876 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_<>=!\s]/i',
'', $tmpelem);
14878 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpelem);
14881 $tmpescaped2 .= implode(
',', $tmpelemarray);
14882 $tmpescaped2 .=
')';
14884 $tmpescaped = $tmpescaped2;
14885 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
14886 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
14887 $tmpescaped = $regbis[1];
14890 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
14891 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
14894 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
14896 if (strtoupper($tmpescaped) ==
'NULL') {
14897 $tmpescaped =
'NULL';
14898 } elseif (ctype_digit((
string) $tmpescaped)) {
14899 $tmpescaped = (int) $tmpescaped;
14900 } elseif (is_numeric((
string) $tmpescaped)) {
14901 $tmpescaped = (float) $tmpescaped;
14903 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
14907 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
14924 $out =
'<!-- timeline icon -->'.
"\n";
14925 $iconClass =
'fa fa-comments';
14930 if ($histo[$key][
'percent'] == -1) {
14931 $colorClass =
'timeline-icon-not-applicble';
14932 $pictoTitle = $langs->trans(
'StatusNotApplicable');
14933 } elseif ($histo[$key][
'percent'] == 0) {
14934 $colorClass =
'timeline-icon-todo';
14935 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
14936 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
14937 $colorClass =
'timeline-icon-in-progress';
14938 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
14939 } elseif ($histo[$key][
'percent'] >= 100) {
14940 $colorClass =
'timeline-icon-done';
14941 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
14944 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
14945 $iconClass =
'fa fa-ticket';
14946 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
14947 $iconClass =
'fa fa-pencilxxx';
14948 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14949 $iconClass =
'fa fa-comments';
14950 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14951 $iconClass =
'fa fa-mask';
14953 if ($actionstatic->type_picto) {
14954 $img_picto =
img_picto(
'', $actionstatic->type_picto);
14956 if ($actionstatic->type_code ==
'AC_RDV') {
14957 $iconClass =
'fa fa-handshake';
14958 } elseif ($actionstatic->type_code ==
'AC_TEL') {
14959 $iconClass =
'fa fa-phone';
14960 } elseif ($actionstatic->type_code ==
'AC_FAX') {
14961 $iconClass =
'fa fa-fax';
14962 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
14963 $iconClass =
'fa fa-envelope';
14964 } elseif ($actionstatic->type_code ==
'AC_INT') {
14965 $iconClass =
'fa fa-shipping-fast';
14966 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
14967 $iconClass =
'fa fa-robot';
14968 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
14969 $iconClass =
'fa fa-robot';
14974 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
14988 $documents = array();
14990 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename, ecm.agenda_id';
14991 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
14992 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
14994 $sql.=
' OR ecm.agenda_id = '.(int)
$object->id;
14995 $sql .=
' ORDER BY ecm.position ASC';
14997 $resql = $db->query($sql);
14999 if ($db->num_rows($resql)) {
15000 while ($obj = $db->fetch_object($resql)) {
15001 $documents[$obj->id] = $obj;
15027function show_actions_messaging(
$conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
15029 global $user,
$conf;
15032 global $param, $massactionbutton;
15034 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
15037 if (!is_object($filterobj) && !is_object($objcon)) {
15042 '@phan-var-force array<int,array{type:string,tododone:string,id:string,datestart:int|string,dateend:int|string,note:string,message:string,percent:string,userid:string,login:string,userfirstname:string,userlastname:string,userphoto:string,msg_from?:string,contact_id?:string,socpeopleassigned?:int[],lastname?:string,firstname?:string,fk_element?:int,elementtype?:string,acode:string,alabel?:string,libelle?:string,apicto?:string}> $histo';
15047 $sortfield_list = explode(
',', $sortfield);
15048 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
15049 $sortfield_new_list = array();
15050 foreach ($sortfield_list as $sortfield_value) {
15051 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
15053 $sortfield_new = implode(
',', $sortfield_new_list);
15058 if (isModEnabled(
'agenda')) {
15060 if (is_object($objcon) && $objcon->id > 0) {
15061 $sql =
"SELECT DISTINCT a.id, a.label as label,";
15063 $sql =
"SELECT a.id, a.label as label,";
15065 $sql .=
" a.datep as dp,";
15066 $sql .=
" a.note as message,";
15067 $sql .=
" a.datep2 as dp2,";
15068 $sql .=
" a.percent as percent, 'action' as type,";
15069 $sql .=
" a.fk_element, a.elementtype,";
15070 $sql .=
" a.fk_contact,";
15071 $sql .=
" a.email_from as msg_from,";
15072 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
15073 $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";
15074 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
15075 $sql .=
", sp.lastname, sp.firstname";
15076 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
15077 $sql .=
", m.lastname, m.firstname";
15078 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur'))) {
15081 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
15082 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
15083 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
15085 $force_filter_contact = $filterobj instanceof
User;
15087 if (is_object($objcon) && $objcon->id > 0) {
15088 $force_filter_contact =
true;
15089 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
15090 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
15093 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
15094 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
15095 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
15096 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
15097 $sql .=
" ON er.resource_type = 'dolresource'";
15098 $sql .=
" AND er.element_id = a.id";
15099 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
15100 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
15101 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
15102 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
15103 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
15104 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
15105 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
15106 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
15107 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
15108 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
15109 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
15110 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
15111 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
15112 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
15113 $sql .=
", ".MAIN_DB_PREFIX.
"facture as o";
15114 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
15115 $sql .=
", ".MAIN_DB_PREFIX.
"facture_fourn as o";
15118 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
15119 if (!$force_filter_contact) {
15120 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
15121 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
15122 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
15123 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
15124 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
15125 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
15126 if ($filterobj->id) {
15127 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15129 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
15130 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
15131 if ($filterobj->id) {
15132 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15134 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
15135 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
15136 if ($filterobj->id) {
15137 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15139 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
15140 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
15141 if ($filterobj->id) {
15142 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15144 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
15145 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
15146 if ($filterobj->id) {
15147 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15149 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
15150 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
15151 if ($filterobj->id) {
15152 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15154 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
15155 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
15156 if ($filterobj->id) {
15157 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
15159 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
15160 $sql .=
" AND a.fk_contact = sp.rowid";
15161 if ($filterobj->id) {
15162 $sql .=
" AND a.fk_contact = ".((int) $filterobj->id);
15164 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
15165 $sql .=
" AND a.fk_element = o.rowid";
15166 if ($filterobj->id) {
15167 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice'";
15169 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
15170 $sql .=
" AND a.fk_element = o.rowid";
15171 if ($filterobj->id) {
15172 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice_supplier'";
15176 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
15180 if (!empty($actioncode) && $actioncode !=
'-1') {
15182 if ($actioncode ==
'AC_NON_AUTO') {
15183 $sql .=
" AND c.type != 'systemauto'";
15184 } elseif ($actioncode ==
'AC_ALL_AUTO') {
15185 $sql .=
" AND c.type = 'systemauto'";
15187 if ($actioncode ==
'AC_OTH') {
15188 $sql .=
" AND c.type != 'systemauto'";
15189 } elseif ($actioncode ==
'AC_OTH_AUTO') {
15190 $sql .=
" AND c.type = 'systemauto'";
15194 if ($actioncode ==
'AC_NON_AUTO') {
15195 $sql .=
" AND c.type != 'systemauto'";
15196 } elseif ($actioncode ==
'AC_ALL_AUTO') {
15197 $sql .=
" AND c.type = 'systemauto'";
15199 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
15203 if ($donetodo ==
'todo') {
15204 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
15205 } elseif ($donetodo ==
'done') {
15206 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
15208 if (is_array($filters) && $filters[
'search_agenda_label']) {
15209 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
15214 if (isModEnabled(
'mailing') && !empty($objcon->email)
15215 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
15216 $langs->load(
"mails");
15218 $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";
15219 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
15220 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
15221 $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";
15222 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
15223 $sql2 .=
", '' as lastname, '' as firstname";
15224 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
15225 $sql2 .=
", '' as lastname, '' as firstname";
15226 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
15227 $sql2 .=
", '' as ref";
15228 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
15229 $sql2 .=
", '' as ref";
15230 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
15231 $sql2 .=
", '' as ref";
15233 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
15234 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
15235 $sql2 .=
" AND mc.statut = 1";
15236 $sql2 .=
" AND u.rowid = m.fk_user_valid";
15237 $sql2 .=
" AND mc.fk_mailing=m.rowid";
15240 if ($sql || $sql2) {
15241 if (!empty($sql) && !empty($sql2)) {
15242 $sql = $sql.
" UNION ".$sql2;
15243 } elseif (empty($sql) && !empty($sql2)) {
15252 $sql .= $db->order($sortfield_new, $sortorder);
15254 $sql .= $db->plimit($limit + 1, $offset);
15257 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
15258 $resql = $db->query($sql);
15261 $num = $db->num_rows($resql);
15263 $imaxinloop = ($limit ? min($num, $limit) : $num);
15264 while ($i < $imaxinloop) {
15265 $obj = $db->fetch_object($resql);
15267 if ($obj->type ==
'action') {
15269 $contactaction->id = $obj->id;
15270 $result = $contactaction->fetchResources();
15273 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
15279 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
15280 $tododone =
'todo';
15283 $histo[$numaction] = array(
15284 'type' => $obj->type,
15285 'tododone' => $tododone,
15287 'datestart' => $db->jdate($obj->dp),
15288 'dateend' => $db->jdate($obj->dp2),
15289 'note' => $obj->label,
15291 'percent' => $obj->percent,
15293 'userid' => $obj->user_id,
15294 'login' => $obj->user_login,
15295 'userfirstname' => $obj->user_firstname,
15296 'userlastname' => $obj->user_lastname,
15297 'userphoto' => $obj->user_photo,
15298 'msg_from' => $obj->msg_from,
15300 'contact_id' => $obj->fk_contact,
15301 'socpeopleassigned' => $contactaction->socpeopleassigned,
15302 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
15303 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
15304 'fk_element' => $obj->fk_element,
15305 'elementtype' => $obj->elementtype,
15307 'acode' => $obj->acode,
15308 'alabel' => $obj->alabel,
15309 'libelle' => $obj->alabel,
15310 'apicto' => $obj->apicto
15313 $histo[$numaction] = array(
15314 'type' => $obj->type,
15315 'tododone' =>
'done',
15317 'datestart' => $db->jdate($obj->dp),
15318 'dateend' => $db->jdate($obj->dp2),
15319 'note' => $obj->label,
15321 'percent' => $obj->percent,
15322 'acode' => $obj->acode,
15324 'userid' => $obj->user_id,
15325 'login' => $obj->user_login,
15326 'userfirstname' => $obj->user_firstname,
15327 'userlastname' => $obj->user_lastname,
15328 'userphoto' => $obj->user_photo
15343 if (!isModEnabled(
'agenda')) {
15344 $langs->loadLangs(array(
"admin",
"errors"));
15345 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
15348 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
15349 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
15351 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
15352 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
15353 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
15354 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
15359 $userstatic =
new User($db);
15360 $contactstatic =
new Contact($db);
15361 $userGetNomUrlCache = array();
15362 $contactGetNomUrlCache = array();
15364 $out .=
'<div class="filters-container" >';
15365 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
15366 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
15368 if ($objcon && get_class($objcon) ==
'Contact' &&
15369 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
15370 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
15372 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
15374 if (($filterobj && get_class($filterobj) ==
'Societe')) {
15375 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
15377 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
15382 $out .=
'<div class="div-table-responsive-no-min">';
15383 $out .=
'<table class="noborder borderbottom centpercent">';
15385 $out .=
'<tr class="liste_titre">';
15389 $out .=
'<th class="liste_titre width50 middle">';
15390 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
15391 $out .= $searchpicto;
15396 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ').
"\n";
15398 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
15400 $out .=
'<th class="liste_titre"></th>';
15403 $out .=
'<th class="liste_titre">';
15404 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
15405 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
15408 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
15409 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
15414 $out .=
'<th class="liste_titre width50 middle">';
15415 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
15416 $out .= $searchpicto;
15422 $out .=
'</table>';
15429 $out .=
'<ul class="timeline">';
15433 if ($filterobj instanceof
Societe) {
15434 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
15436 if ($filterobj instanceof
User) {
15437 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
15439 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
15440 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
15441 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
15443 if ($filterobj instanceof
Societe) {
15446 if ($filterobj instanceof
User) {
15452 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
15454 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
15456 $actualCycleDate =
false;
15459 foreach ($histo as $key => $value) {
15460 $actionstatic->fetch($histo[$key][
'id']);
15462 $actionstatic->type_picto = $histo[$key][
'apicto'];
15463 $actionstatic->type_code = $histo[$key][
'acode'];
15465 $labeltype = $actionstatic->type_code;
15466 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
15467 $labeltype =
'AC_OTH';
15469 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
15470 $labeltype = $langs->trans(
"Message");
15472 if (!empty($arraylist[$labeltype])) {
15473 $labeltype = $arraylist[$labeltype];
15475 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
15476 $labeltype .=
' - '.$arraylist[$actionstatic->code];
15480 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
15482 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
15484 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
15485 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
15486 $out .=
'<!-- timeline time label -->';
15487 $out .=
'<li class="time-label">';
15488 $out .=
'<span class="timeline-badge-date">';
15489 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
15492 $out .=
'<!-- /.timeline-label -->';
15496 $out .=
'<!-- timeline item -->'.
"\n";
15497 $out .=
'<li class="timeline-code-'.(!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none").
'">';
15500 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
15505 $out .=
'<div class="timeline-item">'.
"\n";
15507 $out .=
'<span class="time timeline-header-action2">';
15509 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
15510 $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").
' ';
15511 $out .= $histo[$key][
'id'];
15514 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
15517 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
15518 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
15519 $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).
'">';
15521 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
15528 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
15529 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
15530 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
15531 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
15532 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
15533 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
15534 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
15536 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
15540 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
15543 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
15546 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
15549 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
15555 $out .=
"</span></span>\n";
15557 $out .=
'<span class="time">';
15558 $out .= $actionstatic->getLibStatut(2);
15562 $out .=
'<h3 class="timeline-header">';
15565 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
15566 if ($histo[$key][
'userid'] > 0) {
15567 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
15568 $userstatic->fetch($histo[$key][
'userid']);
15569 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
15571 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
15572 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
15573 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
15574 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
15575 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
15577 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
15580 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
15585 $out .=
' <div class="messaging-title inline-block">';
15587 if (empty(
$conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
15588 $out .= $labeltype.
' - ';
15593 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
15594 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
15595 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
15596 $out .= $langs->trans(
'TicketNewMessage');
15597 } elseif (isset($histo[$key][
'type'])) {
15598 if ($histo[$key][
'type'] ==
'action') {
15599 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
15600 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
15601 $libelle = $histo[$key][
'note'];
15602 $actionstatic->id = $histo[$key][
'id'];
15603 if ($libelle != $labeltype) {
15606 } elseif ($histo[$key][
'type'] ==
'mailing') {
15607 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
15608 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
15609 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
15612 $libelle .= $histo[$key][
'note'];
15616 $out = preg_replace(
'/ - $/',
'', $out);
15618 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
15619 if (isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
15620 $link =
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
15622 if (!isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
15623 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
15625 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
15626 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
15629 $out .=
' - '.$link;
15638 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
15639 && $actionstatic->code !=
'AC_TICKET_CREATE'
15640 && $actionstatic->code !=
'AC_TICKET_MODIFY'
15642 $out .=
'<div class="timeline-body wordbreak small">';
15643 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
15645 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
15646 $out .=
'<div class="readmore-block --closed" >';
15647 $out .=
' <div class="readmore-block__excerpt">';
15649 $out .=
' <br><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>';
15651 $out .=
' <div class="readmore-block__full-text" >';
15653 $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>';
15667 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
15669 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
15670 if (empty(
$conf->cache[
'contact'][$cid])) {
15672 $contact->fetch($cid);
15673 $conf->cache[
'contact'][$cid] = $contact;
15675 $contact =
$conf->cache[
'contact'][$cid];
15679 $contactList .= !empty($contactList) ?
', ' :
'';
15680 $contactList .= $contact->getNomUrl(1);
15681 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
15682 if (!empty($contact->phone_pro)) {
15683 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
15689 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
15690 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
15691 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
15693 $result = $contact->fetch($histo[$key][
'contact_id']);
15694 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
15696 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
15697 $result = ($contact instanceof
Contact) ? $contact->id : 0;
15701 $footer .= $contact->getNomUrl(1);
15702 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
15703 if (!empty($contact->phone_pro)) {
15704 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
15711 if (!empty($documents)) {
15712 $footer .=
'<div class="timeline-documents-container">';
15713 foreach ($documents as $doc) {
15714 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
15715 $footer .=
' data-id="'.$doc->id.
'" ';
15716 $footer .=
' data-path="'.$doc->filepath.
'"';
15717 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
15720 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
15722 if (empty($doc->agenda_id)) {
15723 $dir_ref = $actionstatic->id;
15724 $modulepart =
'actions';
15726 $split_dir = explode(
'/', $doc->filepath);
15727 $modulepart = array_shift($split_dir);
15728 $dir_ref = implode(
'/', $split_dir);
15731 $file = $dir_ref.
'/'.$doc->filename;
15732 $thumb = $dir_ref.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
15733 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart='.$modulepart.
'&attachment=0&file='.urlencode($file).
'&entity='.
$conf->entity;
15734 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart='.$modulepart.
'&file='.urlencode($thumb).
'&entity='.
$conf->entity;
15738 $mimeAttr =
' mime="'.$mime.
'" ';
15740 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
15741 $class .=
' documentpreview';
15744 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
15745 $footer .=
img_mime($filePath).
' '.$doc->filename;
15748 $footer .=
'</span>';
15750 $footer .=
'</div>';
15753 if (!empty($footer)) {
15754 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
15757 $out .=
'</div>'.
"\n";
15760 $out .=
'<!-- END timeline item -->';
15767 jQuery(document).ready(function () {
15768 $(document).on("click", "[data-read-more-action]", function(e){
15769 console.log("We click on data-read-more-action");
15770 let readMoreBloc = $(this).closest(".readmore-block");
15771 if(readMoreBloc.length > 0){
15772 e.preventDefault();
15773 if($(this).attr("data-read-more-action") == "close"){
15774 readMoreBloc.addClass("--closed").removeClass("--open");
15775 $("html, body").animate({
15776 scrollTop: readMoreBloc.offset().top - 200
15779 readMoreBloc.addClass("--open").removeClass("--closed");
15787 if (empty($histo)) {
15788 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
15811function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
15813 if ($timestamp ===
null) {
15814 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
15821 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
15822 $TParam = array_merge($TParam, array(
15829 return '&' . http_build_query($TParam);
15850function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
15852 global
$conf, $db, $langs, $hookmanager;
15855 if (!is_object($langs)) {
15856 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
15858 $langs->setDefaultLang();
15861 $langs->load(
"errors");
15863 if ($printheader) {
15864 if (function_exists(
"llxHeader")) {
15866 } elseif (function_exists(
"llxHeaderVierge")) {
15871 print
'<div class="error">';
15872 if (empty($message)) {
15873 print $langs->trans(
"ErrorRecordNotFound");
15875 print $langs->trans($message);
15880 if (empty($showonlymessage)) {
15881 if (empty($hookmanager)) {
15882 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
15885 $hookmanager->initHooks(array(
'main'));
15888 $parameters = array(
'message' => $message,
'params' => $params);
15889 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
15890 print $hookmanager->resPrint;
15893 if ($printfooter && function_exists(
"llxFooter")) {
15895 if (is_object($db)) {
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined( 'NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined( 'NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) if(!defined( 'NOLOGIN')) if(!defined('NOCSRFCHECK')) if(!defined( 'NOIPCHECK')) llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[])
Header function.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='')
On/off button to change a property status of an object This uses the ajax service objectonoff....
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
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...)
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($utf8_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.
verifCond($strToEvaluate, $onlysimplestring='1')
Verify if condition in string is ok or not.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
getDolGlobalFloat($key, $default=0)
Return a Dolibarr global constant float value.
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formatted size.
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 information (by default a local PHP server timestamp) Rep...
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) If ...
img_weather($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $morecss='')
Show weather picto.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
dolCheckFilters($sqlfilters, &$error='', &$parenthesislevel=0)
Return if a $sqlfilters parameter has a valid balance of parenthesis.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
getLanguageCodeFromCountryCode($countrycode)
Return default language from country code.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
setEntity($currentobject)
Set entity id to use when to create an object.
dolForgeExplodeAnd($sqlfilters)
Explode an universal search string with AND parts.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
dol_print_ip($ip, $mode=0, $showname=0)
Return an IP formatted to be shown on screen.
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_right($titlealt='default', $selected=0, $moreatt='')
Show right arrow logo.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_left($titlealt='default', $selected=0, $moreatt='')
Show left arrow logo.
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 the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
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.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_eval_new($s)
Replace eval function to add more security.
getCallerInfoString()
Get caller info as a string that can be appended to a log message.
get_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Get formatted error messages to output (Used to show messages on html output).
dol_user_country()
Return country code for current user.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=null)
Clean a string from some undesirable HTML tags.
getMultidirTemp($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its temporary ...
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
picto_required()
Return picto saying a field is required.
isDolTms($timestamp)
isDolTms check if a timestamp is valid.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
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...
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
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.
dolPrintText($s)
Return a string label (possible on several lines and that should not contains any HTML) ready to be o...
utf8_valid($str)
Check if a string is in UTF8.
getPictoForType($key, $morecss='')
Return the picto for a data type.
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
img_allow($allow, $titlealt='default')
Show tick logo if allowed.
isValidMXRecord($domain)
Return if the domain name has a valid MX record.
dolButtonToOpenExportDialog($name, $label, $buttonstring, $exportSiteName, $overwriteGitUrl, $website)
Create a dialog with two buttons for export and overwrite of a website.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_print_socialnetworks($value, $contactid, $socid, $type, $dictsocialnetworks=array())
Show social network link.
getImgPictoNameList()
Get all usage icon key usable for img_picto(..., key)
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 '.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
img_view($titlealt='default', $float=0, $other='class="valignmiddle"')
Show logo view card.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_get_object_properties($obj, $properties=[])
Get properties for an object - including magic properties when requested.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
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_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
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.
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.
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.
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
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_eval_standard($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
dolPrintLabel($s, $escapeonlyhtmltags=0)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
dol_strtoupper($string, $encoding="UTF-8")
Convert a string to upper.
getMultidirVersion($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its versioned ...
dol_sanitizeUrl($stringtoclean, $type=1)
Clean a string to use it as an URL (into a href or src attribute)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
img_printer($titlealt="default", $other='')
Show printer logo.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted 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.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
getImgPictoConv($mode='fa')
Get array to convert the Dolibarr picto keys into font awesome keys.
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
getArrayOfSocialNetworks()
Get array of social network dictionary.
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, ...)
dol_escape_all($stringtoescape)
Returns text escaped for all protocols (so only alpha chars and numbers)
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dolForgeSQLCriteriaCallback($matches)
Function to forge a SQL criteria from a USF (Universal Filter Syntax) string.
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='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_escape_uri($stringtoescape)
Returns text escaped by RFC 3986 for inclusion into a clickable link.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
print_titre($title)
Show a title.
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).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
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 formatted messages to output (Used to show messages on html output).
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
buildParamDate($prefix, $timestamp=null, $hourTime='', $gm='auto')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_next($titlealt='default', $moreatt='')
Show next logo.
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 startx with $text.
dolSlugify($stringtoslugify)
Returns text slugified (lowercase and no special char, separator is "-").
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).
get_htmloutput_mesg($mesgstring='', $mesgarray=[], $style='ok', $keepembedded=0)
Get formatted messages to output (Used to show messages on html output).
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...
print_fleche_navigation($page, $file, $options='', $nextpage=0, $betweenarrows='', $afterarrows='', $limit=-1, $totalnboflines=0, $selectlimitsuffix='', $beforearrows='', $hidenavigation=0)
Function to show navigation arrows into lists.
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 links.
jsonOrUnserialize($stringtodecode)
Decode an encode string.
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 +.
print_fiche_titre($title, $mesg='', $picto='generic', $pictoisfullpath=0, $id='')
Show a title with picto.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
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_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0, $allowscript=0, $allowstyle=0, $allowphp=0)
Clean a string to keep only desirable HTML tags.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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.
dol_sanitizeKeyCode($str)
Clean a string to use it as a key or code.
img_credit_card($brand, $morecss=null)
Return image of a credit card according to its brand name.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_searchclear($titlealt='default', $other='')
Show search logo.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
utf8_check($str)
Check if a string is in UTF8.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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 formatted error messages to output (Used to show messages on html output).
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
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.
dolPrintHTMLForAttributeUrl($s)
Return a string ready to be output on a href attribute (this one need a special because we need conte...
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 formatted text with and (WARNING: string must not have mixed and br sep...
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...
const MODULE_MAPPING
This mapping defines the conversion to the current internal names from the alternative allowed names ...
dolBECalculateStructuredCommunication($invoice_number, $invoice_type)
Calculate Structured Communication / BE Bank payment reference number.
dol_convertToWord($num, $langs, $currency='', $centimes=false)
Function to return a number into a text.
treeview li table
No Email.
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
div refaddress div address
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
dol_setcache($memoryid, $data, $expire=0, $filecache=0, $replace=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid, $filecache=0)
Read a memory area shared by all users, all sessions on server.
if(preg_match('/(crypted|dolcrypt):/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.
realCharForNumericEntities($matches)
Return the real char for a numeric entities.