56if (!function_exists(
'utf8_encode')) {
64 function utf8_encode($elements)
66 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
70if (!function_exists(
'utf8_decode')) {
78 function utf8_decode($elements)
80 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
83if (!function_exists(
'str_starts_with')) {
92 function str_starts_with($haystack, $needle)
94 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
97if (!function_exists(
'str_ends_with')) {
106 function str_ends_with($haystack, $needle)
108 return $needle !==
'' && substr($haystack, -strlen($needle)) === (
string) $needle;
111if (!function_exists(
'str_contains')) {
120 function str_contains($haystack, $needle)
122 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
137 return json_encode($data);
140 return var_export($data,
true);
160 if (!is_object(
$object) && empty($module)) {
163 if (empty($module) && !empty(
$object->element)) {
170 $module =
'ficheinter';
172 case 'invoice_supplier':
173 $module =
'supplier_invoice';
175 case 'order_supplier':
176 $module =
'supplier_order';
178 case 'recruitmentjobposition':
179 $module =
'recruitment';
180 $subdirectory =
'/recruitmentjobposition';
182 case 'recruitmentcandidature':
183 $module =
'recruitment';
184 $subdirectory =
'/recruitmentcandidature';
186 case 'knowledgerecord':
187 $module =
'knowledgemanagement';
188 $subdirectory =
'/knowledgerecord';
190 case 'commande_fournisseur':
191 $module =
'fournisseur';
192 $subdirectory =
'/commande';
197 $module =
'expedition';
198 $subdirectory =
'/sending';
213 $subdirectory =
'/'.$object->project->ref;
225 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
226 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_output')) {
228 if ($mode !=
'outputrel') {
231 if ($forobject &&
$object->id > 0) {
235 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_output')) {
237 if ($mode !=
'outputrel') {
238 $s =
$conf->$module->dir_output . $subdirectory;
240 if ($forobject &&
$object->id > 0) {
245 return 'error-diroutput-not-defined-for-this-object=' . $module;
247 } elseif ($mode ==
'temp') {
248 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_temp')) {
250 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_temp')) {
253 return 'error-dirtemp-not-defined-for-this-object=' . $module;
256 return 'error-bad-value-for-mode';
300 return (
string) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
310 global $dolibarr_login_badcharunauthorized;
312 if (isset($dolibarr_login_badcharunauthorized)) {
313 if ($dolibarr_login_badcharunauthorized ===
'MAIN_LOGIN_BADCHARUNAUTHORIZED') {
317 return (
string) $dolibarr_login_badcharunauthorized;
335 return (
int) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
350 return (
float) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
364 return (
bool) (
$conf->global->$key ?? $default);
375 return (
string)
$conf->currency;
386 return (
string)
$conf->dol_optimize_smallscreen;
397 return (
int)
$conf->entity;
408 return $conf->db->type;
419 return str_replace(
'_',
'', basename(dirname($s)).basename($s,
'.php'));
433 if (empty($tmpuser)) {
438 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
451 if (empty($tmpuser)) {
456 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
472 'adherent' =>
'member',
473 'member_type' =>
'adherent_type',
475 'contrat' =>
'contract',
476 'entrepot' =>
'stock',
477 'projet' =>
'project',
478 'categorie' =>
'category',
479 'commande' =>
'order',
480 'expedition' =>
'shipping',
481 'facture' =>
'invoice',
482 'fichinter' =>
'intervention',
483 'ficheinter' =>
'intervention',
484 'propale' =>
'propal',
485 'societe' =>
'thirdparty',
486 'socpeople' =>
'contact',
487 'fournisseur' =>
'supplier',
489 'actioncomm' =>
'agenda',
490 'product_price' =>
'productprice',
491 'product_fournisseur_price' =>
'productsupplierprice',
511 $arrayconv[
'supplier_order'] =
'fournisseur';
512 $arrayconv[
'supplier_invoice'] =
'fournisseur';
515 $module_alt = $module;
516 if (!empty($arrayconv[$module])) {
517 $module_alt = $arrayconv[$module];
519 $module_bis = $module;
520 if (!empty($arrayconvbis[$module])) {
521 $module_bis = $arrayconvbis[$module];
524 return !empty(
$conf->modules[$module]) || !empty(
$conf->modules[$module_alt]) || !empty(
$conf->modules[$module_bis]);
542 $moduletomoduletouse = array(
543 'invoice' =>
'facture',
545 $moduleParmsMapping = array(
546 'product' =>
'produit',
549 if (!empty($moduletomoduletouse[$module])) {
550 $module = $moduletomoduletouse[$module];
553 $warningDelayPath = $parmlevel1;
554 if (!empty($moduleParmsMapping[$warningDelayPath])) {
555 $warningDelayPath = $moduleParmsMapping[$warningDelayPath];
559 if (!empty(
$conf->$module) && !empty(
$conf->$module->$warningDelayPath) && !empty(
$conf->$module->$warningDelayPath->$parmlevel2) && !empty(
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay)) {
560 return (
int)
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay;
563 if (!empty(
$conf->$module) && !empty(
$conf->$module->$warningDelayPath) && !empty(
$conf->$module->$warningDelayPath->warning_delay)) {
564 return (
int)
$conf->$module->$warningDelayPath->warning_delay;
579 if ($timestamp ===
'') {
580 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page ' . $_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_NOTICE);
583 if (is_null($timestamp) || !is_numeric($timestamp)) {
603 require_once DOL_DOCUMENT_ROOT .
"/core/db/" . $type .
'.class.php';
605 $class =
'DoliDB' . ucfirst($type);
606 $db =
new $class($type, $host, $user, $pass, $name, $port);
627function getEntity($element, $shared = 1, $currentobject =
null)
631 if (!is_object($hookmanager)) {
632 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
639 $element =
'project';
642 $element =
'contract';
644 case 'order_supplier':
645 $element =
'supplier_order';
647 case 'invoice_supplier':
648 $element =
'supplier_invoice';
652 if (is_object($mc)) {
653 $out = $mc->getEntity($element, $shared, $currentobject);
656 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
658 $addzero[] =
'c_holiday_types';
660 if (in_array($element, $addzero)) {
663 $out .= ((int)
$conf->entity);
668 'element' => $element,
671 'currentobject' => $currentobject,
675 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
677 if (is_numeric($reshook)) {
678 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
679 $out .=
',' . $hookmanager->resPrint;
680 } elseif ($reshook == 1) {
681 $out = $hookmanager->resPrint;
698 if (is_object($mc) && method_exists($mc,
'setEntity')) {
699 return $mc->setEntity($currentobject);
701 return ((is_object($currentobject) && $currentobject->id > 0 && ((
int) $currentobject->entity) > 0) ? (
int) $currentobject->entity :
$conf->entity);
713 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
726 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
727 $r = chr($n % 26 + 0x41) . $r;
751 include_once DOL_DOCUMENT_ROOT .
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
758 $user_agent = substr($user_agent, 0, 512);
761 $detectmobile =
new Mobile_Detect(
null, $user_agent);
762 $tablet = $detectmobile->isTablet();
764 if ($detectmobile->isMobile()) {
768 if ($detectmobile->is(
'AndroidOS')) {
769 $os = $phone =
'android';
770 } elseif ($detectmobile->is(
'BlackBerryOS')) {
771 $os = $phone =
'blackberry';
772 } elseif ($detectmobile->is(
'iOS')) {
775 } elseif ($detectmobile->is(
'PalmOS')) {
776 $os = $phone =
'palm';
777 } elseif ($detectmobile->is(
'SymbianOS')) {
779 } elseif ($detectmobile->is(
'webOS')) {
781 } elseif ($detectmobile->is(
'MaemoOS')) {
783 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
789 if (preg_match(
'/linux/i', $user_agent)) {
791 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
793 } elseif (preg_match(
'/windows/i', $user_agent)) {
799 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
801 $version = empty($reg[2]) ?
'' : $reg[2];
802 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
804 $version = empty($reg[2]) ?
'' : $reg[2];
805 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
807 $version = empty($reg[2]) ?
'' : $reg[2];
808 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
811 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
813 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
815 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
817 $version = empty($reg[2]) ?
'' : $reg[2];
818 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
821 $version = empty($reg[2]) ?
'' : $reg[2];
822 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
824 $version = end($reg);
825 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
828 $version = end($reg);
829 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
831 $name =
'textbrowser';
832 $version = empty($reg[3]) ?
'' : $reg[3];
833 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
835 $name =
'textbrowser';
836 $version = empty($reg[1]) ?
'' : $reg[1];
848 'browsername' => $name,
849 'browserversion' => $version,
851 'browserua' => $user_agent,
866 $disconnectdone =
false;
868 if (is_object(
$db) && !empty(
$db->connected)) {
869 $depth =
$db->transaction_opened;
870 $disconnectdone =
$db->close();
872 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));
888 $relativepathstring = $_SERVER[
"PHP_SELF"];
890 if (constant(
'DOL_URL_ROOT')) {
891 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
893 $relativepathstring = ltrim($relativepathstring,
'/');
894 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
898 if (!empty($_GET[
'restore_lastsearch_values'])) {
899 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
900 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
901 if (is_array($tmp)) {
902 foreach ($tmp as $key => $val) {
903 if ($key == $paramname) {
911 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
913 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
915 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
917 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
921 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
938 if (empty($method)) {
939 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
940 } elseif ($method == 1) {
941 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
942 } elseif ($method == 2) {
943 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
944 } elseif ($method == 3) {
945 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
947 $val =
'BadFirstParameterForGETPOST';
950 return is_array($val);
964function GETPOSTINT($paramname, $method = 0, $nodefault = 0)
966 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0, $nodefault);
982function GETPOSTFLOAT($paramname, $rounding =
'', $option = 2)
1003function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto', $saverestore =
'')
1006 if ($hourTime ===
'getpost' || $hourTime ===
'getpostend') {
1010 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
1011 $hour = intval($m[1]);
1012 $minute = intval($m[2]);
1013 $second = intval($m[3]);
1014 } elseif ($hourTime ===
'end') {
1019 $hour = $minute = $second = 0;
1027 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_day'])
1028 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_month'])
1029 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_year'])
1031 $day = $_SESSION[
'DOLDATE_' . $saverestore .
'_day'];
1032 $month = $_SESSION[
'DOLDATE_' . $saverestore .
'_month'];
1033 $year = $_SESSION[
'DOLDATE_' . $saverestore .
'_year'];
1041 $hour = (int) min($hour, 23);
1042 $minute = (int) min($minute, 59);
1043 $second = (int) min($second, 59);
1046 $_SESSION[
'DOLDATE_' . $saverestore .
'_day'] = $day;
1047 $_SESSION[
'DOLDATE_' . $saverestore .
'_month'] = $month;
1048 $_SESSION[
'DOLDATE_' . $saverestore .
'_year'] = $year;
1052 return dol_mktime($hour, $minute, $second, $month, $day, $year, $gm);
1096function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0, $nodefault = 0)
1100 if (empty($paramname)) {
1101 return 'BadFirstParameterForGETPOST';
1103 if (empty($check)) {
1104 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);
1108 if (in_array($paramname, array(
'sortfield',
'sortorder'))) {
1109 $check =
'aZ09comma';
1112 if (empty($method)) {
1113 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
1114 } elseif ($method == 1) {
1115 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
1116 } elseif ($method == 2) {
1117 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
1118 } elseif ($method == 3) {
1119 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
1121 return 'BadThirdParameterForGETPOST';
1124 $relativepathstring =
'';
1126 if (empty($method) || $method == 3 || $method == 4) {
1127 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
1129 if (constant(
'DOL_URL_ROOT')) {
1130 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
1132 $relativepathstring = ltrim($relativepathstring,
'/');
1133 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1137 if (!empty($_GET[
'restore_lastsearch_values'])) {
1138 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
1139 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
1140 if (is_array($tmp)) {
1141 foreach ($tmp as $key => $val) {
1142 if ($key == $paramname) {
1150 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
1151 $out = $_SESSION[
'lastsearch_contextpage_' . $relativepathstring];
1152 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
1153 $out = $_SESSION[
'lastsearch_limit_' . $relativepathstring];
1154 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
1155 $out = $_SESSION[
'lastsearch_page_' . $relativepathstring];
1156 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
1157 $out = $_SESSION[
'lastsearch_mode_' . $relativepathstring];
1159 } elseif (!isset($_GET[
'sortfield'])) {
1162 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1165 '@phan-var-force CommonObject $object';
1166 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
1168 $out =
$object->fields[$paramname][
'default'];
1172 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1174 if (!empty($user->default_values)) {
1175 if (isset($user->default_values[$relativepathstring][
'createform'])) {
1176 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
1178 if ($defkey !=
'_noquery_') {
1179 $tmpqueryarraytohave = explode(
'&', $defkey);
1182 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1183 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1195 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
1196 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
1203 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname]) && empty($nodefault)) {
1205 if (!empty($user->default_values)) {
1208 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
1210 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
1212 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
1214 if ($defkey !=
'_noquery_') {
1215 $tmpqueryarraytohave = explode(
'&', $defkey);
1218 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1219 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1231 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1232 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
1236 if ($paramname ==
'sortfield') {
1239 if ($paramname ==
'sortorder') {
1247 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
1248 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
1249 if (!empty($_GET[
'disabledefaultvalues'])) {
1253 if ($defkey !=
'_noquery_') {
1254 $tmpqueryarraytohave = explode(
'&', $defkey);
1257 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1258 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1269 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
1271 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
1274 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1275 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1278 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1279 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1294 '@phan-var-force string $paramname';
1295 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1296 if (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out)) {
1297 $substitutionarray = getCommonSubstitutionArray($langs, 0,
null, $user, array(
'mycompany',
'date',
'system',
'user'));
1305 if (preg_match(
'/^array/', $check)) {
1306 $tmpcheck =
'alphanohtml';
1307 if ($out ===
null || $out ===
'') {
1309 } elseif (!is_array($out)) {
1310 $out = explode(
',', $out);
1312 $tmparray = explode(
':', $check);
1313 if (!empty($tmparray[1])) {
1314 $tmpcheck = $tmparray[1];
1317 foreach ($out as $outkey => $outval) {
1318 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1323 if (strpos($paramname,
'search_') === 0) {
1324 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1328 $out =
sanitizeVal($out, $check, $filter, $options);
1336 if (preg_match(
'/^backto/i', $paramname) || preg_match(
'/^urlfrom/i', $paramname)) {
1337 $out = str_replace(
'\\',
'/', $out);
1338 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1340 $oldstringtoclean = $out;
1341 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1342 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1343 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1344 }
while ($oldstringtoclean != $out);
1349 if (empty($method) || $method == 3 || $method == 4) {
1350 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1357 if ($out !=
'' && isset($user)) {
1358 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1375function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1379 if ($out ===
null) {
1387 if (!is_numeric($out)) {
1392 if (is_array($out)) {
1393 $out = implode(
',', $out);
1395 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1400 dol_syslog(
"Use of parameter value 'san_alpha' in GETPOST is deprecated. Use 'alphanohtml', 'aZ09comma', ...", LOG_WARNING);
1401 $out = filter_var($out, FILTER_SANITIZE_STRING);
1404 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1408 $out = preg_replace(
'/[^:\/\[\]a-z0-9@\$\'\*\~\.\-_,;\?\!=%&+#]+/i',
'', $out);
1412 if (!is_array($out)) {
1414 if (preg_match(
'/[^a-z]+/i', $out)) {
1420 if (!is_array($out)) {
1422 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1428 if (!is_array($out)) {
1430 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1436 if (!is_array($out)) {
1438 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1445 if (!is_array($out)) {
1448 $oldstringtoclean = $out;
1452 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1459 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1460 }
while ($oldstringtoclean != $out);
1464 case 'alphawithlgt':
1465 if (!is_array($out)) {
1468 $oldstringtoclean = $out;
1472 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1479 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1480 }
while ($oldstringtoclean != $out);
1486 case 'restricthtmlnolink':
1487 case 'restricthtml':
1488 case 'restricthtmlallowclass':
1489 case 'restricthtmlallowiframe':
1490 case 'restricthtmlallowlinkscript':
1491 case 'restricthtmlallowunvalid':
1496 if (empty($filter)) {
1497 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1499 if (is_null($options)) {
1502 $out = filter_var($out, $filter, $options);
1506 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1507 $out =
GETPOST($out,
'alphanohtml');
1522function dolSetCookie(
string $cookiename,
string $cookievalue,
int $expire = -1)
1524 include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/securitycore.lib.php';
1526 global $dolibarr_main_force_https;
1528 if ($expire == -1) {
1529 $expire = (time() + (86400 * 354));
1532 if (PHP_VERSION_ID < 70300) {
1533 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : $expire,
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
1536 $cookieparams = array(
1537 'expires' => empty($cookievalue) ? 0 : $expire,
1540 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
1544 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
1546 if (empty($cookievalue)) {
1547 unset($_COOKIE[$cookiename]);
1551if (!function_exists(
'dol_getprefix')) {
1562 function dol_getprefix($mode =
'')
1565 if ($mode ==
'email') {
1571 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1572 return $_SERVER[
"SERVER_NAME"];
1577 if (!empty(
$conf->file->instance_unique_id)) {
1578 return sha1(
'dolibarr' .
$conf->file->instance_unique_id);
1582 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1586 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1587 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1590 if (!empty($tmp_instance_unique_id)) {
1591 return sha1(
'dolibarr' . $tmp_instance_unique_id);
1595 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1596 return sha1($_SERVER[
"SERVER_NAME"] . $_SERVER[
"DOCUMENT_ROOT"] . DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1598 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1617 if (strpos($relpath,
'..') !==
false) {
1619 dol_syslog(
'functions::dol_include_once Tried to load a file with a path including a forbidden sequence ".." : ' . $relpath, LOG_WARNING);
1622 if (!preg_match(
'/\.php$/', $relpath)) {
1624 dol_syslog(
'functions::dol_include_once Tried to load a file that is not a PHP file : ' . $relpath, LOG_WARNING);
1630 if (!file_exists($fullpath)) {
1631 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: ' . $relpath, LOG_WARNING);
1634 if (!empty($classname) && !class_exists($classname)) {
1635 return include $fullpath;
1637 return include_once $fullpath;
1655function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1659 $path = preg_replace(
'/^\//',
'', $path);
1662 $res = DOL_DOCUMENT_ROOT .
'/' . $path;
1663 if (is_array(
$conf->file->dol_document_root)) {
1664 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1665 if ($key ==
'main') {
1669 if (@file_exists($dirroot .
'/' . $path)) {
1670 if ($key !=
'main' && preg_match(
'/^core\//', $path)) {
1673 $res = $dirroot .
'/' . $path;
1678 if ($returnemptyifnotfound) {
1680 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1692 $res = DOL_URL_ROOT .
'/' . $path;
1695 $res = DOL_MAIN_URL_ROOT .
'/' . $path;
1698 $res = DOL_URL_ROOT .
'/' . $path;
1701 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1702 if ($key ==
'main') {
1707 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1708 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1711 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) .
'/' . $path;
1716 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1717 if (!empty($regs[1])) {
1720 if (@file_exists($dirroot .
'/' . $regs[1])) {
1722 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1723 } elseif ($type == 2) {
1724 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1725 } elseif ($type == 3) {
1729 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1730 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1733 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1753function dolBuildUrl($url, $params = [], $addtoken =
false, $anchor =
'')
1755 global
$db, $hookmanager;
1757 if (!is_object($hookmanager)) {
1758 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
1761 if ((!isset($params[
'mainmenu']) || empty($params[
'mainmenu'])) &&
GETPOSTISSET(
'mainmenu')) {
1762 $params = array_merge($params, [
'mainmenu' => (
GETPOST(
'mainmenu',
'restricthtml'))]);
1764 if ((!isset($params[
'leftmenu'])) &&
GETPOSTISSET(
'leftmenu')) {
1765 $params = array_merge($params, [
'leftmenu' => (
GETPOST(
'leftmenu',
'restricthtml'))]);
1769 'params' => &$params,
1770 'addtoken' => &$addtoken,
1772 $hookmanager->executeHooks(
'buildurl', $parameters);
1774 $params = array_merge($params, [
'token' =>
newToken()]);
1777 $url .=
'?' . http_build_query($params);
1780 $url .=
'#' . preg_replace(
'/[^a-z]/i',
'', $anchor);
1799 if (empty($properties)) {
1800 return get_object_vars($obj);
1803 $existingProperties = [];
1804 $realProperties = get_object_vars($obj);
1807 foreach ($properties as $property) {
1808 if (array_key_exists($property, $realProperties)) {
1810 $existingProperties[$property] = $obj->{$property};
1811 } elseif (property_exists($obj, $property)) {
1813 $existingProperties[$property] = $obj->{$property};
1817 return $existingProperties;
1838function dol_clone($srcobject, $native = 2)
1842 dol_syslog(
"Warning, call to dol_clone() with the deprecated parameter native=0, use 2 instead", LOG_WARNING);
1845 if (isset($srcobject->db) && isset($srcobject->db->db) && is_object($srcobject->db->db) && get_class($srcobject->db->db) ==
'PgSql\Connection') {
1846 $tmpsavdb = $srcobject->db;
1847 unset($srcobject->db);
1850 $myclone = unserialize(serialize($srcobject));
1852 if (!empty($tmpsavdb)) {
1853 $srcobject->db = $tmpsavdb;
1855 } elseif ($native == 2) {
1858 $tmparray = get_object_vars($srcobject);
1860 if (is_array($tmparray)) {
1861 foreach ($tmparray as $propertykey => $propertyval) {
1862 if (is_scalar($propertyval) || is_array($propertyval)) {
1863 $myclone->$propertykey = $propertyval;
1868 $myclone = clone $srcobject;
1885 if (is_object($srcobject)) {
1886 $srcobject = get_object_vars($srcobject);
1889 if (is_array($srcobject)) {
1891 foreach ($srcobject as $key => $value) {
1892 if (in_array($key, array(
'db',
'fields',
'error',
'errorhidden',
'errors',
'oldcopy',
'linkedObjects',
'linked_objects'))) {
1913function dol_size($size, $type =
'')
1916 if (empty(
$conf->dol_optimize_smallscreen)) {
1919 if ($type ==
'width' && $size > 250) {
1940function dol_sanitizeFileName($str, $newstr =
'_', $unaccent = 1, $includequotes = 0, $allowdash = 0)
1948 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1949 if ($includequotes) {
1950 $filesystem_forbidden_chars[] =
"'";
1953 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1954 if (empty($allowdash)) {
1955 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1956 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1958 $tmp = str_replace(
'..',
'', $tmp);
1959 $tmp = str_replace(
'~', $newstr, $tmp);
1960 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
1987 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1994 $tmp = preg_replace(
'/\-\-+/', $newstr, $tmp);
1995 if (empty($allowdash)) {
1996 $tmp = preg_replace(
'/\s+\-([^\s])/',
' '.$newstr.
'$1', $tmp);
1997 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1999 $tmp = str_replace(
'..', $newstr, $tmp);
2000 $tmp = str_replace(
'~', $newstr, $tmp);
2001 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
2017 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
2019 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
2021 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
2025 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
2029 $oldstringtoclean = $stringtoclean;
2032 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
2033 }
while ($oldstringtoclean != $stringtoclean);
2037 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
2040 return $stringtoclean;
2052 $oldstringtoclean = $stringtoclean;
2053 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
2054 }
while ($oldstringtoclean != $stringtoclean);
2056 return $stringtoclean;
2069 return preg_replace(
'/[^\w]+/',
'', $str);
2083 if (is_null($str)) {
2088 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
2089 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
2090 return $transliterator->transliterate($str);
2093 $string = rawurlencode($str);
2094 $replacements = array(
2171 $string = strtr($string, $replacements);
2172 return rawurldecode($string);
2177 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
2178 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
2179 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
2180 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
2181 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
2182 \xF9\xFA\xFB\xFC\xFD\xFF",
2190 $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"));
2208function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
2210 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
2211 if (empty($keepspaces)) {
2212 $forbidden_chars_to_replace[] =
" ";
2214 $forbidden_chars_to_remove = array();
2217 if (is_array($badcharstoreplace)) {
2218 $forbidden_chars_to_replace = $badcharstoreplace;
2220 if (is_array($badcharstoremove)) {
2221 $forbidden_chars_to_remove = $badcharstoremove;
2225 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
2244 if ($removetabcrlf) {
2245 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
2247 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
2262 if (function_exists(
'iconv')) {
2263 $slug = iconv(
'UTF-8',
'ASCII//TRANSLIT//IGNORE', $slug);
2267 $slug = strtolower($slug);
2270 $slug = preg_replace(
'/[^a-z0-9]+/',
'-', $slug);
2273 $slug = trim($slug,
'-');
2286function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
2288 if (is_null($stringtoescape)) {
2293 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
2295 if (empty($noescapebackslashn)) {
2296 $substitjs[
"\n"] =
'\\n';
2297 $substitjs[
'\\'] =
'\\\\';
2300 $substitjs[
"'"] =
"\\'";
2301 $substitjs[
'"'] =
"\\'";
2302 } elseif ($mode == 1) {
2303 $substitjs[
"'"] =
"\\'";
2304 } elseif ($mode == 2) {
2305 $substitjs[
'"'] =
'\\"';
2306 } elseif ($mode == 3) {
2307 $substitjs[
"'"] =
"\\'";
2308 $substitjs[
'"'] =
"\\\"";
2310 return strtr((
string) $stringtoescape, $substitjs);
2324 return rawurlencode($stringtoescape);
2335 return str_replace(
'"',
'\"', $stringtoescape);
2347 if (is_null($stringtoescape)) {
2351 if ($stringforquotes == 2) {
2352 return str_replace(
'"',
"'", $stringtoescape);
2353 } elseif ($stringforquotes == 1) {
2359 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
2360 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
2363 return 'Bad parameter for stringforquotes in dol_escape_php';
2374 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
2385 return $stringtoescape;
2426function dolPrintHTML($s, $allowiframe = 0, $moreallowedtags = array())
2435 $allowedtags =
'common';
2436 if (!empty($moreallowedtags)) {
2437 $allowedtags .=
','.implode(
',', $moreallowedtags);
2439 return dol_escape_htmltag(
dol_htmlwithnojs(
dol_string_onlythesehtmltags($stringWithEntitesForSpecialChar, 1, 1, 1, $allowiframe, $allowedtags)), 1, 1, $allowedtags, 0, 1);
2454 $allowedtags = array(
'br',
'b',
'font',
'hr',
'span');
2455 if (!empty($allowothertags) && is_array($allowothertags)) {
2456 $allowedtags = array_merge($allowedtags, $allowothertags);
2460 if ($escapeonlyhtmltags) {
2461 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 0, 0, 0, $allowedtags), 1, -1,
'', 1, 1);
2463 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, $allowedtags), 1, -1,
'', 0, 1);
2479 $escapeonlyhtmltags = 1;
2480 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 1, 1, 0, array()), 0, 0,
'', $escapeonlyhtmltags, 1);
2505 return htmlspecialchars($s, ENT_HTML5,
'UTF-8');
2525function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2528 if (preg_match(
'/^common([a-z,]*)/', $noescapetags, $reg)) {
2529 $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';
2531 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2532 if (!empty($reg[1])) {
2533 $noescapetags .= $reg[1];
2536 if ($cleanalsojavascript) {
2541 if ($escapeonlyhtmltags) {
2542 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2549 $tmp = (
string) $stringtoescape;
2552 $tmp = str_ireplace(
'<',
'__DONOTDECODELT', $tmp);
2553 $tmp = str_ireplace(
'>',
'__DONOTDECODEGT', $tmp);
2554 $tmp = str_ireplace(
'&',
'__DONOTDECODEAMP', $tmp);
2555 $tmp = str_ireplace(
'"',
'__DONOTDECODEQUOT', $tmp);
2556 $tmp = str_ireplace(
'&apos',
'__DONOTDECODEAPOS', $tmp);
2557 $tmp = str_ireplace(
''',
'__DONOTDECODE39', $tmp);
2559 $tmp = html_entity_decode((
string) $tmp, ENT_COMPAT,
'UTF-8');
2562 $tmp = str_ireplace(
'__DONOTDECODELT',
'<', $tmp);
2563 $tmp = str_ireplace(
'__DONOTDECODEGT',
'>', $tmp);
2564 $tmp = str_ireplace(
'__DONOTDECODEAMP',
'&', $tmp);
2565 $tmp = str_ireplace(
'__DONOTDECODEQUOT',
'"', $tmp);
2566 $tmp = str_ireplace(
'__DONOTDECODEAPOS',
'&apos', $tmp);
2567 $tmp = str_ireplace(
'__DONOTDECODE39',
''', $tmp);
2569 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE__', $tmp);
2572 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2575 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2576 } elseif ($keepn == -1) {
2577 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2580 if ($escapeonlyhtmltags) {
2581 $tmp = htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2585 $tmparrayoftags = array();
2586 if ($noescapetags) {
2587 $tmparrayoftags = explode(
',', $noescapetags);
2590 if (count($tmparrayoftags)) {
2595 $tmp = str_ireplace(array(
'__DOUBLEQUOTE',
'__BEGINTAGTOREPLACE',
'__ENDTAGTOREPLACE',
'__BEGINENDTAGTOREPLACE'),
'', $tmp);
2597 foreach ($tmparrayoftags as $tagtoreplace) {
2599 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
'>/',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2600 $tmp = str_ireplace(
'</' . $tagtoreplace .
'>',
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2601 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
' \/>/',
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2607 $tmp = preg_replace_callback(
2608 '/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)>/',
2613 static function ($reg) use ($tagtoreplace) {
2615 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2616 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE__', $tmpattributes);
2617 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2619 return '__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__';
2625 $tmp = str_ireplace(
'&',
'__ANDNOSEMICOLON__', $tmp);
2626 $tmp = str_ireplace(
'"',
'__DOUBLEQUOTENOSEMICOLON__', $tmp);
2627 $tmp = str_ireplace(
'<',
'__LESSTHAN__', $tmp);
2628 $tmp = str_ireplace(
'>',
'__GREATERTHAN__', $tmp);
2632 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2636 if (count($tmparrayoftags)) {
2638 foreach ($tmparrayoftags as $tagtoreplace) {
2639 $result = str_ireplace(
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
'>', $result);
2640 $result = preg_replace(
'/__BEGINTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1>', $result);
2641 $result = str_ireplace(
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__',
'</' . $tagtoreplace .
'>', $result);
2642 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
' />', $result);
2643 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1 />', $result);
2646 $result = str_ireplace(
'__DOUBLEQUOTE__',
'"', $result);
2648 $result = str_ireplace(
'__ANDNOSEMICOLON__',
'&', $result);
2649 $result = str_ireplace(
'__DOUBLEQUOTENOSEMICOLON__',
'"', $result);
2650 $result = str_ireplace(
'__LESSTHAN__',
'<', $result);
2651 $result = str_ireplace(
'__GREATERTHAN__',
'>', $result);
2654 $result = str_ireplace(
'__SIMPLEQUOTE__',
''', $result);
2671 if (function_exists(
'mb_strtolower')) {
2672 return mb_strtolower($string, $encoding);
2674 return strtolower($string);
2688 if (function_exists(
'mb_strtoupper')) {
2689 return mb_strtoupper($string, $encoding);
2691 return strtoupper($string);
2705 if (function_exists(
'mb_substr')) {
2706 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding) . mb_substr($string, 1,
null, $encoding);
2708 return ucfirst($string);
2722 if (function_exists(
'mb_convert_case')) {
2723 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2725 return ucwords($string);
2737 $backtrace = debug_backtrace();
2739 if (count($backtrace) >= 1) {
2741 if (count($backtrace) == 1) {
2744 $trace = $backtrace[$pos];
2745 if (isset($trace[
'file'], $trace[
'line'])) {
2746 $msg =
" From {$trace['file']}:{$trace['line']}.";
2774function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2776 global
$conf, $user, $debugbar;
2784 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2785 global $website, $websitekey;
2786 if (is_object($website) && !empty($website->ref)) {
2787 $suffixinfilename .=
'_website_' . $website->ref;
2788 } elseif (!empty($websitekey)) {
2789 $suffixinfilename .=
'_website_' . $websitekey;
2794 if (defined(
'USESUFFIXINLOG')) {
2795 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2799 foreach (
$conf->loghandlers as $loghandlerinstance) {
2800 $loghandlerinstance->setIdent($ident);
2804 if (!empty($message)) {
2807 $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');
2809 if (!array_key_exists($level, $logLevels)) {
2810 dol_syslog(
'Error Bad Log Level ' . $level, LOG_ERR);
2818 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2822 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2823 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))
2825 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2826 $osuser =
" " . sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2828 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S") .
" " . sprintf(
"%-7s", $logLevels[$level]) .
" " . $ospid .
" " . $osuser .
" " . $message;
2834 print
"\n\n<!-- Log start\n";
2836 print
"Log end -->\n";
2840 'message' => $message,
2841 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
''),
2843 'user' => ((is_object($user) && $user->id) ? $user->login :
''),
2845 'osuser' => function_exists(
'posix_getuid') ? (
string) posix_getuid() :
'',
2846 'ospid' => (
string) getmypid()
2851 if (!empty($remoteip)) {
2852 $data[
'ip'] = $remoteip;
2856 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
2857 $tmpips = explode(
',', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
2861 foreach ($tmpips as $tmpip) {
2862 $tmpip = trim($tmpip);
2863 if (strtolower($tmpip) == strtolower($remoteip)) {
2866 if (empty($data[
'ip'])) {
2867 $data[
'ip'] = $tmpip;
2870 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2873 if (!$foundremoteip) {
2875 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2877 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2878 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP'])) {
2879 $tmpips = explode(
',', $_SERVER[
'HTTP_CLIENT_IP']);
2883 foreach ($tmpips as $tmpip) {
2884 $tmpip = trim($tmpip);
2885 if (strtolower($tmpip) == strtolower($remoteip)) {
2888 if (empty($data[
'ip'])) {
2889 $data[
'ip'] = $tmpip;
2892 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2895 if (!$foundremoteip) {
2897 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2899 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2901 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2903 $data[
'ip'] = (
string) $_SERVER[
'SERVER_ADDR'];
2904 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2906 $data[
'ip'] = (
string) $_SERVER[
'COMPUTERNAME'];
2908 $data[
'ip'] =
'???';
2911 if (!empty($_SERVER[
'USERNAME'])) {
2913 $data[
'osuser'] = (
string) $_SERVER[
'USERNAME'];
2914 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2916 $data[
'osuser'] = (
string) $_SERVER[
'LOGNAME'];
2920 foreach (
$conf->loghandlers as $loghandlerinstance) {
2921 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2924 $loghandlerinstance->export($data, $suffixinfilename);
2930 foreach (
$conf->loghandlers as $loghandlerinstance) {
2931 $loghandlerinstance->setIdent($ident);
2953 $templatenameforexport = $website->name_template;
2954 if (empty($templatenameforexport)) {
2955 $templatenameforexport =
'website_' . $website->ref;
2959 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="' .
dol_escape_htmltag($buttonstring) .
'"/>';
2962 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2963 $out .=
'jQuery(document).ready(function () {';
2964 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2965 $out .=
' var dialogHtml = \'';
2967 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2968 $dialogcontent .=
' <div style="margin-top: 20px;">';
2969 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>' . $langs->trans(
"ExportSiteLabel") .
'...</label><br>';
2970 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2971 $dialogcontent .=
' </div>';
2972 $dialogcontent .=
' <br>';
2973 $dialogcontent .=
' <div style="margin-top: 20px;">';
2974 $dialogcontent .=
' <strong>' . $langs->trans(
"ExportSiteGitLabel") .
' ' . $form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'') .
'</strong><br>';
2975 $dialogcontent .=
' <form action="' .
dol_escape_htmltag($overwriteGitUrl) .
'" method="POST">';
2976 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2977 $dialogcontent .=
' <input type="hidden" name="token" value="' .
newToken() .
'">';
2978 $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>';
2979 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2980 $dialogcontent .=
' </form>';
2981 $dialogcontent .=
' </div>';
2982 $dialogcontent .=
' </div>';
2989 // Add the content of the dialog to the body of the page
2990 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2991 $out .= ' if ($dialog.length > 0) {
2994 jQuery(
"body").append(dialogHtml);
';
2996 // Configuration of popup
2997 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2998 $out .= ' autoOpen:
false,
';
2999 $out .= ' modal:
true,
';
3000 $out .= ' height: 290,
';
3001 $out .= ' width:
"40%",
';
3002 $out .= ' title:
"' . dol_escape_js($label) . '",
';
3005 // Simulate a click on the original "submit" input to export the site.
3006 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
3007 $out .= ' console.log(
"Clic on exportsite.");
';
3008 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
3009 $out .= ' console.log(
"element founded:", target.length > 0);
';
3010 $out .= ' if (target.length > 0) { target.click(); }
';
3011 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
3015 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
3016 $out .= ' return false;
';
3019 $out .= '</script>
';
3041function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $jsonclose = '', $accesskey = '')
3045 if (strpos($url, '?
') > 0) {
3046 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3048 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3051 if (preg_match('/^https/i
', $url)) {
3054 $urltoopen = DOL_URL_ROOT . $url;
3059 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
3060 $out .= '<!-- a link
for button to open url into a dialog popup -->
';
3061 $out .= '<a
' . ($accesskey ? ' accesskey=
"' . $accesskey . '"' : '') . ' class=
"cursorpointer reposition button_' . $name . ($morecss ? ' ' . $morecss : '') . '"' . $disabled . ' title=
"' . dol_escape_htmltag($label) . '"';
3062 if (empty($conf->use_javascript_ajax)) {
3063 $out .= ' href=
"' . $urltoopen . '" target=
"_blank"';
3064 } elseif ($jsonopen) {
3065 $out .= ' href=
"#" onclick=
"' . $jsonopen . '"';
3067 $out .= ' href=
"#"';
3069 $out .= '>
' . $buttonstring . '</a>
';
3071 if (!empty($conf->use_javascript_ajax)) {
3072 // Add code to open url using the popup.
3073 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
3074 $out .= '<div
id=
"idfordialog' . $name . '" class=
"hidden">
' . (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '') . '</div>
';
3076 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
3077 $out .= '<script nonce=
"' . getNonce() . '" type=
"text/javascript">
3078 jQuery(document).ready(
function () {
3079 jQuery(
".button_' . $name . '").click(
function () {
3080 console.log(\
'Open popup with jQuery(...).dialog() on URL ' .
dol_escape_js($urltoopen) .
'\');
3081 var $tmpdialog = $(\
'#idfordialog' . $name .
'\');
3082 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog' . $name .
'" style="border: 0px;" src="' . $urltoopen .
'" width="100%" height="98%"></iframe>\');
3086 height: (window.innerHeight - 150),
3089 open: function (event, ui) {
3090 console.log(
"open popup name=' . $name . '");
3092 close:
function (event, ui) {
3093 console.log(
"Popup is closed, run jsonclose = ' . $jsonclose . '");
3094 ' . (empty($jsonclose) || preg_match('/^TODO/
', $jsonclose) ? '' : $jsonclose . ';
') . '
3098 $tmpdialog.dialog(\
'open\');
3123function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
3125 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
3145function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0, $morecssdiv =
'')
3147 global
$conf, $langs, $hookmanager;
3151 if (!empty(
$conf->dol_optimize_smallscreen)) {
3155 $out =
"\n" .
'<!-- dol_fiche_head - dol_get_fiche_head -->';
3157 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3158 $out .=
'<div class="tabs' . ($picto ?
'' :
' nopaddingleft') .
'" data-role="controlgroup" data-type="horizontal">' .
"\n";
3162 if ($morehtmlright) {
3163 $out .=
'<div class="inline-block floatright tabsElem">' . $morehtmlright .
'</div>';
3170 if (is_array($links) && !empty($links)) {
3171 $keys = array_keys($links);
3173 $maxkey = max($keys);
3179 if (empty($limittoshow)) {
3182 if (!empty(
$conf->dol_optimize_smallscreen)) {
3190 for ($i = 0; $i <= $maxkey; $i++) {
3191 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3193 if ($i >= $limittoshow) {
3199 for ($i = 0; $i <= $maxkey; $i++) {
3200 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3206 if ($i < $limittoshow || $isactive) {
3208 $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])) .
' -->';
3210 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3211 if (!empty($links[$i][0])) {
3212 $out .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3214 $out .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3216 } elseif (!empty($links[$i][1])) {
3218 $out .=
'<div class="tab tab' . ($isactive ?
'active' :
'unactive') .
'" style="margin: 0 !important">';
3220 if (!empty($links[$i][0])) {
3221 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
3222 $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) .
'">';
3225 if ($displaytab == 0 && $picto) {
3226 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
3229 $out .= $links[$i][1];
3230 if (!empty($links[$i][0])) {
3231 $out .=
'</a>' .
"\n";
3233 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
3242 $outmore .=
'<div class="popuptabset wordwrap">';
3244 $outmore_content =
'';
3246 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3247 if (!empty($links[$i][0])) {
3248 $outmore_content .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3250 $outmore_content .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3252 } elseif (!empty($links[$i][1])) {
3253 $outmore_content .=
'<a' . (!empty($links[$i][2]) ?
' id="' . $links[$i][2] .
'"' :
'') .
' class="wordwrap inline-block' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">';
3254 $outmore_content .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
3255 $outmore_content .=
'</a>' .
"\n";
3257 if ($outmore_content !==
'') {
3258 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">' . $outmore_content .
'</div>';
3264 $displaytab = $i + 1;
3267 $outmore .=
'</div>';
3271 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
3272 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
3273 $widthofpopup = 240;
3275 $tabsname = $moretabssuffix;
3276 if (empty($tabsname)) {
3277 $tabsname = str_replace(
"@",
"", $picto);
3279 $out .=
'<div id="moretabs' . $tabsname .
'" class="inline-block tabsElem valignmiddle">';
3281 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="fa fa-angle-down"></span> <span class="opacitymedium">+' . $nbintab .
'</span></a></div>';
3283 $out .=
'<div id="moretabsList' . $tabsname .
'" style="width: ' . $widthofpopup .
'px; position: absolute; ' . $left .
': -999em; text-align: ' . $left .
'; margin:0px; padding:2px; z-index:10;">';
3286 $out .=
'<div></div>';
3289 $out .=
'<script nonce="' .
getNonce() .
'">';
3290 $out .=
"$('#moretabs" . $tabsname .
"').mouseenter( function() {
3291 var x = this.offsetLeft, y = this.offsetTop;
3292 console.log('mouseenter " . $left .
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
3293 if ((window.innerWidth - x) < " . ($widthofpopup + 10) .
") {
3294 $('#moretabsList" . $tabsname .
"').css('" . $right .
"','8px');
3296 $('#moretabsList" . $tabsname .
"').css('" . $left .
"','auto');
3299 $out .=
"$('#moretabs" . $tabsname .
"').mouseleave( function() { console.log('mouseleave " . $left .
"'); $('#moretabsList" . $tabsname .
"').css('" . $left .
"','-999em');});";
3300 $out .=
"</script>";
3303 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3307 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
3308 $out .=
"\n" .
'<div id="dragDropAreaTabBar" class="tabBar' . ($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'') . ($notab == -4 ?
'' :
' tabBarWithBottom'))));
3309 $out .= ($morecssdiv ?
' ' . $morecssdiv :
'');
3310 $out .=
'">' .
"\n";
3312 if (!empty($dragdropfile)) {
3313 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3316 $parameters = array(
'tabname' => $active,
'out' => $out);
3317 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
3319 $out = $hookmanager->resPrint;
3345 if (!$notab || $notab == -1) {
3346 return "\n</div>\n";
3371function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
3373 global
$conf, $form, $user, $langs, $hookmanager, $action;
3377 $maxvisiblephotos = 1;
3382 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
3385 $modulepart =
'unknown';
3387 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
3388 $modulepart =
$object->element;
3389 } elseif (
$object->element ==
'member') {
3390 $modulepart =
'memberphoto';
3391 } elseif (
$object->element ==
'user') {
3392 $modulepart =
'userphoto';
3395 if (class_exists(
"Imagick")) {
3396 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
3397 $modulepart =
$object->element;
3398 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
3399 $modulepart =
'ficheinter';
3400 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3401 $modulepart =
'contract';
3402 } elseif (
$object->element ==
'order_supplier') {
3403 $modulepart =
'supplier_order';
3404 } elseif (
$object->element ==
'invoice_supplier') {
3405 $modulepart =
'supplier_invoice';
3409 if (
$object->element ==
'product') {
3411 '@phan-var-force Product $object';
3413 $cssclass =
'photowithmargin photoref';
3414 $showimage =
$object->is_photo_available(
$conf->product->multidir_output[$entity]);
3416 if (
$conf->browser->layout ==
'phone') {
3417 $maxvisiblephotos = 1;
3419 $useLinkPathPhoto =
getDolGlobalInt(
'PRODUCT_USE_LINK_PATH_FOR_PHOTO');
3420 if ($showimage || $useLinkPathPhoto) {
3421 $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>';
3425 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3427 $nophoto =
'/public/theme/common/nophoto.png';
3428 $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>';
3431 } elseif (
$object->element ==
'category') {
3433 '@phan-var-force Categorie $object';
3435 $cssclass =
'photowithmargin photoref';
3436 $showimage =
$object->isAnyPhotoAvailable(
$conf->categorie->multidir_output[$entity]);
3438 if (
$conf->browser->layout ==
'phone') {
3439 $maxvisiblephotos = 1;
3442 $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>';
3446 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3448 $nophoto =
'/public/theme/common/nophoto.png';
3449 $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>';
3452 } elseif (
$object->element ==
'bom') {
3454 '@phan-var-force Bom $object';
3456 $cssclass =
'photowithmargin photoref';
3457 $showimage =
$object->is_photo_available(
$conf->bom->multidir_output[$entity]);
3459 if (
$conf->browser->layout ==
'phone') {
3460 $maxvisiblephotos = 1;
3463 $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>';
3467 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3469 $nophoto =
'/public/theme/common/nophoto.png';
3470 $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>';
3473 } elseif (
$object->element ==
'ticket') {
3475 $cssclass =
'photoref';
3477 '@phan-var-force Ticket $object';
3478 $showimage =
$object->is_photo_available(
$conf->ticket->multidir_output[$entity] .
'/' .
$object->ref);
3480 if (
$conf->browser->layout ==
'phone') {
3481 $maxvisiblephotos = 1;
3485 $showphoto =
$object->show_photos(
'ticket',
$conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
3487 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $showphoto .
'</div>';
3495 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3497 $nophoto =
img_picto(
'No photo',
'object_ticket');
3498 $morehtmlleft .=
'<!-- No photo to show -->';
3499 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3500 $morehtmlleft .= $nophoto;
3501 $morehtmlleft .=
'</div></div>';
3506 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3509 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3511 $dir_output = (empty(
$conf->$modulepart->multidir_output[$entity]) ?
$conf->$modulepart->dir_output :
$conf->$modulepart->multidir_output[$entity]) .
"/";
3512 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3514 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'') . $objectref;
3518 if (empty($subdir)) {
3519 $subdir =
'errorgettingsubdirofobject';
3522 $filepath = $dir_output . $subdir .
"/";
3524 $filepdf = $filepath . $objectref .
".pdf";
3525 $relativepath = $subdir .
'/' . $objectref .
'.pdf';
3528 $fileimage = $filepdf .
'_preview.png';
3529 $relativepathimage = $relativepath .
'_preview.png';
3531 $pdfexists = file_exists($filepdf);
3536 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3538 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3547 if ($pdfexists && !$error) {
3548 $heightforphotref = 80;
3549 if (!empty(
$conf->dol_optimize_smallscreen)) {
3550 $heightforphotref = 60;
3553 if (file_exists($fileimage)) {
3554 $phototoshow =
'<div class="photoref">';
3555 $phototoshow .=
'<img height="' . $heightforphotref .
'" class="photo photowithborder" src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=apercu' . $modulepart .
'&file=' . urlencode($relativepathimage) .
'">';
3556 $phototoshow .=
'</div>';
3559 } elseif (!$phototoshow) {
3560 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0);
3564 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3565 $morehtmlleft .= $phototoshow;
3566 $morehtmlleft .=
'</div>';
3570 if (empty($phototoshow)) {
3571 if (
$object->element ==
'action') {
3573 $cssclass =
'photorefcenter';
3574 $nophoto =
img_picto(
'No photo',
'title_agenda');
3577 $cssclass =
'photorefcenter';
3579 $prefix =
'object_';
3583 if (strpos($picto,
'fontawesome_') !==
false) {
3586 $nophoto =
img_picto(
'No photo', $prefix . $picto);
3588 $morehtmlleft .=
'<!-- No photo to show -->';
3589 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3590 $morehtmlleft .= $nophoto;
3591 $morehtmlleft .=
'</div></div>';
3596 $morehtmlref .=
'<div style="clear: both;"></div>';
3597 $morehtmlref .=
'<div class="smallimp refidno opacitymedium banner-object-technical-id">';
3598 $morehtmlref .= $langs->trans(
"TechnicalID") .
': ' . ((int)
$object->id);
3599 $morehtmlref .=
'</div>';
3605 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $form->showbarcode(
$object, 100,
'photoref valignmiddle') .
'</div>';
3608 if (
$object->element ==
'societe') {
3610 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3613 $morehtmlstatus .=
$object->getLibStatut(6);
3615 } elseif (
$object->element ==
'product') {
3618 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3619 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'status',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3621 $morehtmlstatus .=
'<span class="statusrefsell">' .
$object->getLibStatut(6, 0) .
'</span>';
3623 $morehtmlstatus .=
' ';
3625 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3626 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'status_buy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3628 $morehtmlstatus .=
'<span class="statusrefbuy">' .
$object->getLibStatut(6, 1) .
'</span>';
3630 } elseif (in_array(
$object->element, array(
'salary'))) {
3632 '@phan-var-force Salary $object';
3634 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3637 $morehtmlstatus .= $tmptxt;
3638 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3640 '@phan-var-force Facture|FactureFournisseur|CommonInvoice $object';
3641 if (!isset(
$object->alreadypaid)) {
3647 $tmptxt =
$object->getLibStatut(6, (
float)
$object->alreadypaid);
3648 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3649 $tmptxt =
$object->getLibStatut(5, (
float)
$object->alreadypaid);
3651 $morehtmlstatus .= $tmptxt;
3652 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3654 '@phan-var-force ChargeSociales|Loan|Tva $object';
3656 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3659 $morehtmlstatus .= $tmptxt;
3660 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3663 $morehtmlstatus .=
$object->getLibStatut(5);
3665 $morehtmlstatus .=
$object->getLibStatut(4);
3667 } elseif (
$object->element ==
'facturerec') {
3669 '@phan-var-force FactureRec $object';
3670 if (
$object->frequency == 0) {
3671 $morehtmlstatus .=
$object->getLibStatut(2);
3673 $morehtmlstatus .=
$object->getLibStatut(5);
3675 } elseif (
$object->element ==
'project_task') {
3677 $tmptxt =
$object->getLibStatut(4);
3678 $morehtmlstatus .= $tmptxt;
3679 } elseif (method_exists(
$object,
'getLibStatut')) {
3680 $tmptxt =
$object->getLibStatut(6);
3681 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3682 $tmptxt =
$object->getLibStatut(5);
3684 $morehtmlstatus .= $tmptxt;
3688 if (
isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3690 if (method_exists(
$object,
'getVentilExportCompta')) {
3691 $accounted =
$object->getVentilExportCompta(1);
3692 $langs->load(
"accountancy");
3693 $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>';
3698 if (!empty(
$object->name_alias)) {
3700 '@phan-var-force Societe $object';
3701 $morehtmlref .=
'<div class="refidno opacitymedium banner-object-name-alias">' .
dol_escape_htmltag(
$object->name_alias) .
'</div>';
3705 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3708 $morehtmlref .=
'<div class="refidno banner-object-label">' .
$object->label .
'</div>';
3712 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3715 $morehtmlref .=
'<div class="refidno refaddress">';
3716 $morehtmlref .= $moreaddress;
3717 $morehtmlref .=
'</div>';
3721 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3722 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3725 } elseif (empty($reshook)) {
3726 $morehtmlref .= $hookmanager->resPrint;
3727 } elseif ($reshook > 0) {
3728 $morehtmlref = $hookmanager->resPrint;
3737 print
'<div class="' . ($onlybanner ?
'arearefnobottom ' :
'arearef ') .
'heightref valignmiddle centpercent object-banner-tab-container" data-module-part="'.
dolPrintHTMLForAttribute($modulepart).
'">';
3738 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3740 print
'<div class="underrefbanner clearboth"></div>';
3752function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3756 if ($fieldrequired) {
3757 $ret .=
'<span class="fieldrequired">';
3759 $ret .=
'<label for="' . $fieldkey .
'">';
3760 $ret .= $langs->trans($langkey);
3762 if ($fieldrequired) {
3783 global $langs, $hookmanager;
3786 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3791 $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)));
3794 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3796 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3797 $ret .= (($ret && $town) ? $sep :
'') . $town;
3800 $ret .= ($ret ? ($town ?
", " : $sep) :
'') .
$object->state;
3803 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'') .
$object->zip;
3805 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3807 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3808 $ret .= ($ret ? $sep :
'') . $town;
3810 $ret .= ($ret ?
", " :
'') .
$object->state;
3813 $ret .= ($ret ? $sep :
'') .
$object->zip;
3815 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3817 $ret .= ($ret ? $sep :
'') .
$object->zip;
3818 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3819 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3821 $ret .= $sep .
$object->state;
3823 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3826 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3828 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3830 $ret .= ($ret ? $sep :
'') .
$object->zip;
3831 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3832 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3833 $ret .= (empty(
$object->state_code) ?
'' : (
' ' .
$object->state_code));
3836 $town = (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3837 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'') .
$object->zip) :
'';
3838 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')) . $town) :
'');
3839 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3840 $ret .= ($ret ?
", " :
'') .
$object->state;
3844 if (!is_object($outputlangs)) {
3845 $outputlangs = $langs;
3848 $langs->load(
"dict");
3849 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'') . $outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country" .
$object->country_code)));
3852 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3853 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3857 $ret .= $hookmanager->resPrint;
3874function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3876 if ((abs($ts) <= 0x7FFFFFFF)) {
3879 return 'Error date outside supported range';
3905function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false, $decorate = 0)
3907 global
$conf, $langs;
3914 if ($tzoutput ===
'auto') {
3915 $tzoutput = (empty(
$conf) ?
'tzserver' : (isset(
$conf->tzuserinputkey) ?
$conf->tzuserinputkey :
'tzserver'));
3920 $offsettz = $offsetdst = 0;
3923 if (is_string($tzoutput)) {
3924 if ($tzoutput ==
'tzserver') {
3926 $offsettzstring = @date_default_timezone_get();
3931 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3934 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
getDolGlobalString(
'MAIN_DOLIBARR_USER_TIMEZONE',
'UTC') : $_SESSION[
'dol_tz_string']);
3936 if (class_exists(
'DateTimeZone')) {
3938 $user_date_tz =
new DateTimeZone($offsettzstring);
3941 dol_syslog(
"DateInvalidTimeZoneException for timezone string '".$offsettzstring.
"'. Falling back to UTC.", LOG_ERR);
3942 $user_date_tz =
new DateTimeZone(
'UTC');
3944 $user_dt =
new DateTime();
3945 $user_dt->setTimezone($user_date_tz);
3946 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3947 $offsettz = $user_dt->getOffset();
3949 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3950 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3955 if (!is_object($outputlangs)) {
3956 $outputlangs = $langs;
3959 $format =
'daytextshort';
3964 $reduceformat = (!empty(
$conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3965 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3966 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3967 if ($formatwithoutreduce != $format) {
3968 $format = $formatwithoutreduce;
3974 if ($format ==
'day') {
3975 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") :
$conf->format_date_short);
3976 } elseif ($format ==
'hour') {
3977 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") :
$conf->format_hour_short);
3978 } elseif ($format ==
'hoursec') {
3979 $s1 = $outputlangs->trans(
"FormatDateShort");
3980 $s2 = $outputlangs->trans(
"FormatDateHourSecShort");
3981 $s3 = trim(preg_replace(
'/'.preg_quote($s1,
'/').
'/',
'', $s2));
3984 } elseif ($format ==
'hourduration') {
3985 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") :
$conf->format_hour_short_duration);
3986 } elseif ($format ==
'daytext') {
3987 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") :
$conf->format_date_text);
3988 } elseif ($format ==
'daytextshort') {
3989 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") :
$conf->format_date_text_short);
3990 } elseif ($format ==
'dayhour') {
3991 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") :
$conf->format_date_hour_short);
3992 } elseif ($format ==
'dayhoursec') {
3993 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") :
$conf->format_date_hour_sec_short);
3994 } elseif ($format ==
'dayhourtext') {
3995 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") :
$conf->format_date_hour_text);
3996 } elseif ($format ==
'dayhourtextshort') {
3997 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") :
$conf->format_date_hour_text_short);
3998 } elseif ($format ==
'dayhourlog') {
4000 $format =
'%Y%m%d%H%M%S';
4001 } elseif ($format ==
'dayhourlogsmall') {
4003 $format =
'%y%m%d%H%M';
4004 } elseif ($format ==
'dayhourldap') {
4005 $format =
'%Y%m%d%H%M%SZ';
4006 } elseif ($format ==
'dayhourxcard') {
4007 $format =
'%Y%m%dT%H%M%SZ';
4008 } elseif ($format ==
'dayxcard') {
4010 } elseif ($format ==
'dayrfc') {
4011 $format =
'%Y-%m-%d';
4012 } elseif ($format ==
'dayhourrfc') {
4013 $format =
'%Y-%m-%dT%H:%M:%SZ';
4014 } elseif ($format ==
'standard') {
4015 $format =
'%Y-%m-%d %H:%M:%S';
4018 if ($reduceformat) {
4019 $format = str_replace(
'%Y',
'%y', $format);
4020 $format = str_replace(
'yyyy',
'yy', $format);
4024 if (preg_match(
'/%b/i', $format)) {
4026 $format = str_replace(
'%b',
'__b__', $format);
4027 $format = str_replace(
'%B',
'__B__', $format);
4029 if (preg_match(
'/%a/i', $format)) {
4031 $format = str_replace(
'%a',
'__a__', $format);
4032 $format = str_replace(
'%A',
'__A__', $format);
4037 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)) {
4040 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
4044 $syear = (!empty($reg[1]) ? $reg[1] :
'');
4045 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
4046 $sday = (!empty($reg[3]) ? $reg[3] :
'');
4047 $shour = (!empty($reg[4]) ? $reg[4] :
'');
4048 $smin = (!empty($reg[5]) ? $reg[5] :
'');
4049 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
4051 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
4054 $tzo =
new DateTimeZone(
'UTC');
4056 $tzo =
new DateTimeZone(date_default_timezone_get());
4058 $dtts =
new DateTime();
4059 $dtts->setTimestamp($time);
4060 $dtts->setTimezone($tzo);
4061 $newformat = str_replace(
4062 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4063 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4066 $ret = $dtts->format($newformat);
4068 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4069 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4074 if ($time < 100000000000) {
4075 $dtts =
new DateTime();
4078 $timetouse = (int) $time + $offsettz + $offsetdst;
4080 $tzo =
new DateTimeZone(
'UTC');
4081 $dtts->setTimezone($tzo);
4082 $dtts->setTimestamp($timetouse);
4084 $timetouse = (int) $time + $offsettz + $offsetdst;
4086 $tzo =
new DateTimeZone(date_default_timezone_get());
4087 $dtts->setTimestamp($timetouse);
4088 $dtts->setTimezone($tzo);
4091 $newformat = str_replace(
4092 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4093 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4097 $ret = $dtts->format($newformat);
4100 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4101 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4105 $ret =
'Bad value ' . $time .
' for date';
4109 if (preg_match(
'/__b__/i', $format)) {
4110 $timetouse = $time + $offsettz + $offsetdst;
4113 $tzo =
new DateTimeZone(
'UTC');
4115 $tzo =
new DateTimeZone(date_default_timezone_get());
4117 $dtts =
new DateTime();
4118 $dtts->setTimestamp($timetouse);
4119 $dtts->setTimezone($tzo);
4120 $month = (int) $dtts->format(
"m");
4121 $month = sprintf(
"%02d", $month);
4122 if ($encodetooutput) {
4123 $monthtext = $outputlangs->transnoentities(
'Month' . $month);
4124 $monthtextshort = $outputlangs->transnoentities(
'MonthShort' . $month);
4126 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month' . $month);
4127 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort' . $month);
4130 $ret = str_replace(
'__b__', $monthtextshort, $ret);
4131 $ret = str_replace(
'__B__', $monthtext, $ret);
4135 if (preg_match(
'/__a__/i', $format)) {
4137 $timetouse = $time + $offsettz + $offsetdst;
4140 $tzo =
new DateTimeZone(
'UTC');
4142 $tzo =
new DateTimeZone(date_default_timezone_get());
4144 $dtts =
new DateTime();
4145 $dtts->setTimestamp($timetouse);
4146 $dtts->setTimezone($tzo);
4147 $w = $dtts->format(
"w");
4148 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day' . $w);
4150 $ret = str_replace(
'__A__', $dayweek, $ret);
4151 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
4155 $ret = preg_replace(
'/(\d\d:\d\d [AP]M)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4156 $ret = preg_replace(
'/(\d\d:\d\d)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4183function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
4185 if ($timestamp ===
'') {
4189 $datetimeobj =
new DateTime();
4190 $datetimeobj->setTimestamp($timestamp);
4191 if ($forcetimezone) {
4192 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
4195 'year' => ((
int) date_format($datetimeobj,
'Y')),
4196 'mon' => ((
int) date_format($datetimeobj,
'm')),
4197 'mday' => ((
int) date_format($datetimeobj,
'd')),
4198 'wday' => ((
int) date_format($datetimeobj,
'w')),
4199 'yday' => ((
int) date_format($datetimeobj,
'z')),
4200 'hours' => ((
int) date_format($datetimeobj,
'H')),
4201 'minutes' => ((
int) date_format($datetimeobj,
'i')),
4202 'seconds' => ((
int) date_format($datetimeobj,
's')),
4230function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
4235 if ($gm ===
'auto') {
4236 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
4241 if ($hour == -1 || empty($hour)) {
4244 if ($minute == -1 || empty($minute)) {
4247 if ($second == -1 || empty($second)) {
4253 if (!$month || !$day) {
4262 if ($hour < 0 || $hour > 24) {
4265 if ($minute < 0 || $minute > 60) {
4268 if ($second < 0 || $second > 60) {
4273 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
4274 $default_timezone = @date_default_timezone_get();
4275 $localtz =
new DateTimeZone($default_timezone);
4276 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
4278 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
4280 $localtz =
new DateTimeZone($default_timezone);
4282 dol_syslog(
"Warning dol_tz_string contains an invalid value " . json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
4283 $default_timezone = @date_default_timezone_get();
4285 } elseif (strrpos($gm,
"tz,") !==
false) {
4286 $timezone = (
string) str_replace(
"tz,",
"", $gm);
4288 $localtz =
new DateTimeZone($timezone);
4290 dol_syslog(
"Warning passed timezone contains an invalid value " . $timezone, LOG_WARNING);
4294 if (empty($localtz)) {
4295 $localtz =
new DateTimeZone(
'UTC');
4297 $dt =
new DateTime(
'now', $localtz);
4298 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
4299 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
4300 $date = $dt->getTimestamp();
4316function dol_now($mode =
'gmt')
4320 if ($mode ===
'auto') {
4324 if ($mode ==
'gmt') {
4326 } elseif ($mode ==
'tzserver') {
4327 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
4329 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
4334 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
4337 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
4338 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
4339 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
4356 global
$conf, $langs;
4359 if (!empty(
$conf->dol_optimize_smallscreen)) {
4364 if (empty($shortvalue) || $size < ($level * 10)) {
4366 $textunitshort = $langs->trans(
"b");
4367 $textunitlong = $langs->trans(
"Bytes");
4369 $ret = round($size / $level, 0);
4370 $textunitshort = $langs->trans(
"Kb");
4371 $textunitlong = $langs->trans(
"KiloBytes");
4374 if (empty($shortunit)) {
4375 $ret .=
' ' . $textunitlong;
4377 $ret .=
' ' . $textunitshort;
4393function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
4401 $linkstart =
'<a href="';
4402 if (!preg_match(
'/^http/i', $url)) {
4403 $linkstart .=
'http://';
4408 $linkstart .=
' target="' . $target .
'"';
4410 $linkstart .=
' title="' . $langs->trans(
"URL") .
': ' . $url .
'"';
4414 if (!preg_match(
'/^http/i', $url)) {
4421 if ($morecss ==
'float') {
4422 return '<div class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'') . $link .
'</div>';
4424 return $linkstart .
'<span class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'') . $link .
'</span>' . $linkend;
4441function dol_print_email($email, $contactid = 0, $socid = 0, $addlink = 0, $max = 0, $showinvalid = 2, $withpicto = 0, $morecss =
'paddingrightonly')
4443 global $user, $langs, $hookmanager;
4454 if (empty($email)) {
4458 if ($addlink == 1) {
4459 $newemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="';
4460 if (!preg_match(
'/^mailto:/i', $email)) {
4461 $newemail .=
'mailto:';
4463 $newemail .= $email;
4464 $newemail .=
'" target="_blank">';
4466 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4471 $newemail .= $email;
4473 $newemail .=
'</a>';
4476 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4477 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4480 $langs->load(
"errors");
4481 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $emailonly),
'',
'paddingrightonly');
4483 $langs->load(
"errors");
4484 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly),
'',
'paddingrightonly');
4488 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4490 $linktoaddaction =
'';
4492 $linktoaddaction =
'<a href="' . DOL_URL_ROOT .
'/comm/action/card.php?action=create&backtopage=1&actioncode=' . urlencode($type) .
'&contactid=' . ((int) $contactid) .
'&socid=' . ((int) $socid) .
'">' .
img_object($langs->trans(
"AddAction"),
"calendar") .
'</a>';
4494 if ($linktoaddaction) {
4495 $newemail =
'<div>' . $newemail .
' ' . $linktoaddaction .
'</div>';
4498 } elseif ($addlink ===
'thirdparty') {
4499 $tmpnewemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="' . DOL_URL_ROOT .
'/societe/card.php?socid=' . $socid .
'&action=presend&mode=init#formmailbeforetitle">';
4500 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4501 if ($withpicto == 1) {
4502 $tmpnewemail .= $newemail;
4504 $tmpnewemail .=
'</a>';
4506 $newemail = $tmpnewemail;
4508 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'') . $newemail;
4511 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4512 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4515 $langs->load(
"errors");
4516 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $email));
4518 $langs->load(
"errors");
4519 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly));
4533 $parameters = array(
'cid' => $contactid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
4535 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
4539 $rep .= $hookmanager->resPrint;
4561function dolOutputDates($datep, $datef =
null, $fullday = 0, $addseconds = 0, $pictotoadd =
'', $tzoutput =
'tzuserrel', $reduceformat = 0)
4564 if (empty($datef)) {
4572 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
4574 $s .=
'<div class="center inline-block">';
4575 if ($tmpa[
'hours'] != $tmpb[
'hours'] || $tmpa[
'minutes'] != $tmpb[
'minutes']) {
4577 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''), $tzoutput);
4579 if (empty($fullday)) {
4580 $s .=
'<br><span class="small opacitymedium">';
4581 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4582 $s .=
'-'.dol_print_date($datef,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4587 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''),
'tzuserrel');
4589 if (empty($fullday)) {
4590 $s .=
'<br><span class="small opacitymedium">';
4591 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4598 $s .=
'<div class="center inline-block dateborderright">';
4599 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''), $tzoutput);
4600 if (empty($fullday)) {
4601 $s .=
'<br><span class="small opacitymedium">';
4602 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4606 $s .=
'<div class="center inline-block dateborderleft">';
4607 $s .=
dol_print_date($datef,
'day'.($reduceformat ?
'reduceformat' :
''),
'tzuserrel');
4609 if (empty($fullday)) {
4610 $s .=
'<br><span class="small opacitymedium">';
4611 $s .=
dol_print_date($datef,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4630 $socialnetworks = array();
4632 require_once DOL_DOCUMENT_ROOT .
'/core/lib/memory.lib.php';
4636 if (!is_null($dataretrieved)) {
4637 $socialnetworks = $dataretrieved;
4639 $sql =
"SELECT rowid, code, label, url, icon, active FROM " . MAIN_DB_PREFIX .
"c_socialnetworks";
4640 $sql .=
" WHERE entity IN (" .
getEntity(
'c_socialnetworks').
")";
4642 $resql =
$db->query($sql);
4644 while ($obj =
$db->fetch_object($resql)) {
4645 $socialnetworks[$obj->code] = array(
4646 'rowid' => $obj->rowid,
4647 'label' => $obj->label,
4649 'icon' => $obj->icon,
4650 'active' => $obj->active,
4657 return (is_array($socialnetworks) ? $socialnetworks : array());
4672 global $hookmanager, $langs, $user;
4676 if (empty($value)) {
4680 if (!empty($type)) {
4681 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4683 $htmllink .=
'<span class="fab pictofixedwidth ' . ($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link') .
'"></span>';
4684 if ($type ==
'skype') {
4686 $htmllink .=
' <a href="skype:';
4688 $htmllink .=
'?call" alt="' . $langs->trans(
"Call") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Call") .
' ' . $value) .
'">';
4689 $htmllink .=
'<img src="' . DOL_URL_ROOT .
'/theme/common/skype_callbutton.png" border="0">';
4690 $htmllink .=
'</a><a href="skype:';
4692 $htmllink .=
'?chat" alt="' . $langs->trans(
"Chat") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Chat") .
' ' . $value) .
'">';
4693 $htmllink .=
'<img class="paddingleft" src="' . DOL_URL_ROOT .
'/theme/common/skype_chatbutton.png" border="0">';
4694 $htmllink .=
'</a>';
4695 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4696 $addlink =
'AC_SKYPE';
4699 $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>';
4701 $htmllink .= ($link ?
' ' . $link :
'');
4704 if (!empty($dictsocialnetworks[$type][
'url'])) {
4705 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4706 if ($tmpvirginurl) {
4707 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4708 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4710 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4711 if ($tmpvirginurl3) {
4712 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4713 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4716 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4717 if ($tmpvirginurl2) {
4718 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4719 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4722 if (preg_match(
'/^https?:\/\//i', $value)) {
4725 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4727 $valuetoshow = $value;
4728 $valuetoshow = preg_replace(
'/https:\/\/www\.(twitter|x|linkedin)\.com\/?/',
'', $valuetoshow);
4729 if (preg_match(
'/^https?:\/\//i', $link)) {
4738 $htmllink .=
'</div>';
4740 $langs->load(
"errors");
4741 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4745 $parameters = array(
4747 'cid' => $contactid,
4750 'dictsocialnetworks' => $dictsocialnetworks,
4753 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4757 $htmllink .= $hookmanager->resPrint;
4772function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4776 if (empty($profID) || empty($profIDtype)) {
4779 if (empty($countrycode)) {
4780 $countrycode =
$mysoc->country_code;
4782 $newProfID = $profID;
4783 $id = substr($profIDtype, -1);
4785 if (strtoupper($countrycode) ==
'FR') {
4791 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3);
4795 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3) .
' ' . substr($newProfID, 9, 5);
4799 $newProfID = substr($newProfID, 0, 2) .
'.' . substr($newProfID, 2, 3);
4801 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4803 $newProfID = substr($newProfID, 0, 4) .
' ' . substr($newProfID, 4, 3) .
' ' . substr($newProfID, 7, 3) .
' ' . substr($newProfID, 10, 3);
4806 if (!empty($addcpButton)) {
4829function dol_print_phone($phone, $countrycode =
'', $contactid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4831 global
$conf, $user, $langs,
$mysoc, $hookmanager;
4834 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4835 if (empty($phone)) {
4841 if (empty($countrycode) && is_object(
$mysoc)) {
4842 $countrycode =
$mysoc->country_code;
4846 if (!empty(
$conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4851 $newphonewa = $phone;
4852 if (strtoupper($countrycode) ==
"FR") {
4855 $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);
4857 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 2);
4859 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 2) . $separ . substr($newphone, 7, 2);
4861 $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);
4863 $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);
4865 $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);
4867 } elseif (strtoupper($countrycode) ==
"CA") {
4869 $newphone = ($separ !=
'' ?
'(' :
'') . substr($newphone, 0, 3) . ($separ !=
'' ?
')' :
'') . $separ . substr($newphone, 3, 3) . ($separ !=
'' ?
'-' :
'') . substr($newphone, 6, 4);
4871 } elseif (strtoupper($countrycode) ==
"PT") {
4873 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4875 } elseif (strtoupper($countrycode) ==
"SR") {
4877 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3);
4879 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
4881 } elseif (strtoupper($countrycode) ==
"DE") {
4883 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 4) . $separ . substr($newphone, 11, 3);
4885 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 4) . $separ . substr($newphone, 10, 3);
4887 } elseif (strtoupper($countrycode) ==
"ES") {
4889 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4891 } elseif (strtoupper($countrycode) ==
"BF") {
4893 $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);
4895 } elseif (strtoupper($countrycode) ==
"RO") {
4897 $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);
4899 } elseif (strtoupper($countrycode) ==
"TR") {
4901 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4903 } elseif (strtoupper($countrycode) ==
"US") {
4905 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4907 } elseif (strtoupper($countrycode) ==
"MX") {
4909 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4911 $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);
4913 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4915 } elseif (strtoupper($countrycode) ==
"ML") {
4917 $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);
4919 } elseif (strtoupper($countrycode) ==
"TH") {
4921 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4923 $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);
4925 } elseif (strtoupper($countrycode) ==
"MU") {
4928 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2);
4930 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
4932 } elseif (strtoupper($countrycode) ==
"ZA") {
4934 $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);
4936 } elseif (strtoupper($countrycode) ==
"SY") {
4938 $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);
4940 $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);
4942 } elseif (strtoupper($countrycode) ==
"AE") {
4944 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4946 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4948 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 4);
4950 } elseif (strtoupper($countrycode) ==
"DZ") {
4952 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4954 } elseif (strtoupper($countrycode) ==
"BE") {
4956 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4958 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4960 } elseif (strtoupper($countrycode) ==
"PF") {
4962 $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);
4964 } elseif (strtoupper($countrycode) ==
"CO") {
4966 $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);
4968 } elseif (strtoupper($countrycode) ==
"JO") {
4970 $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);
4972 } elseif (strtoupper($countrycode) ==
"JM") {
4974 $newphone = substr($newphone, 0, 5) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4976 } elseif (strtoupper($countrycode) ==
"MG") {
4978 $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);
4980 } elseif (strtoupper($countrycode) ==
"GB") {
4982 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4984 } elseif (strtoupper($countrycode) ==
"CH") {
4986 $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);
4988 $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);
4990 } elseif (strtoupper($countrycode) ==
"TN") {
4992 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4994 } elseif (strtoupper($countrycode) ==
"GF") {
4996 $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);
4998 } elseif (strtoupper($countrycode) ==
"GP") {
5000 $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);
5002 } elseif (strtoupper($countrycode) ==
"MQ") {
5004 $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);
5006 } elseif (strtoupper($countrycode) ==
"IT") {
5008 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
5010 $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);
5012 } elseif (strtoupper($countrycode) ==
"AU") {
5016 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 1) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 4);
5018 } elseif (strtoupper($countrycode) ==
"LU") {
5021 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2);
5023 $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);
5025 $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);
5027 $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);
5029 } elseif (strtoupper($countrycode) ==
"PE") {
5032 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4);
5034 $newphonewa =
'+51' . $newphone;
5035 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 10, 3);
5037 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 8, 4);
5039 $newphonewa = $newphone;
5040 $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);
5042 } elseif (strtoupper($countrycode) ==
"IN") {
5044 if ($withpicto ==
'phone') {
5045 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 4) . $separ . substr($newphone, 9, 4);
5047 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 5) . $separ . substr($newphone, 8, 5);
5052 $newphoneastart = $newphoneaend =
'';
5053 if (!empty($addlink)) {
5055 $newphoneastart =
'<a href="tel:' . urlencode($phone) .
'">';
5056 $newphoneaend .=
'</a>';
5057 } elseif (
isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
5058 if (empty($user->clicktodial_loaded)) {
5059 $user->fetch_clicktodial();
5063 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
5064 if (!empty($user->clicktodial_url)) {
5065 $urlmask = $user->clicktodial_url;
5068 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
5069 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
5070 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
5072 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
5074 $substitarray = array(
5075 '__PHONEFROM__' => $clicktodial_poste,
5076 '__PHONETO__' => urlencode($phone),
5077 '__LOGIN__' => $clicktodial_login,
5078 '__PASS__' => $clicktodial_password
5083 $newphoneastart =
'<a href="' . $url .
'" class="cssforclicktodial">';
5084 $newphoneaend =
'</a>';
5087 $newphoneastart =
'<a href="' . $url .
'"';
5089 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
5091 $newphoneastart .=
'>';
5092 $newphoneaend .=
'</a>';
5097 if (
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
5099 $addlinktoagenda =
'';
5100 if ($addlink ==
'AC_FAX') {
5104 $addlinktoagenda =
'<a href="' . DOL_URL_ROOT .
'/comm/action/card.php?action=create&backtopage=' . urlencode($_SERVER[
'REQUEST_URI']) .
'&actioncode=' . $type . ($contactid ?
'&contactid=' . $contactid :
'') . ($socid ?
'&socid=' . $socid :
'') .
'">' .
img_object($langs->trans(
"AddAction"),
"calendar") .
'</a>';
5106 if ($addlinktoagenda) {
5107 $newphone =
'<span>' . $newphone .
' ' . $addlinktoagenda .
'</span>';
5112 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
5114 $newphone .=
' <a href="https://wa.me/' . $newphonewa .
'" target="_blank"';
5115 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
5118 if (empty($titlealt)) {
5119 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
5124 $parameters = array(
'countrycode' => $countrycode,
'cid' => $contactid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
5125 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
5126 $rep .= $hookmanager->resPrint;
5128 if (empty($reshook)) {
5131 if ($withpicto ==
'fax') {
5132 $picto =
'phoning_fax';
5133 } elseif ($withpicto ==
'phone') {
5135 } elseif ($withpicto ==
'mobile') {
5136 $picto =
'phoning_mobile';
5141 if ($adddivfloat == 1) {
5142 $rep .=
'<div class="nospan float' . ($morecss ?
' ' . $morecss :
'') .
'">';
5143 } elseif (empty($adddivfloat)) {
5144 $rep .=
'<span' . ($morecss ?
' class="' . $morecss .
'"' :
'') .
'>';
5147 $rep .= $newphoneastart;
5148 $rep .= ($withpicto ?
img_picto($titlealt, $picto) :
'');
5149 if ($separ !=
'hidenum') {
5150 $rep .= ($withpicto ?
' ' :
'') . $newphone;
5152 $rep .= $newphoneaend;
5154 if ($adddivfloat == 1) {
5156 } elseif (empty($adddivfloat)) {
5177 if (!isset(
$conf->cache[
'resolveips'])) {
5178 $conf->cache[
'resolveips'] = array();
5184 if (file_exists(DOL_DOCUMENT_ROOT .
'/theme/common/flags/' . $countrycode .
'.png')) {
5187 $ret .=
'(' . $countrycode .
')';
5195 if (in_array($mode, [0, 2])) {
5198 if (!array_key_exists($ip,
$conf->cache[
'resolveips'])) {
5199 $domain = gethostbyaddr($ip);
5200 $conf->cache[
'resolveips'][$ip] = $domain;
5202 $domain =
$conf->cache[
'resolveips'][$ip];
5230 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5237 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
5238 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
5239 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
5240 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5242 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
5245 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_CLIENT_IP']);
5248 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
5268 $datafile = $diroffile .
'/' .
getDolGlobalString(
'GEOIPMAXMIND_COUNTRY_DATAFILE_EMBEDDED');
5274 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5275 $geoip =
new DolGeoIP(
'country', $datafile);
5277 $countrycode = $geoip->getCountryCodeFromIP($ip);
5284 return $countrycode;
5296 global
$conf, $langs, $user;
5305 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5306 $geoip =
new DolGeoIP(
'country', $datafile);
5307 $countrycode = $geoip->getCountryCodeFromIP($ip);
5308 $ret = $countrycode;
5327 global $hookmanager;
5333 $parameters = array(
'element' => $element,
'id' =>
$id);
5334 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
5335 $out .= $hookmanager->resPrint;
5337 if (empty($reshook)) {
5338 if (empty($charfornl)) {
5339 $out .= nl2br((
string) $address);
5341 $out .= preg_replace(
'/[\r\n]+/', $charfornl, (
string) $address);
5345 $showgmap = $showomap = 0;
5371 $url =
dol_buildpath(
'/google/gmaps.php?mode=' . $element .
'&id=' .
$id, 1);
5372 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5375 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode=' . $element .
'&id=' .
$id, 1);
5376 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'_openstreetmap" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5398function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
5400 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
5403 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
5406 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
5424 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
5425 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
5428 if (function_exists(
'getmxrr')) {
5431 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
5432 if (count($mxhosts) > 1) {
5435 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
5472 $tmparray = explode(
' ', $s);
5473 foreach ($tmparray as $tmps) {
5488function dol_strlen($string, $stringencoding =
'UTF-8')
5490 if (is_null($string)) {
5494 if (function_exists(
'mb_strlen')) {
5495 return mb_strlen($string, $stringencoding);
5497 return strlen($string);
5511function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
5515 if (empty($stringencoding)) {
5516 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
5520 if (empty($trunconbytes)) {
5521 if (function_exists(
'mb_substr')) {
5522 $ret = mb_substr($string, $start, $length, $stringencoding);
5524 $ret = substr($string, $start, $length);
5527 if (function_exists(
'mb_strcut')) {
5528 $ret = mb_strcut($string, $start, $length, $stringencoding);
5530 $ret = substr($string, $start, $length);
5550function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
5558 if (empty($stringencoding)) {
5559 $stringencoding =
'UTF-8';
5562 if (!empty(
$conf->dol_optimize_smallscreen) &&
$conf->dol_optimize_smallscreen == 1 && $display == 1) {
5563 $size = round($size / 3);
5567 if ($trunc ==
'right') {
5569 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5571 return dol_substr($newstring, 0, $size, $stringencoding) . ($nodot ?
'' :
'…');
5576 } elseif ($trunc ==
'middle') {
5578 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5579 $size1 = (int) round($size / 2);
5580 $size2 = (int) round($size / 2);
5581 return dol_substr($newstring, 0, $size1, $stringencoding) .
'…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
5585 } elseif ($trunc ==
'left') {
5587 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5589 return '…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
5593 } elseif ($trunc ==
'wrap') {
5595 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5601 return 'BadParam3CallingDolTrunc';
5615 $type2picto = array(
5616 'varchar' =>
'font',
5619 'int' =>
'sort-numeric-down',
5620 'double' =>
'sort-numeric-down',
5621 'price' =>
'currency',
5622 'pricecy' =>
'multicurrency',
5623 'password' =>
'key',
5624 'boolean' =>
'check-square',
5625 'date' =>
'calendar',
5626 'datetime' =>
'calendar',
5627 'duration' =>
'hourglass',
5633 'sellist' =>
'list',
5634 'stars' =>
'fontawesome_star_fas',
5635 'radio' =>
'check-circle',
5636 'checkbox' =>
'list',
5637 'chkbxlst' =>
'list',
5639 'icon' =>
"question",
5640 'point' =>
"country",
5641 'multipts' =>
'country',
5642 'linestrg' =>
"country",
5643 'polygon' =>
"country",
5644 'separate' =>
'minus'
5647 if (!empty($type2picto[$key])) {
5648 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5651 return img_picto(
'',
'generic',
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5678function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2, $allowothertags = array())
5683 $url = DOL_URL_ROOT;
5684 $theme = isset(
$conf->theme) ?
$conf->theme :
null;
5685 $path =
'theme/' . $theme;
5686 if (empty($picto)) {
5691 if ($pictoisfullpath) {
5693 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5696 $fullpathpicto = $picto;
5698 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5699 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5700 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5705 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5706 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5707 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5710 $pictoconvertkey = array(
5711 'facture' =>
'bill',
5712 'shipping' =>
'shipment',
5713 'fichinter' =>
'intervention',
5714 'agenda' =>
'calendar',
5715 'invoice_supplier' =>
'supplier_invoice',
5716 'order_supplier' =>
'supplier_order');
5717 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5718 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5721 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5723 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5724 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5727 if ($pictowithouttext ==
'file-o') {
5728 $pictowithouttext =
'file';
5731 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5732 $marginleftonlyshort = 0;
5734 if (!empty($pictowithouttextarray[1])) {
5736 $fakey =
'fa-' . $pictowithouttextarray[0];
5737 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5738 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5739 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5741 $fakey =
'fa-' . $pictowithouttext;
5751 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5752 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5753 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5755 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5756 $morestyle = $reg[1];
5757 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5759 $moreatt = trim($moreatt);
5761 $enabledisablehtml =
'<span class="' . $faprefix .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5762 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5763 $enabledisablehtml .=
'</span>';
5765 return $enabledisablehtml;
5768 if (empty($srconly) && !preg_match(
'/[\.\/@]/', $picto)) {
5769 $fakey = $pictowithouttext;
5773 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'))) {
5776 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'))) {
5782 if ($pictowithouttext ==
'off') {
5783 $fakey =
'fa-square';
5785 } elseif ($pictowithouttext ==
'on') {
5786 $fakey =
'fa-check-square';
5788 } elseif ($pictowithouttext ==
'listlight') {
5789 $fakey =
'fa-download';
5790 $marginleftonlyshort = 1;
5791 } elseif ($pictowithouttext ==
'printer') {
5792 $fakey =
'fa-print';
5794 } elseif ($pictowithouttext ==
'note') {
5795 $fakey =
'fa-sticky-note';
5796 $marginleftonlyshort = 1;
5797 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5798 $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');
5799 $fakey =
'fa-' . $convertarray[$pictowithouttext];
5800 if (preg_match(
'/selected/', $pictowithouttext)) {
5803 $marginleftonlyshort = 1;
5804 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5805 $fakey =
'fa-' . $arrayconvpictotofa[$pictowithouttext];
5807 $fakey =
'fa-' . $pictowithouttext;
5810 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5811 $morecss .=
' em092';
5813 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'eventorganization',
'holiday',
'info',
'info_black',
'project',
'workstation'))) {
5814 $morecss .=
' em088';
5816 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5817 $morecss .=
' em080';
5821 $arrayconvpictotomarginleftonly = array(
5851 '1uparrow_selected',
5852 '1downarrow_selected',
5853 '1leftarrow_selected',
5854 '1rightarrow_selected'
5856 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5857 $marginleftonlyshort = 0;
5861 $arrayconvpictotomorcess = array(
5862 'action' =>
'infobox-action',
5863 'account' =>
'infobox-bank_account',
5864 'accounting_account' =>
'infobox-bank_account',
5865 'accountline' =>
'infobox-bank_account',
5866 'accountancy' =>
'infobox-bank_account',
5867 'admin' =>
'opacitymedium',
5868 'asset' =>
'infobox-bank_account',
5869 'bank_account' =>
'infobox-bank_account',
5870 'bill' =>
'infobox-commande',
5871 'billa' =>
'infobox-commande',
5872 'billr' =>
'infobox-commande',
5873 'billd' =>
'infobox-commande',
5874 'bookcal' =>
'infobox-portal',
5875 'margin' =>
'infobox-bank_account',
5876 'conferenceorbooth' =>
'infobox-project',
5877 'cash-register' =>
'infobox-portal',
5878 'contract' =>
'infobox-contrat',
5879 'check' =>
'font-status4',
5880 'conversation' =>
'infobox-contrat',
5881 'donation' =>
'infobox-commande',
5882 'dolly' =>
'infobox-commande',
5883 'dollyrevert' =>
'flip infobox-order_supplier',
5884 'ecm' =>
'infobox-action',
5885 'eventorganization' =>
'infobox-project',
5886 'hrm' =>
'infobox-adherent',
5887 'group' =>
'infobox-adherent',
5888 'intervention' =>
'infobox-contrat',
5889 'incoterm' =>
'infobox-supplier_proposal',
5890 'intracommreport' =>
'infobox-bank_account',
5891 'currency' =>
'infobox-bank_account',
5892 'multicurrency' =>
'infobox-bank_account',
5893 'members' =>
'infobox-adherent',
5894 'member' =>
'infobox-adherent',
5895 'money-bill-alt' =>
'infobox-bank_account',
5896 'order' =>
'infobox-commande',
5897 'user' =>
'infobox-adherent',
5898 'users' =>
'infobox-adherent',
5899 'error' =>
'pictoerror',
5900 'warning' =>
'pictowarning',
5901 'switch_on' =>
'font-status4',
5902 'switch_on_warning' =>
'font-status4 warning',
5903 'switch_on_red' =>
'font-status8',
5904 'switch_off_warning' =>
'font-status4 warning',
5905 'switch_off_red' =>
'font-status8',
5906 'holiday' =>
'infobox-holiday',
5907 'info' =>
'opacityhigh',
5908 'info_black' =>
'purple',
5909 'invoice' =>
'infobox-commande',
5910 'knowledgemanagement' =>
'infobox-contrat rotate90',
5911 'loan' =>
'infobox-commande',
5912 'payment' =>
'infobox-bank_account',
5913 'payment_vat' =>
'infobox-bank_account',
5914 'poll' =>
'infobox-portal',
5915 'pos' =>
'infobox-bank_account',
5916 'project' =>
'infobox-project',
5917 'projecttask' =>
'infobox-project',
5918 'propal' =>
'infobox-propal',
5919 'proposal' =>
'infobox-propal',
5920 'private' =>
'infobox-project',
5921 'reception' =>
'flip infobox-order_supplier',
5922 'recruitmentjobposition' =>
'infobox-adherent',
5923 'recruitmentcandidature' =>
'infobox-adherent',
5924 'resource' =>
'infobox-action',
5925 'salary' =>
'infobox-commande',
5926 'shapes' =>
'infobox-adherent',
5927 'shipment' =>
'infobox-commande',
5928 'store' =>
'infobox-portal',
5929 'stripe' =>
'infobox-bank_account',
5930 'supplier_invoice' =>
'infobox-order_supplier',
5931 'supplier_invoicea' =>
'infobox-order_supplier',
5932 'supplier_invoiced' =>
'infobox-order_supplier',
5933 'supplier_invoicer' =>
'infobox-order_supplier',
5934 'supplier' =>
'infobox-order_supplier',
5935 'supplier_order' =>
'infobox-order_supplier',
5936 'supplier_proposal' =>
'infobox-supplier_proposal',
5937 'ticket' =>
'infobox-contrat',
5938 'title_accountancy' =>
'infobox-bank_account',
5939 'title_hrm' =>
'infobox-holiday',
5940 'expensereport' =>
'infobox-expensereport',
5941 'trip' =>
'infobox-expensereport',
5942 'title_agenda' =>
'infobox-action',
5943 'vat' =>
'infobox-bank_account',
5944 'webportal' =>
'infobox-portal',
5945 'website' =>
'infobox-portal',
5947 'list-alt' =>
'imgforviewmode',
5948 'calendar' =>
'imgforviewmode',
5949 'calendarweek' =>
'imgforviewmode',
5950 'calendarmonth' =>
'imgforviewmode',
5951 'calendarday' =>
'imgforviewmode',
5952 'calendarperuser' =>
'imgforviewmode',
5953 'calendarpertype' =>
'imgforviewmode'
5955 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5956 $morecss .= ($morecss ?
' ' :
'') . $arrayconvpictotomorcess[$pictowithouttext];
5960 $arrayconvpictotocolor = array(
5961 'address' =>
'#6c6aa8',
5962 'building' =>
'#6c6aa8',
5966 'companies' =>
'#6c6aa8',
5967 'company' =>
'#6c6aa8',
5968 'contact' =>
'#6c6aa8',
5970 'dynamicprice' =>
'#a69944',
5975 'listlight' =>
'#999',
5976 'language' =>
'#555',
5980 'map-marker-alt' =>
'#aaa',
5982 'product' =>
'#a69944',
5983 'service' =>
'#a69944',
5984 'inventory' =>
'#a69944',
5985 'stock' =>
'#a69944',
5986 'movement' =>
'#a69944',
5988 'world' =>
'#986c6a',
5989 'partnership' =>
'#6c6aa8',
5990 'playdisabled' =>
'#ccc',
5991 'printer' =>
'#444',
5992 'projectpub' =>
'#986c6a',
5996 'search-plus' =>
'#808080',
5997 'security' =>
'#999',
5999 'stop-circle' =>
'#888',
6001 'superadmin' =>
'#600',
6002 'switch_off' =>
'#999',
6003 'technic' =>
'#999',
6005 'timespent' =>
'#555',
6006 'uncheck' =>
'#800',
6007 'uparrow' =>
'#555',
6008 'user-cog' =>
'#999',
6009 'country' =>
'#aaa',
6010 'globe-americas' =>
'#aaa',
6014 'workstation' =>
'#a69944'
6016 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
6017 $facolor = $arrayconvpictotocolor[$pictowithouttext];
6024 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
6025 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
6026 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
6028 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
6029 $morestyle = $reg[1];
6030 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
6032 $moreatt = trim($moreatt);
6034 $enabledisablehtml =
'<span class="' . $fa .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
6035 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
6036 $enabledisablehtml .=
'</span>';
6038 return $enabledisablehtml;
6045 } elseif (!empty(
$conf->modules_parts[
'theme']) && array_key_exists($theme,
$conf->modules_parts[
'theme'])) {
6046 $path = $theme .
'/theme/' . $theme;
6051 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
6057 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
6062 foreach (
$conf->file->dol_document_root as $type => $dirroot) {
6063 if ($type ==
'main') {
6067 if (file_exists($dirroot .
'/' . $path .
'/img/' . $picto) && !empty(
$conf->file->dol_url_root)) {
6068 $url = DOL_URL_ROOT .
$conf->file->dol_url_root[$type];
6074 $fullpathpicto = $url .
'/' . $path .
'/img/' . $picto;
6078 return $fullpathpicto;
6082 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 :
'') .
'"') .
'>';
6096 if (empty($mode) || $mode ==
'fa') {
6098 $arrayconvpictotofa = array(
6099 'account' =>
'university',
6100 'accounting_account' =>
'clipboard-list',
6101 'accountline' =>
'receipt',
6102 'accountancy' =>
'search-dollar',
6103 'action' =>
'calendar-alt',
6104 'add' =>
'plus-circle',
6105 'address' =>
'address-book',
6108 'asset' =>
'money-check-alt',
6109 'autofill' =>
'fill',
6110 'back' =>
'arrow-left',
6111 'bank_account' =>
'university',
6112 'bill' =>
'file-invoice-dollar',
6113 'billa' =>
'file-excel',
6114 'billr' =>
'file-invoice-dollar',
6115 'billd' =>
'file-medical',
6116 'blockedlog' =>
'file-archive',
6117 'bookcal' =>
'calendar-check',
6118 'supplier_invoice' =>
'file-invoice-dollar',
6119 'supplier_invoicea' =>
'file-excel',
6120 'supplier_invoicer' =>
'file-invoice-dollar',
6121 'supplier_invoiced' =>
'file-medical',
6123 'card' =>
'address-card',
6124 'chart' =>
'chart-line',
6125 'company' =>
'building',
6126 'contact' =>
'address-book',
6127 'contract' =>
'suitcase',
6128 'collab' =>
'people-arrows',
6129 'conversation' =>
'comments',
6130 'country' =>
'globe-americas',
6131 'cron' =>
'business-time',
6133 'chevron-double-left' =>
'angle-double-left',
6134 'chevron-double-right' =>
'angle-double-right',
6135 'chevron-double-down' =>
'angle-double-down',
6136 'chevron-double-top' =>
'angle-double-up',
6137 'donation' =>
'gift',
6138 'dynamicprice' =>
'hand-holding-usd',
6140 'companies' =>
'building',
6141 'products' =>
'cube',
6142 'commercial' =>
'suitcase',
6143 'invoicing' =>
'coins',
6144 'accounting' =>
'search-dollar',
6145 'category' =>
'tag',
6146 'dollyrevert' =>
'dolly',
6148 'generate' =>
'plus-square',
6149 'hrm' =>
'user-tie',
6150 'incoterm' =>
'truck-loading',
6151 'margin' =>
'calculator',
6152 'members' =>
'user-friends',
6153 'ticket' =>
'ticket-alt',
6154 'globe' =>
'external-link-alt',
6157 'establishment' =>
'building',
6158 'edit' =>
'pencil-alt',
6159 'entity' =>
'globe',
6160 'graph' =>
'chart-line',
6161 'grip_title' =>
'arrows-alt',
6162 'grip' =>
'arrows-alt',
6163 'help' =>
'question-circle',
6164 'generic' =>
'file',
6165 'holiday' =>
'umbrella-beach',
6166 'info' =>
'info-circle',
6167 'info_black' =>
'info-circle',
6168 'inventory' =>
'boxes',
6169 'intracommreport' =>
'globe-europe',
6170 'jobprofile' =>
'cogs',
6171 'knowledgemanagement' =>
'ticket-alt',
6172 'label' =>
'layer-group',
6173 'layout' =>
'columns',
6175 'loan' =>
'money-bill-alt',
6176 'member' =>
'user-alt',
6177 'meeting' =>
'chalkboard-teacher',
6179 'next' =>
'arrow-alt-circle-right',
6181 'expensereport' =>
'wallet',
6183 'movement' =>
'people-carry',
6184 'sign-out' =>
'sign-out-alt',
6185 'superadmin' =>
'star',
6186 'switch_off' =>
'toggle-off',
6187 'switch_off_grey' =>
'toggle-off',
6188 'switch_off_warning' =>
'toggle-off',
6189 'switch_off_red' =>
'toggle-off',
6190 'switch_on' =>
'toggle-on',
6191 'switch_on_grey' =>
'toggle-on',
6192 'switch_on_warning' =>
'toggle-on',
6193 'switch_on_red' =>
'toggle-on',
6195 'bookmark' =>
'star',
6196 'bank' =>
'university',
6197 'close_title' =>
'times',
6198 'delete' =>
'trash',
6199 'filter' =>
'filter',
6200 'list-alt' =>
'list-alt',
6201 'calendarlist' =>
'bars',
6202 'calendar' =>
'calendar-alt',
6203 'calendarmonth' =>
'calendar-alt',
6204 'calendarweek' =>
'calendar-week',
6205 'calendarday' =>
'calendar-day',
6206 'calendarperuser' =>
'table',
6207 'calendarpertype' =>
'table',
6208 'intervention' =>
'ambulance',
6209 'invoice' =>
'file-invoice-dollar',
6210 'order' =>
'file-invoice',
6211 'error' =>
'exclamation-triangle',
6212 'warning' =>
'exclamation-triangle',
6213 'other' =>
'square',
6214 'playdisabled' =>
'play',
6215 'pdf' =>
'file-pdf',
6216 'poll' =>
'check-double',
6217 'pos' =>
'cash-register',
6218 'preview' =>
'binoculars',
6219 'project' =>
'project-diagram',
6220 'projectpub' =>
'project-diagram',
6221 'projecttask' =>
'tasks',
6222 'propal' =>
'file-signature',
6223 'proposal' =>
'file-signature',
6224 'partnership' =>
'handshake',
6225 'payment' =>
'money-check-alt',
6226 'payment_vat' =>
'money-check-alt',
6227 'pictoconfirm' =>
'check-square',
6228 'phoning' =>
'phone',
6229 'phoning_mobile' =>
'mobile-alt',
6230 'phoning_fax' =>
'fax',
6231 'previous' =>
'arrow-alt-circle-left',
6232 'printer' =>
'print',
6233 'product' =>
'cube',
6234 'puce' =>
'angle-right',
6235 'recent' =>
'check-square',
6236 'reception' =>
'dolly',
6237 'recruitmentjobposition' =>
'id-card-alt',
6238 'recruitmentcandidature' =>
'id-badge',
6240 'supplier_order' =>
'dol-order_supplier',
6241 'supplier_proposal' =>
'file-signature',
6242 'refresh' =>
'redo',
6243 'region' =>
'map-marked',
6244 'replacement' =>
'exchange-alt',
6245 'resource' =>
'laptop-house',
6246 'recurring' =>
'history',
6247 'service' =>
'concierge-bell',
6248 'skill' =>
'shapes',
6249 'state' =>
'map-marked-alt',
6250 'security' =>
'key',
6251 'salary' =>
'wallet',
6252 'shipment' =>
'dolly',
6253 'stock' =>
'box-open',
6254 'stats' =>
'chart-bar',
6255 'split' =>
'code-branch',
6256 'status' =>
'stop-circle',
6257 'stripe' =>
'stripe-s',
6258 'supplier' =>
'building',
6259 'technic' =>
'cogs',
6261 'timespent' =>
'clock',
6262 'title_setup' =>
'tools',
6263 'title_accountancy' =>
'money-check-alt',
6264 'title_bank' =>
'university',
6265 'title_hrm' =>
'umbrella-beach',
6266 'title_agenda' =>
'calendar-alt',
6267 'uncheck' =>
'times',
6268 'uparrow' =>
'share',
6269 'url' =>
'external-link-alt',
6270 'vat' =>
'money-check-alt',
6271 'vcard' =>
'arrow-alt-circle-down',
6272 'jabber' =>
'comment',
6273 'website' =>
'globe-americas',
6274 'workstation' =>
'pallet',
6275 'webhook' =>
'bullseye',
6277 'private' =>
'user-lock',
6278 'conferenceorbooth' =>
'chalkboard-teacher',
6279 'eventorganization' =>
'project-diagram',
6280 'webportal' =>
'door-open'
6283 if (
$conf->currency ==
'EUR') {
6284 $arrayconvpictotofa[
'currency'] =
'euro-sign';
6285 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
6287 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
6288 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
6291 $arrayconvpictotofa = array();
6294 return $arrayconvpictotofa;
6312function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $allowothertags = array())
6314 if (strpos($picto,
'^') === 0) {
6315 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6317 return img_picto($titlealt,
'object_' . $picto, $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6332function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
6336 if (is_numeric($picto)) {
6339 return '<i class="fa fa-weather-level' . $picto .
'"></i>';
6340 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6344 $path = DOL_URL_ROOT .
'/theme/' .
$conf->theme .
'/img/weather/' . $picto;
6346 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
6360function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
6364 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6368 if ($pictoisfullpath) {
6371 $path = DOL_URL_ROOT .
'/theme/common/' . $picto;
6374 $themepath = DOL_DOCUMENT_ROOT .
'/theme/' .
$conf->theme .
'/img/' . $picto;
6376 if (file_exists($themepath)) {
6382 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
6398function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
6402 if (empty($titlealt) || $titlealt ==
'default') {
6403 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
6405 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
6406 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
6408 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
6409 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
6411 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
6412 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
6414 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
6415 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
6417 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
6419 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus ' . $numaction);
6423 if (!is_numeric($numaction)) {
6427 return img_picto($titlealt, (empty($picto) ?
'stcomm' . $numaction .
'.png' : $picto), $moreatt);
6437function img_edit_add($titlealt =
'default', $other =
'')
6441 if ($titlealt ==
'default') {
6442 $titlealt = $langs->trans(
'Add');
6445 return img_picto($titlealt,
'edit_add.png', $other);
6458 if ($titlealt ==
'default') {
6459 $titlealt = $langs->trans(
'Remove');
6462 return img_picto($titlealt,
'edit_remove.png', $other);
6473function img_edit($titlealt =
'default', $float = 0, $other =
'')
6477 if ($titlealt ==
'default') {
6478 $titlealt = $langs->trans(
'Modify');
6481 return img_picto($titlealt,
'edit', ($float ?
'style="float: ' . ($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right') .
'"' :
"") . ($other ?
' ' . $other :
''));
6492function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
6496 if ($titlealt ==
'default') {
6497 $titlealt = $langs->trans(
'View');
6500 $moreatt = ($float ?
'style="float: right" ' :
'') . $other;
6502 return img_picto($titlealt,
'eye', $moreatt);
6513function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
6517 if ($titlealt ==
'default') {
6518 $titlealt = $langs->trans(
'Delete');
6521 return img_picto($titlealt,
'delete', $other, 0, 0, 0,
'', $morecss);
6531function img_printer($titlealt =
"default", $other =
'')
6534 if ($titlealt ==
"default") {
6535 $titlealt = $langs->trans(
"Print");
6537 return img_picto($titlealt,
'printer', $other);
6547function img_split($titlealt =
'default', $other =
'class="pictosplit"')
6551 if ($titlealt ==
'default') {
6552 $titlealt = $langs->trans(
'Split');
6555 return img_picto($titlealt,
'split', $other);
6565function img_help($usehelpcursor = 1, $usealttitle = 1)
6570 if (is_string($usealttitle)) {
6573 $usealttitle = $langs->trans(
'Info');
6577 return img_picto($usealttitle,
'info',
'style="vertical-align: middle;' . ($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')) .
'"');
6586function img_info($titlealt =
'default')
6590 if ($titlealt ==
'default') {
6591 $titlealt = $langs->trans(
'Informations');
6594 return img_picto($titlealt,
'info',
'style="vertical-align: middle;"');
6605function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
6609 if ($titlealt ==
'default') {
6610 $titlealt = $langs->trans(
'Warning');
6614 return img_picto($titlealt,
'warning',
'class="' . $morecss .
'"' . ($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' ' . $moreatt) :
''));
6623function img_error($titlealt =
'default')
6627 if ($titlealt ==
'default') {
6628 $titlealt = $langs->trans(
'Error');
6641function img_next($titlealt =
'default', $moreatt =
'')
6645 if ($titlealt ==
'default') {
6646 $titlealt = $langs->trans(
'Next');
6650 return '<span class="fa fa-chevron-right paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6660function img_previous($titlealt =
'default', $moreatt =
'')
6664 if ($titlealt ==
'default') {
6665 $titlealt = $langs->trans(
'Previous');
6669 return '<span class="fa fa-chevron-left paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6680function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
6684 if ($titlealt ==
'default') {
6685 $titlealt = $langs->trans(
'Down');
6688 return img_picto($titlealt, ($selected ?
'1downarrow_selected' :
'1downarrow'),
'class="imgdown' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6699function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
6703 if ($titlealt ==
'default') {
6704 $titlealt = $langs->trans(
'Up');
6707 return img_picto($titlealt, ($selected ?
'1uparrow_selected' :
'1uparrow'),
'class="imgup' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6718function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
6722 if ($titlealt ==
'default') {
6723 $titlealt = $langs->trans(
'Left');
6726 return img_picto($titlealt, ($selected ?
'1leftarrow_selected' :
'1leftarrow'), $moreatt);
6737function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
6741 if ($titlealt ==
'default') {
6742 $titlealt = $langs->trans(
'Right');
6745 return img_picto($titlealt, ($selected ?
'1rightarrow_selected' :
'1rightarrow'), $moreatt);
6755function img_allow($allow, $titlealt =
'default')
6759 if ($titlealt ==
'default') {
6760 $titlealt = $langs->trans(
'Active');
6777function img_credit_card($brand, $morecss =
'fa-2x inline-block valignmiddle')
6779 if (is_null($morecss)) {
6783 if ($brand ==
'visa' || $brand ==
'Visa') {
6785 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
6786 $brand =
'cc-mastercard';
6787 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
6789 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
6790 $brand =
'cc-discover';
6791 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
6793 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
6794 $brand =
'cc-diners-club';
6795 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
6796 $brand =
'credit-card';
6799 return '<span class="fa fa-' . $brand .
' fa-fw' . ($morecss ?
' ' . $morecss :
'') .
'"></span>';
6810function img_mime($file, $titlealt =
'', $morecss =
'')
6812 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
6818 if (empty($titlealt)) {
6819 $titlealt =
'Mime type: ' . $mimetype;
6823 return '<i class="fa fa-' . $mimefa .
' ' . (preg_match(
'/pictofixedwidth/', $morecss) ?
'' :
'paddingright ') . ($morecss ?
' ' . $morecss :
'') .
'"' . ($titlealt ?
' title="' .
dolPrintHTMLForAttribute($titlealt) .
'"' :
'') .
'></i>';
6834function img_search($titlealt =
'default', $other =
'')
6838 if ($titlealt ==
'default') {
6839 $titlealt = $langs->trans(
'Search');
6842 $img =
img_picto($titlealt,
'search', $other, 0, 1);
6844 $input =
'<input type="image" class="liste_titre" name="button_search" src="' . $img .
'" ';
6861 if ($titlealt ==
'default') {
6862 $titlealt = $langs->trans(
'Search');
6865 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
6867 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="' . $img .
'" ';
6887function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'', $textonpictotooltip =
'', $cssfordropdown =
'info_admin')
6889 global
$conf, $langs;
6891 if ($infoonimgalt) {
6892 $result =
img_picto($text,
'info',
'class="' . ($morecss ?
' ' . $morecss :
'') .
'"');
6894 if (empty(
$conf->use_javascript_ajax)) {
6895 $textfordropdown =
'';
6898 $class = (empty($admin) ?
'undefined' : ((
string) $admin ==
'1' ?
'info' : $admin));
6899 $fa =
'info-circle';
6900 if ($picto ==
'warning') {
6901 $fa =
'exclamation-triangle';
6903 $result = ($nodiv ?
'' :
'<div class="wordbreak ' . $class . ($cssfordropdown ?
' ' . $cssfordropdown :
'') . ($morecss ?
' ' . $morecss :
'') . ($textfordropdown ?
' hidden' :
'') .
'">');
6904 $result .=
img_picto(((
string) $admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note')).($textonpictotooltip ?
' : '.$textonpictotooltip :
''), $fa);
6907 $result .= ($nodiv ?
'' :
'</div>');
6909 if ($textfordropdown) {
6910 $tmpresult =
'<span class="' . $class .
' '. $cssfordropdown.
'text opacitymedium cursorpointer">' . $langs->trans($textfordropdown) .
' ' .
img_picto($langs->trans($textfordropdown),
'1downarrow') .
'</span>';
6911 $tmpresult .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">
6912 jQuery(document).ready(function() {
6913 jQuery(".' . $cssfordropdown .
'text").click(function() {
6914 console.log("toggle text of .'.$cssfordropdown.
'");
6915 jQuery(".' . $cssfordropdown .
'").toggle().removeClass("hidden");
6920 $result = $tmpresult . $result;
6941 global
$conf, $langs, $user, $argv;
6942 global $dolibarr_main_prod;
6949 require_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
6951 $langs->load(
"main");
6955 $langs->loadLangs(array(
'main',
'errors'));
6957 if ($_SERVER[
'DOCUMENT_ROOT']) {
6958 $out .= $langs->trans(
"DolibarrHasDetectedError") .
".<br>\n";
6960 $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";
6962 $out .= $langs->trans(
"InformationToHelpDiagnose") .
":<br>\n";
6964 $out .=
"<b>" . $langs->trans(
"Date") .
":</b> " .
dol_print_date(time(),
'dayhourlog') .
"<br>\n";
6965 $out .=
"<b>" . $langs->trans(
"Dolibarr") .
":</b> " . DOL_VERSION .
" - https://www.dolibarr.org<br>\n";
6966 if (isset(
$conf->global->MAIN_FEATURES_LEVEL)) {
6967 $out .=
"<b>" . $langs->trans(
"LevelOfFeature") .
":</b> " .
getDolGlobalInt(
'MAIN_FEATURES_LEVEL') .
"<br>\n";
6969 if ($user instanceof
User) {
6970 $out .=
"<b>" . $langs->trans(
"Login") .
":</b> " . $user->login .
"<br>\n";
6972 if (function_exists(
"phpversion")) {
6973 $out .=
"<b>" . $langs->trans(
"PHP") .
":</b> " . phpversion() .
"<br>\n";
6975 $out .=
"<b>" . $langs->trans(
"Server") .
":</b> " . (isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'') .
"<br>\n";
6976 if (function_exists(
"php_uname")) {
6977 $out .=
"<b>" . $langs->trans(
"OS") .
":</b> " . php_uname() .
"<br>\n";
6979 $out .=
"<b>" . $langs->trans(
"UserAgent") .
":</b> " . (isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'') .
"<br>\n";
6981 $out .=
"<b>" . $langs->trans(
"RequestedUrl") .
":</b> " . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT) :
'') .
"<br>\n";
6982 $out .=
"<b>" . $langs->trans(
"Referer") .
":</b> " . (isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'') .
"<br>\n";
6983 $out .=
"<b>" . $langs->trans(
"MenuManager") .
":</b> " . (isset(
$conf->standard_menu) ?
dol_htmlentities(
$conf->standard_menu, ENT_COMPAT) :
'') .
"<br>\n";
6985 $syslog .=
"url=" . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_escape_htmltag($_SERVER[
"REQUEST_URI"]) :
'');
6986 $syslog .=
", query_string=" . (isset($_SERVER[
"QUERY_STRING"]) ?
dol_escape_htmltag($_SERVER[
"QUERY_STRING"]) :
'');
6988 $out .=
'> ' . $langs->transnoentities(
"ErrorInternalErrorDetected") .
":\n" . $argv[0] .
"\n";
6992 if (!empty(
$conf->modules)) {
6993 $out .=
"<b>" . $langs->trans(
"Modules") .
":</b> " . implode(
', ',
$conf->modules) .
"<br>\n";
6996 if (is_object(
$db)) {
6997 if ($_SERVER[
'DOCUMENT_ROOT']) {
6998 $out .=
"<b>" . $langs->trans(
"DatabaseTypeManager") .
":</b> " .
$db->type .
"<br>\n";
6999 $lastqueryerror =
$db->lastqueryerror();
7001 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
7003 $out .=
"<b>" . $langs->trans(
"RequestLastAccessInError") .
":</b> " . ($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
7004 $out .=
"<b>" . $langs->trans(
"ReturnCodeLastAccessInError") .
":</b> " . (
$db->lasterrno() ?
dol_escape_htmltag(
$db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
7005 $out .=
"<b>" . $langs->trans(
"InformationLastAccessInError") .
":</b> " . (
$db->lasterror() ?
dol_escape_htmltag(
$db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
7009 $out .=
'> ' . $langs->transnoentities(
"DatabaseTypeManager") .
":\n" .
$db->type .
"\n";
7010 $out .=
'> ' . $langs->transnoentities(
"RequestLastAccessInError") .
":\n" . (
$db->lastqueryerror() ?
$db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
7011 $out .=
'> ' . $langs->transnoentities(
"ReturnCodeLastAccessInError") .
":\n" . (
$db->lasterrno() ?
$db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
7012 $out .=
'> ' . $langs->transnoentities(
"InformationLastAccessInError") .
":\n" . (
$db->lasterror() ?
$db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
7014 $syslog .=
", sql=" .
$db->lastquery();
7015 $syslog .=
", db_error=" .
$db->lasterror();
7018 if ($error || $errors) {
7020 if (is_array($error) && is_array($errors)) {
7021 $errors = array_merge($error, $errors);
7022 } elseif (is_array($error)) {
7024 } elseif (is_array($errors) && !empty($error)) {
7025 $errors = array_merge(array($error), $errors);
7026 } elseif (!empty($error)) {
7027 $errors = array_merge(array($error), array($errors));
7030 $langs->load(
"errors");
7032 foreach ($errors as $msg) {
7036 if ($_SERVER[
'DOCUMENT_ROOT']) {
7037 $out .=
"<b>" . $langs->trans(
"Message") .
":</b> " .
dol_escape_htmltag($msg) .
"<br>\n";
7039 $out .=
'> ' . $langs->transnoentities(
"Message") .
":\n" . $msg .
"\n";
7041 $syslog .=
", msg=" . $msg;
7044 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
7045 xdebug_print_function_stack();
7046 $out .=
'<b>XDebug information:</b>' .
"<br>\n";
7047 $out .=
'File: ' . xdebug_call_file() .
"<br>\n";
7048 $out .=
'Line: ' . xdebug_call_line() .
"<br>\n";
7049 $out .=
'Function: ' . xdebug_call_function() .
"<br>\n";
7054 if (!headers_sent()) {
7055 if (function_exists(
'top_httphead')) {
7059 http_response_code(202);
7062 if (empty($dolibarr_main_prod)) {
7065 if (empty($langs->defaultlang)) {
7066 $langs->setDefaultLang();
7068 $langs->loadLangs(array(
"main",
"errors"));
7070 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";
7071 print $langs->trans(
"DolibarrHasDetectedError") .
'. ';
7072 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
7073 if (!defined(
"MAIN_CORE_ERROR")) {
7074 define(
"MAIN_CORE_ERROR", 1);
7091function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
7095 if (empty($email)) {
7099 $langs->load(
"errors");
7102 print
'<br><div class="center login_main_message"><div class="' . $morecss .
'">';
7103 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode .
'-' .
dol_print_date($now,
'%Y%m%d%H%M%S'));
7104 if ($errormessage) {
7105 print
'<br><br>' . $errormessage;
7107 if (is_array($errormessages) && count($errormessages)) {
7108 foreach ($errormessages as $mesgtoshow) {
7109 print
'<br><br>' . $mesgtoshow;
7112 print
'</div></div>';
7131function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $param =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
7133 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $param, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
7154function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
7156 global $langs, $form;
7159 if ($moreattrib ==
'class="right"') {
7160 $prefix .=
'right ';
7163 $tooltip = (
string) $tooltip;
7165 $sortorder = strtoupper((
string) $sortorder);
7174 $tmpsortfield = explode(
',', (
string) $sortfield);
7175 $sortfield1 = trim($tmpsortfield[0]);
7176 $tmpfield = explode(
',', $field);
7177 $field1 = trim($tmpfield[0]);
7179 if (strpos((
string) $tooltip,
':') !==
false) {
7180 $tmptooltip = explode(
':', (
string) $tooltip);
7182 $tmptooltip = array($tooltip);
7185 $wrapcolumntitle = (empty($forcenowrapcolumntitle) || (!empty($tmptooltip[2]) && $tmptooltip[2] ==
'-1'));
7187 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && $wrapcolumntitle) {
7188 $prefix =
'wrapcolumntitle ' . $prefix;
7194 $liste_titre =
'liste_titre';
7195 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
7196 $liste_titre =
'liste_titre_sel';
7199 $tagstart =
'<' . $tag .
' class="' . $prefix . $liste_titre .
'" ' . $moreattrib;
7204 if (empty($thead) && $field && empty($disablesortlink)) {
7205 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7206 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7207 $options = preg_replace(
'/&+/i',
'&', $options);
7208 if (!preg_match(
'/^&/', $options)) {
7209 $options =
'&' . $options;
7212 $sortordertouseinlink =
'';
7213 if ($field1 != $sortfield1) {
7214 if (preg_match(
'/^DESC/i', $sortorder)) {
7215 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7217 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7220 if (preg_match(
'/^ASC/i', $sortorder)) {
7221 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7223 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7226 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
7227 $out .=
'<a class="reposition" href="' .
dolBuildUrl($file, [
'sortfield' => $field,
'sortorder' => $sortordertouseinlink,
'begin' => $begin]) . $options .
'"';
7231 if ($tooltip && $tmptooltip[0]) {
7233 $out .= $form->textwithpicto($langs->trans((
string) $name), $langs->trans((
string) $tmptooltip[0]), (empty($tmptooltip[2]) ?
'1' : $tmptooltip[2]),
'help', ((!empty($tmptooltip[2]) && $tmptooltip[2] ==
'-1') ?
'paddingrightonly' :
''), 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_' . str_replace(
'.',
'_', $field) .
'_' . $tmptooltip[1]));
7235 $out .= $langs->trans((
string) $name);
7238 if (empty($thead) && $field && empty($disablesortlink)) {
7242 if (empty($thead) && $field) {
7243 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7244 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7245 $options = preg_replace(
'/&+/i',
'&', $options);
7246 if (!preg_match(
'/^&/', $options)) {
7247 $options =
'&' . $options;
7250 if (!$sortorder || ($field1 != $sortfield1)) {
7253 if (preg_match(
'/^DESC/', $sortorder)) {
7254 $sortimg .=
'<span class="nowrap">' .
img_up(
"Z-A", 0,
'paddingright') .
'</span>';
7256 if (preg_match(
'/^ASC/', $sortorder)) {
7257 $sortimg .=
'<span class="nowrap">' .
img_down(
"A-Z", 0,
'paddingright') .
'</span>';
7262 $tagend =
'</' . $tag .
'>';
7264 $out = $tagstart . $sortimg . $out . $tagend;
7279 dol_syslog(__FUNCTION__ .
" is deprecated", LOG_WARNING);
7281 print
'<div class="titre">' . $title .
'</div>';
7295function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
7314function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'', $morecssonpicto =
'widthpictotitle')
7318 if ($picto ==
'setup') {
7323 $return .=
'<table ' . (
$id ?
'id="' .
$id .
'" ' :
'') .
'class="centpercent notopnoleftnoright table-fiche-title' . ($morecssontable ?
' ' . $morecssontable :
'') .
'">';
7324 $return .=
'<tr class="toptitle">';
7326 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">' .
img_picto(
'', $picto,
'class="valignmiddle pictotitle'.($morecssonpicto ?
' '.$morecssonpicto :
'').
'"', $pictoisfullpath) .
'</td>';
7328 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
7329 $return .=
'<div class="titre inline-block">';
7330 $return .=
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7331 $return .=
'</div>';
7334 $return .=
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7337 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">' . $morehtmlright .
'</td>';
7339 $return .=
'</tr></table>' .
"\n";
7367function 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 =
'')
7369 global
$conf, $langs;
7372 $savtotalnboflines = $totalnboflines;
7373 if (is_numeric($totalnboflines)) {
7374 $totalnboflines = abs($totalnboflines);
7379 $tmparray = preg_split(
'/<br>/i', $title, 2);
7380 if (!empty($tmparray[1])) {
7381 $title = $tmparray[0];
7382 $subtitle = $tmparray[1];
7385 $page = (int) $page;
7387 if ($picto ==
'setup') {
7388 $picto =
'title_setup';
7390 if ((
$conf->browser->name ==
'ie') && $picto ==
'generic') {
7391 $picto =
'title.gif';
7394 $limit =
$conf->liste_limit;
7397 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
7405 print
"<!-- Begin print_barre_liste -->\n";
7406 print
'<table class="centpercent notopnoleftnoright table-fiche-title' . ($morecss ?
' ' . $morecss :
'') .
'">';
7407 print
'<tr class="toptitle">';
7411 if ($picto && $title) {
7412 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
7413 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
7417 print
'<td class="nobordernopadding valignmiddle col-title">';
7418 print
'<div class="titre inline-block nowrap">';
7419 print
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7420 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
7421 if (is_numeric($totalnboflines) && (
int) $totalnboflines > 0) {
7422 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="' . $langs->trans(
"NbRecordQualified") .
'">(' . $totalnboflines .
')</span>';
7424 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle">(' . $totalnboflines .
')</span>';
7428 if (!empty($subtitle)) {
7429 print
'<br><div class="subtitle inline-block hideonsmartphone">' . $subtitle .
'</div>';
7434 if ($morehtmlcenter && empty(
$conf->dol_optimize_smallscreen)) {
7435 print
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7439 print
'<td class="nobordernopadding valignmiddle right col-right">';
7440 print
'<input type="hidden" name="pageplusoneold" value="' . ((int) $page + 1) .
'">';
7442 parse_str($options, $query);
7444 $query += [
'sortfield' => $sortfield];
7447 $query += [
'sortorder' => $sortorder];
7450 $options =
'&' . http_build_query($query);
7452 $query = array_merge($query, [
'page' => $page]);
7456 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
7457 if ($totalnboflines) {
7459 $maxnbofpage = (empty(
$conf->dol_optimize_smallscreen) ? 4 : 0);
7462 $nbpages = ceil($totalnboflines / $limit);
7466 $cpt = ($page - $maxnbofpage);
7472 if (empty($pagenavastextinput)) {
7474 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">1</a></li>';
7476 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7477 } elseif ($cpt == 2) {
7479 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">2</a></li>';
7485 if ($pagenavastextinput) {
7486 if ($cpt == $page) {
7487 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="' . ($totalnboflines > 100 ?
'width40' :
'width25') .
' center pageplusone heightofcombo" name="pageplusone" value="' . ($page + 1) .
'"></li>';
7491 if ($cpt == $page) {
7492 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
'</span></li>';
7494 $query[
'page'] = $cpt;
7495 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($cpt + 1) .
'</a></li>';
7499 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
7501 if (empty($pagenavastextinput)) {
7502 if ($cpt < $nbpages) {
7503 if ($cpt < $nbpages - 2) {
7504 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7505 } elseif ($cpt == $nbpages - 2) {
7506 $query[
'page'] = ($nbpages - 2);
7507 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($nbpages - 1) .
'</a></li>';
7509 $query[
'page'] = ($nbpages - 1);
7510 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7513 $query[
'page'] = ($nbpages - 1);
7514 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7517 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
"</li>";
7521 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
7523 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
7527 if ($pagenavastextinput) {
7537 if ($morehtmlcenter && !empty(
$conf->dol_optimize_smallscreen)) {
7538 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">' . $morehtmlcenter .
'</div>';
7541 print
"<!-- End title -->\n\n";
7560function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
7562 global
$conf, $langs;
7564 print
'<div class="pagination"><ul>';
7565 if ($beforearrows) {
7566 print
'<li class="paginationbeforearrows">';
7567 print $beforearrows;
7571 if (empty($hidenavigation)) {
7572 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
7573 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
7574 $pagesizechoices .=
',5000:5000';
7584 print
'<li class="pagination">';
7585 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 .
'">';
7586 print
'<datalist id="limitlist">';
7588 print
'<li class="paginationcombolimit valignmiddle">';
7589 print
'<select id="limit' . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix) .
'" name="'.(is_numeric($selectlimitsuffix) ?
'limit' : $selectlimitsuffix).
'" class="flat selectlimit nopadding maxwidth75 center' . (is_numeric($selectlimitsuffix) ?
'' :
' ' . $selectlimitsuffix) .
'" title="' .
dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")) .
'">';
7591 $tmpchoice = explode(
',', $pagesizechoices);
7592 $tmpkey = $limit .
':' . $limit;
7593 if (!in_array($tmpkey, $tmpchoice)) {
7594 $tmpchoice[$tmpkey] = $tmpkey;
7596 $tmpkey =
$conf->liste_limit .
':' .
$conf->liste_limit;
7597 if (!in_array($tmpkey, $tmpchoice)) {
7598 $tmpchoice[$tmpkey] = $tmpkey;
7600 asort($tmpchoice, SORT_NUMERIC);
7601 foreach ($tmpchoice as $val) {
7603 $tmp = explode(
':', $val);
7606 if ($key !=
'' && $val !=
'') {
7607 if ((
int) $key == (
int) $limit) {
7608 $selected =
' selected="selected"';
7610 print
'<option name="' . $key .
'"' . $selected .
'>' .
dol_escape_htmltag($val) .
'</option>' .
"\n";
7614 print
'</datalist>';
7617 print
ajax_combobox(
"limit" . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
7621 if (
$conf->use_javascript_ajax) {
7622 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
7624 jQuery(document).ready(function () {
7625 jQuery(".selectlimit").change(function() {
7626 console.log("We change limit so we submit the form");
7627 $(this).parents(\'form:first\').submit();
7636 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>';
7638 if ($betweenarrows) {
7639 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
7640 print $betweenarrows;
7641 print
'<!--</div>-->';
7643 if ($nextpage > 0) {
7644 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>';
7647 print
'<li class="paginationafterarrows">';
7652 print
'</ul></div>' .
"\n";
7667function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
7671 if (preg_match(
'/%/', $rate)) {
7672 $rate = str_replace(
'%',
'', $rate);
7676 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
7677 $morelabel =
' (' . $reg[1] .
')';
7678 $rate = preg_replace(
'/\s*' . preg_quote($morelabel,
'/') .
'/',
'', $rate);
7679 $morelabel =
' ' . ($html ?
'<span class="opacitymedium small">' :
'') .
'(' . $reg[1] .
')' . ($html ?
'</span>' :
'');
7681 if (preg_match(
'/\*/', $rate)) {
7682 $rate = str_replace(
'*',
'', $rate);
7687 if (!preg_match(
'/\//', $rate)) {
7688 $ret =
price($rate, 0,
'', 0, 0) . ($addpercent ?
'%' :
'');
7691 $ret = $rate . ($addpercent ?
'%' :
'');
7693 if (($info_bits & 1) && $usestarfornpr >= 0) {
7715function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
7717 global $langs,
$conf;
7720 if (empty($amount)) {
7723 $amount = (is_numeric($amount) ? $amount : 0);
7724 if ($rounding == -1) {
7727 $nbdecimal = $rounding;
7729 if ($outlangs ===
'none') {
7739 if (!($outlangs instanceof
Translate)) {
7743 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7744 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
7746 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7747 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
7749 if ($thousand ==
'None') {
7751 } elseif ($thousand ==
'Space') {
7758 $amount = str_replace(
',',
'.', $amount);
7760 $data = explode(
'.', $amount);
7761 $decpart = isset($data[1]) ? $data[1] :
'';
7762 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
7772 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
7773 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
7774 $nbdecimal = $nbdecimalmaxshown;
7782 if ((
string) $forcerounding !=
'-1' && (
string) $forcerounding !=
'') {
7783 if ($forcerounding ===
'MU') {
7785 } elseif ($forcerounding ===
'MT') {
7787 } elseif ($forcerounding >= 0) {
7788 $nbdecimal = (int) $forcerounding;
7793 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
7795 $cursymbolbefore = $cursymbolafter =
'';
7796 if ($currency_code && is_object($outlangs)) {
7797 if ($currency_code ==
'auto') {
7798 $currency_code =
$conf->currency;
7801 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
7802 $listoflanguagesbefore = array(
'nl_NL');
7803 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
7804 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
7806 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
7807 $cursymbolafter .= ($tmpcur == $currency_code ?
' ' . $tmpcur : $tmpcur);
7811 $output = preg_replace(
'/\s/',
' ', $output);
7812 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' <span class="small">'.$cursymbolafter.
'</span>' :
'');
7813 $output = preg_replace(
'/\'/',
''', $output);
7815 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' '.$cursymbolafter :
'');
7846function price2num($amount, $rounding =
'', $option = 0)
7851 if (is_null($amount)) {
7860 if (is_null($langs)) {
7864 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7865 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
7867 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7868 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
7871 if ($thousand ==
'None') {
7873 } elseif ($thousand ==
'Space') {
7881 if (!is_numeric($amount)) {
7882 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
7885 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
7886 $amount = str_replace($thousand,
'', $amount);
7892 if (is_numeric($amount)) {
7894 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7895 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7897 $amount = number_format($amount, $nbofdec, $dec, $thousand);
7903 if ($thousand !=
',' && $thousand !=
'.') {
7916 if (preg_match(
'/^(?<int>[^,]*,|[^.]*\.)(?<dec>[^.,]*)$/u', $amount, $matches)) {
7917 $intPart = $matches[
'int'];
7918 $decPart = $matches[
'dec'];
7921 $intPart = str_replace([
'.',
','],
'', $intPart);
7924 $amount = $intPart . $dec . $decPart;
7928 $amount = str_replace(
' ',
'', $amount);
7929 $amount = str_replace($thousand,
'', $amount);
7930 $amount = str_replace($dec,
'.', $amount);
7932 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7938 $nbofdectoround =
'';
7939 if ($rounding ==
'MU') {
7941 } elseif ($rounding ==
'MT') {
7943 } elseif ($rounding ==
'MS') {
7945 } elseif ($rounding ==
'CU') {
7947 } elseif ($rounding ==
'CT') {
7949 } elseif (is_numeric($rounding)) {
7950 $nbofdectoround = (int) $rounding;
7955 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7957 return 'ErrorBadParameterProvidedToFunction';
7963 if (is_numeric($amount)) {
7965 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7966 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7968 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7974 if ($thousand !=
',' && $thousand !=
'.') {
7975 $amount = str_replace(
',',
'.', $amount);
7978 $amount = str_replace(
' ',
'', $amount);
7979 $amount = str_replace($thousand,
'', $amount);
7980 $amount = str_replace($dec,
'.', $amount);
7982 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
8000function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
8002 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
8004 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
8005 $dimension *= 1000000;
8007 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
8010 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
8011 $dimension /= 1000000;
8013 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
8030 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
8050function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
8054 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
8055 $thirdparty_seller =
$mysoc;
8058 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);
8060 $vatratecleaned = $vatrate;
8062 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
8063 $vatratecleaned = trim($reg[1]);
8064 $vatratecode = $reg[2];
8073 if (
$mysoc->country_code ==
'ES') {
8075 if (!
$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
8078 if ($thirdparty_seller->id ==
$mysoc->id) {
8079 if (!$thirdparty_buyer->localtax1_assuj) {
8083 if (!$thirdparty_seller->localtax1_assuj) {
8091 if (!
$mysoc->localtax2_assuj) {
8094 if ($thirdparty_seller->id ==
$mysoc->id) {
8095 if (!$thirdparty_buyer->localtax2_assuj) {
8099 if (!$thirdparty_seller->localtax2_assuj) {
8105 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
8108 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
8114 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8115 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
8121 if ($thirdparty_seller !=
$mysoc) {
8123 return $thirdparty_seller->localtax1_value;
8132 if ($thirdparty_seller !=
$mysoc) {
8135 return $thirdparty_seller->localtax2_value;
8138 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8139 return $thirdparty_buyer->localtax2_value;
8148 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
8149 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8150 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($thirdparty_seller->country_code) .
"'";
8151 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8152 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8153 if (!empty($vatratecode)) {
8154 $sql .=
" AND t.code ='" .
$db->escape($vatratecode) .
"'";
8156 $sql .=
" AND t.recuperableonly = '" .
$db->escape((
string) $vatnpr) .
"'";
8159 $resql =
$db->query($sql);
8162 $obj =
$db->fetch_object($resql);
8165 return $obj->localtax1;
8166 } elseif ($local == 2) {
8167 return $obj->localtax2;
8188 $valors = explode(
":", $tax);
8190 if (count($valors) > 1) {
8207 $sql =
" SELECT t.localtax" . ((int) $local) .
" as localtax";
8208 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t INNER JOIN " . MAIN_DB_PREFIX .
"c_country as c ON c.rowid = t.fk_pays";
8209 $sql .=
" WHERE c.code = '" .
$db->escape(
$mysoc->country_code) .
"' AND t.active = 1 AND t.entity IN (" .
getEntity(
'c_tva') .
") AND t.taux = (";
8210 $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";
8211 $sql .=
" WHERE c.code = '" .
$db->escape(
$mysoc->country_code) .
"' AND t.entity IN (" .
getEntity(
'c_tva') .
") AND tt.active = 1)";
8212 $sql .=
" AND t.localtax" . ((int) $local) .
"_type <> '0'";
8213 $sql .=
" ORDER BY t.rowid DESC";
8215 $resql =
$db->query($sql);
8217 $obj =
$db->fetch_object($resql);
8219 return $obj->localtax;
8240function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
8244 dol_syslog(
"getTaxesFromId vat id or rate = " . $vatrate);
8247 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
8248 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
8249 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8250 if ($firstparamisid) {
8251 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8253 $vatratecleaned = $vatrate;
8256 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8257 $vatratecleaned = $reg[1];
8258 $vatratecode = $reg[2];
8261 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8264 $sql .=
" WHERE t.fk_pays = c.rowid";
8266 $sql .=
" AND c.code = '" .
$db->escape($buyer->country_code) .
"'";
8268 $sql .=
" AND c.code = '" .
$db->escape($seller->country_code) .
"'";
8270 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8271 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8273 $sql .=
" AND t.code = '" .
$db->escape($vatratecode) .
"'";
8277 $resql =
$db->query($sql);
8279 $obj =
$db->fetch_object($resql);
8282 'rowid' => $obj->rowid,
8283 'code' => $obj->code,
8284 'rate' => $obj->rate,
8285 'localtax1' => $obj->localtax1,
8286 'localtax1_type' => $obj->localtax1_type,
8287 'localtax2' => $obj->localtax2,
8288 'localtax2_type' => $obj->localtax2_type,
8290 'accountancy_code_sell' => $obj->accountancy_code_sell,
8291 'accountancy_code_buy' => $obj->accountancy_code_buy
8323 dol_syslog(
"getLocalTaxesFromRate vatrate=" . $vatrate .
" local=" . $local);
8326 $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";
8327 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8328 if ($firstparamisid) {
8329 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8331 $vatratecleaned = $vatrate;
8334 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8335 $vatratecleaned = $reg[1];
8336 $vatratecode = $reg[2];
8339 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8341 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ?
$mysoc->country_code : $buyer->country_code);
8342 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($countrycodetouse) .
"'";
8344 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ?
$mysoc->country_code : $seller->country_code);
8345 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($countrycodetouse) .
"'";
8347 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8349 $sql .=
" AND t.code = '" .
$db->escape($vatratecode) .
"'";
8353 $resql =
$db->query($sql);
8355 $obj =
$db->fetch_object($resql);
8358 $vateratestring = $obj->rate . ($obj->code ?
' (' . $obj->code .
')' :
'');
8361 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8362 } elseif ($local == 2) {
8363 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8365 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);
8387 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8395 $product->fetch($idprod);
8397 if ((
$mysoc->country_code == $thirdpartytouseforcountry->country_code)
8398 || (in_array(
$mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouseforcountry->country_code, array(
'FR',
'MC')))
8399 || (in_array(
$mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouseforcountry->country_code, array(
'MQ',
'GP')))
8402 if ($idprodfournprice > 0) {
8403 $result = $product->get_buyprice($idprodfournprice, 0, 0,
'');
8405 $ret = $product->vatrate_supplier;
8406 if ($product->default_vat_code_supplier) {
8407 $ret .=
' (' . $product->default_vat_code_supplier .
')';
8413 $ret = $product->tva_tx;
8414 if ($product->default_vat_code) {
8415 $ret .=
' (' . $product->default_vat_code .
')';
8428 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
8429 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8430 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '" .
$db->escape($thirdpartytouseforcountry->country_code) .
"'";
8431 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8432 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8433 $sql .=
$db->plimit(1);
8435 $resql =
$db->query($sql);
8437 $obj =
$db->fetch_object($resql);
8439 $ret = $obj->vat_rate;
8440 if ($obj->default_vat_code) {
8441 $ret .=
' (' . $obj->default_vat_code .
')';
8465 dol_syslog(
"get_product_vat_for_country: ret=" . $ret);
8483 if (!class_exists(
'Product')) {
8484 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8493 $result = $product->fetch($idprod);
8495 if (
$mysoc->country_code == $thirdpartytouseforcountry->country_code) {
8509 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
8510 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8511 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='" .
$db->escape($thirdpartytouseforcountry->country_code) .
"'";
8512 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8513 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
8514 $sql .=
$db->plimit(1);
8516 $resql =
$db->query($sql);
8518 $obj =
$db->fetch_object($resql);
8521 $ret = $obj->localtax1;
8522 } elseif ($local == 2) {
8523 $ret = $obj->localtax2;
8531 dol_syslog(
"get_product_localtax_for_country: ret=" . $ret);
8557 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
8560 $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;
8562 if (empty($thirdparty_seller->country_code)) {
8563 $thirdparty_seller->country_code =
$mysoc->country_code;
8565 $seller_country_code = $thirdparty_seller->country_code;
8566 $seller_in_cee =
isInEEC($thirdparty_seller);
8568 if (empty($thirdparty_buyer->country_code)) {
8569 $thirdparty_buyer->country_code =
$mysoc->country_code;
8571 $buyer_country_code = $thirdparty_buyer->country_code;
8572 $buyer_in_cee =
isInEEC($thirdparty_buyer);
8574 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'));
8582 if ($seller_in_cee && $buyer_in_cee) {
8583 $isacompany = $thirdparty_buyer->
isACompany();
8584 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8585 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8593 $vatrule =
'VATRULE 0';
8599 if (empty($vatrule) && !$seller_use_vat) {
8607 $vatrule =
'VATRULE 1';
8611 if (empty($vatrule) && !empty($thirdparty_buyer->state_id)) {
8612 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
8613 $sql .=
" FROM " .
$db->prefix() .
"c_tva as t";
8614 $sql .=
" INNER JOIN " .
$db->prefix() .
"c_departements as d ON t.fk_department_buyer = d.rowid";
8615 $sql .=
" WHERE d.rowid = " . ((int) $thirdparty_buyer->state_id);
8616 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8618 $res =
$db->query($sql);
8620 if (
$db->num_rows($res)) {
8621 $obj =
$db->fetch_object($res);
8623 $vatvalue = $obj->vat_default_rate .
' (' . $obj->vat_default_code .
')';
8624 $vatrule =
'VATRULE 2';
8631 if (empty($vatrule) && (
8632 ($seller_country_code == $buyer_country_code)
8633 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
8634 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
8639 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
8643 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
8645 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
8646 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
8648 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
8652 $vatvalue = $tmpvat;
8653 $vatrule =
'VATRULE 3b';
8661 if (empty($vatrule) && ($seller_in_cee && $buyer_in_cee)) {
8662 $isacompany = $thirdparty_buyer->
isACompany();
8663 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8664 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8673 $vatrule =
'VATRULE 5';
8680 $vatrule =
'VATRULE 6';
8686 if (empty($vatrule) &&
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
8687 $isacompany = $thirdparty_buyer->
isACompany();
8690 $vatrule =
'VATRULE extra';
8703 $parameters = array(
'vatvalue' => $vatvalue,
'vatrule' => $vatrule);
8707 $reshook = $hookmanager->executeHooks(
'get_default_tva', $parameters, $tmpobject, $tmpaction);
8708 if ($reshook > 0 && !empty($hookmanager->resArray[
'vatvalue'])) {
8709 $vatvalue = $hookmanager->resArray[
'vatvalue'];
8710 $vatrule = $hookmanager->resArray[
'vatrule'];
8731 if ($idprodfournprice > 0) {
8732 if (!class_exists(
'ProductFournisseur')) {
8733 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
8736 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
8737 return $prodprice->fourn_tva_npr;
8738 } elseif ($idprod > 0) {
8739 if (!class_exists(
'Product')) {
8740 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8743 $prod->fetch($idprod);
8744 return $prod->tva_npr;
8767 if (!is_object($thirdparty_seller)) {
8770 if (!is_object($thirdparty_buyer)) {
8774 if (empty($thirdparty_seller->country_code)) {
8775 $thirdparty_seller->country_code =
$mysoc->country_code;
8777 $seller_country_code = $thirdparty_seller->country_code;
8780 if (empty($thirdparty_buyer->country_code)) {
8781 $thirdparty_buyer->country_code =
$mysoc->country_code;
8783 $buyer_country_code = $thirdparty_buyer->country_code;
8787 if (
$mysoc->country_code ==
'ES') {
8788 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
8793 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
8796 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
8800 } elseif ($local == 2) {
8802 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
8805 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
8810 if ($seller_country_code == $buyer_country_code) {
8825function yn($yesno, $format = 1, $color = 0)
8829 $result =
'unknown';
8831 if ($yesno ===
true || (
int) $yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
8832 $result = $langs->trans(
'yes');
8833 if ($format == 1 || $format == 3) {
8834 $result = $langs->trans(
"Yes");
8837 $result =
'<input type="checkbox" value="1" checked disabled>';
8840 $result =
'<input type="checkbox" value="1" checked disabled> ' . $result;
8842 if ($format == 4 || !is_numeric($format)) {
8843 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
8848 $result = $langs->trans(
"no");
8849 if ($format == 1 || $format == 3) {
8850 $result = $langs->trans(
"No");
8853 $result =
'<input type="checkbox" value="0" disabled>';
8856 $result =
'<input type="checkbox" value="0" disabled> ' . $result;
8858 if ($format == 4 || !is_numeric($format)) {
8859 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
8865 $classname =
'error';
8869 return '<span class="' . $classname .
'">' . $result .
'</span>';
8892function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
8894 if (empty($modulepart) && is_object(
$object)) {
8895 if (!empty(
$object->module)) {
8896 $modulepart =
$object->module;
8897 } elseif (!empty(
$object->element)) {
8898 $modulepart =
$object->element;
8905 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
8907 $arrayforoldpath[
'product'] = 2;
8910 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8911 $level = $arrayforoldpath[$modulepart];
8913 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8915 if (empty($num) && is_object(
$object)) {
8918 if (empty($alpha)) {
8919 $num = preg_replace(
'/([^0-9])/i',
'', $num);
8921 $num = preg_replace(
'/^.*\-/i',
'', $num);
8923 $num = substr(
"000" . $num, -$level);
8925 $path = substr($num, 0, 1);
8928 $path = substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8931 $path = substr($num, 2, 1) .
'/' . substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8937 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceof
Societe) {
8945 if (empty($withoutslash) && !empty($path)) {
8960function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
8962 dol_syslog(
"functions.lib::dol_mkdir: dir=" . $dir, LOG_INFO);
8967 if (@is_dir($dir_osencoded)) {
8975 if (!empty($dataroot)) {
8977 $dir = str_replace($dataroot .
'/',
'', $dir);
8978 $ccdir = $dataroot .
'/';
8981 $cdir = explode(
"/", $dir);
8982 $num = count($cdir);
8983 for ($i = 0; $i < $num; $i++) {
8985 $ccdir .=
'/' . $cdir[$i];
8987 $ccdir .= $cdir[$i];
8990 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
8998 if (!@is_dir($ccdir_osencoded)) {
8999 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' is not found (does not exists or is outside open_basedir PHP setting).", LOG_DEBUG);
9002 $dirmaskdec = octdec((
string) $newmask);
9003 if (empty($newmask)) {
9006 $dirmaskdec |= octdec(
'0111');
9007 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
9009 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '" . $ccdir .
"' (no permission to write into parent or directory already exists).", LOG_WARNING);
9012 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' created", LOG_DEBUG);
9021 return ($nberr ? -$nberr : $nbcreated);
9032function dolChmod($filepath, $newmask =
'')
9034 if (!empty($newmask)) {
9035 @chmod($filepath, octdec($newmask));
9049 return '<span class="fieldrequired">*</span>';
9069function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
9071 if (is_null($stringtoclean)) {
9075 if ($removelinefeed == 2) {
9076 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
9078 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
9083 $temp = str_replace(
'< ',
'__ltspace__', $temp);
9084 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
9087 $temp = strip_tags($temp);
9090 $pattern =
"/<[^<>]+>/";
9097 $tempbis = str_replace(
'<>',
'', $temp);
9098 $tempbis = preg_replace($pattern,
'', $tempbis);
9100 }
while ($tempbis != $temp);
9105 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
9111 if ($removelinefeed == 1) {
9112 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
9116 if ($removedoublespaces) {
9117 while (strpos($temp,
" ") !==
false) {
9118 $temp = str_replace(
" ",
" ", $temp);
9122 $temp = str_replace(
'__ltspace__',
'< ', $temp);
9123 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
9147function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
9149 $sav_allowed_tags = $allowed_tags;
9151 if (empty($allowed_tags) || (is_string($allowed_tags) && preg_match(
'/^common/', $allowed_tags))) {
9152 $allowed_tags = array(
9209 $allowed_tags[] =
"comment";
9211 if (!in_array(
'iframe', $allowed_tags)) {
9212 $allowed_tags[] =
"iframe";
9216 if (!in_array(
'link', $allowed_tags)) {
9217 $allowed_tags[] =
"link";
9219 if (!in_array(
'meta', $allowed_tags)) {
9220 $allowed_tags[] =
"meta";
9224 if (!in_array(
'script', $allowed_tags)) {
9225 $allowed_tags[] =
"script";
9229 if (!in_array(
'style', $allowed_tags)) {
9230 $allowed_tags[] =
"style";
9233 if (is_string($sav_allowed_tags)) {
9234 $tmptags = explode(
',', $sav_allowed_tags);
9235 foreach ($tmptags as $tag) {
9236 if ($tag !=
'common') {
9237 $allowed_tags[] = $tag;
9243 $allowed_tags_string = implode(
"><", $allowed_tags);
9244 $allowed_tags_string =
'<' . $allowed_tags_string .
'>';
9246 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
9251 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
9254 $allowed_tags[] =
"commentphp";
9255 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
9256 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
9259 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
9260 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
9263 $temp = strip_tags($stringtoclean, $allowed_tags_string);
9265 if ($cleanalsosomestyles) {
9267 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)/i',
'', $temp);
9268 $temp = preg_replace(
'/z-index\s*:/i',
'', $temp);
9270 if ($removeclassattribute) {
9271 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
9276 if ($cleanalsojavascript) {
9277 $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);
9280 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
9283 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
9286 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
9307 if (is_null($allowed_attributes)) {
9308 $allowed_attributes = array(
9342 if (!in_array(
"content", $allowed_attributes)) {
9343 $allowed_attributes[] =
"content";
9345 if (!in_array(
"http-equiv", $allowed_attributes)) {
9346 $allowed_attributes[] =
"http-equiv";
9349 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
9351 $stringtoclean =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $stringtoclean .
'</body></html>';
9354 $dom =
new DOMDocument(
'',
'UTF-8');
9356 $savwarning = error_reporting();
9357 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
9358 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
9359 error_reporting($savwarning);
9361 if ($dom instanceof DOMDocument) {
9362 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
9363 $el = $els->item($i);
9364 if (!$el instanceof DOMElement) {
9367 $attrs = $el->attributes;
9368 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
9370 if (!empty($attrs->item($ii)->name)) {
9371 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
9373 $els->item($i)->removeAttribute($attrs->item($ii)->name);
9374 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
9376 $valuetoclean = $attrs->item($ii)->value;
9378 if (isset($valuetoclean)) {
9380 $oldvaluetoclean = $valuetoclean;
9381 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
9382 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
9383 if ($els->item($i)->tagName ==
'a') {
9384 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
9385 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
9386 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
9390 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
9391 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
9392 }
while ($oldvaluetoclean != $valuetoclean);
9395 $attrs->item($ii)->value = $valuetoclean;
9402 $dom->encoding =
'UTF-8';
9404 $return = $dom->saveHTML();
9408 $return = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]*' . preg_quote(
'></head><body>',
'/') .
'/',
'', $return);
9409 $return = preg_replace(
'/' . preg_quote(
'</body></html>',
'/') .
'$/',
'', trim($return));
9411 return trim($return);
9413 return $stringtoclean;
9430 $temp = $stringtoclean;
9431 foreach ($disallowed_tags as $tagtoremove) {
9432 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'>/',
'', $temp);
9433 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'\s+[^>]*>/',
'', $temp);
9436 if ($cleanalsosomestyles) {
9437 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
9455 if ($nboflines == 1) {
9457 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
9458 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
9461 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
9466 return $firstline . (isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
9470 $text = preg_replace(
'/\n/',
'', $text);
9472 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9474 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9477 $text = strtr($text, $repTable);
9478 if ($charset ==
'UTF-8') {
9479 $pattern =
'/(<br[^>]*>)/Uu';
9482 $pattern =
'/(<br[^>]*>)/U';
9484 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9489 $lastaddediscontent = 1;
9490 while ($countline < $nboflines && isset($a[$i])) {
9491 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
9492 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
9493 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
9495 if (!$lastaddediscontent) {
9498 $lastaddediscontent = 0;
9501 $firstline .= $a[$i];
9502 $lastaddediscontent = 1;
9508 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
9510 $ret = $firstline . ($adddots ?
'...' :
'');
9528function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
9530 if (is_null($stringtoencode)) {
9535 return nl2br($stringtoencode, $forxml);
9537 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
9551function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
9553 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
9558 return $stringtoencode;
9560 $out = $stringtoencode;
9564 $oldstringtoclean = $out;
9572 if (!empty($out) &&
getDolGlobalInt(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
9574 libxml_use_internal_errors(
false);
9575 if (LIBXML_VERSION < 20900) {
9579 libxml_disable_entity_loader(
true);
9582 $dom =
new DOMDocument();
9590 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">' . $out .
'</div></body></html>';
9594 $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>';
9600 $out = preg_replace_callback(
9601 '/__\[([0-9a-zA-Z_]+)\]__/',
9607 return '__BRACKETSTART' . $m[1] .
'BRACKETEND__';
9612 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
9614 $dom->encoding =
'UTF-8';
9618 foreach ($dom->getElementsByTagName(
'*') as $el) {
9619 if (!$el instanceof DOMElement) {
9624 if ($el->hasAttribute(
'style')) {
9626 $style = $el->getAttribute(
'style');
9629 $style = preg_replace(
'/z-index\s*:/i',
'', $style);
9630 $style = preg_replace(
'/position\s*:/i',
'', $style);
9631 $style = preg_replace(
'/top\s*:/i',
'', $style);
9632 $style = preg_replace(
'/left\s*:/i',
'', $style);
9633 $style = preg_replace(
'/background\s*:/i',
'', $style);
9639 if (trim($style) ===
'') {
9641 $el->removeAttribute(
'style');
9644 $el->setAttribute(
'style', $style);
9650 $out = trim($dom->saveHTML());
9653 $out = preg_replace_callback(
9654 '/__BRACKETSTART([0-9a-zA-Z_]+)BRACKETEND__/',
9660 return '__[' . $m[1] .
']__';
9667 $out = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]+' . preg_quote(
'></head><body><div class="tricktoremove">',
'/') .
'/',
'', $out);
9668 $out = preg_replace(
'/' . preg_quote(
'</div></body></html>',
'/') .
'$/',
'', trim($out));
9673 $out = str_replace(
'<br>',
'', $out);
9678 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9685 if (!empty($out) &&
getDolGlobalInt(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript')) && $outishtml) {
9691 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
9698 'quote-marks' =>
false,
9699 'doctype' =>
'strict',
9700 'show-body-only' =>
true,
9701 "indent-attributes" =>
false,
9702 "vertical-space" =>
false,
9705 'preserve-entities' =>
true
9715 $out = $tidy->repairString($out, $config,
'utf8');
9724 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9730 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
9733 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
9737 $out = preg_replace(
'/'/i',
''', $out);
9742 if (function_exists(
'realCharForNumericEntities')) {
9743 $out = preg_replace_callback(
9744 '/&#(x?[0-9][0-9a-f]+;?)/i',
9749 static function ($m) {
9757 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
9760 if ($check ==
'restricthtmlallowlinkscript') {
9762 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
9764 } elseif ($check ==
'restricthtmlallowiframe') {
9777 $out = preg_replace(
'/'/i',
"'", $out);
9781 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
9782 $out = preg_replace(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|command|contentvisibility|context|cuechange|copy|cut)[a-z]*\s*=/i',
'', $out);
9783 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
9784 $out = preg_replace(
'/on(lost|offline|online|message|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
9785 $out = preg_replace(
'/on(paste|pause|play|playing|progress|ratechange|rejectionn|reset|resize|scroll|search|security|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i',
'', $out);
9786 $out = preg_replace(
'/on(timeupdate|toggle|unhandled|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
9788 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
9790 $out = preg_replace(
'/\son[a-z]+\s*=/i',
' ', $out);
9791 }
while ($oldstringtoclean != $out);
9798 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
9799 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
9800 $nblinks = count($reg[0]);
9801 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
9802 $out =
'ErrorTooManyLinksIntoHTMLString';
9805 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
9807 $out =
'ErrorHTMLLinksNotAllowed';
9809 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
9814 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
9819 if (preg_match_all($pattern, $out, $matches)) {
9822 foreach ($matches[1] as $tmpval) {
9823 if (!empty($tmpval)) {
9827 foreach ($matches[2] as $tmpval) {
9828 if (!empty($tmpval)) {
9836 foreach ($urls as $url) {
9838 $parsedurl = parse_url($url);
9839 if (!empty($parsedurl)) {
9848 if (empty($firstexturl)) {
9849 $firstexturl = $url;
9850 } elseif (empty($secondexturl)) {
9851 $secondexturl = $url;
9857 $out =
'ErrorHTMLExternalLinksNotAllowed (Example: '.$firstexturl.($secondexturl ?
' '.$secondexturl :
'').
')';
9886function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
9888 if (is_null($stringtoencode)) {
9892 $newstring = $stringtoencode;
9894 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
9895 if ($removelasteolbr) {
9896 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
9898 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
9899 $newstring = strtr($newstring, array(
'&' =>
'__PROTECTand__',
'<' =>
'__PROTECTlt__',
'>' =>
'__PROTECTgt__',
'"' =>
'__PROTECTdquot__'));
9901 $newstring = strtr($newstring, array(
'__PROTECTand__' =>
'&',
'__PROTECTlt__' =>
'<',
'__PROTECTgt__' =>
'>',
'__PROTECTdquot__' =>
'"'));
9903 if ($removelasteolbr) {
9904 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
9923 $ret = preg_replace(
'/' .
"\r\n" .
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
9924 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\r\n" .
'/i',
"\r\n", $ret);
9925 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\n" .
'/i',
"\n", $ret);
9926 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
9938 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
9939 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|' .
"\n" .
'|' .
"\r" .
')+$/i',
"", $ret);
9955 if ($keepsomeentities) {
9956 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
9958 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string)
$c);
9959 if ($keepsomeentities) {
9960 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
9976function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
9978 return htmlentities($string, $flags, $encoding, $double_encode);
9997 for ($scursor = 0; $scursor < $len; $scursor++) {
9998 $ordchar = ord($s[$scursor]);
10000 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
10003 } elseif ($ordchar > 126 && $ordchar < 160) {
10006 } elseif ($clean) {
10007 $out .= $s[$scursor];
10029 $arraystring = explode(
"\n", $s);
10030 $nb = count($arraystring);
10047 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
10049 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
10052 $text = strtr($text, $repTable);
10053 if ($charset ==
'UTF-8') {
10054 $pattern =
'/(<br[^>]*>)/Uu';
10057 $pattern =
'/(<br[^>]*>)/U';
10059 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
10061 $nblines = (int) floor((count($a) + 1) / 2);
10063 if ($maxlinesize) {
10064 foreach ($a as $line) {
10067 $line_dec = html_entity_decode($line);
10069 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
10070 $nblines += substr_count($line_dec,
'\n');
10090 if (is_null($msg)) {
10094 if ($option == 1) {
10095 if (preg_match(
'/<(html|link|script)/i', $msg)) {
10097 } elseif (preg_match(
'/<body/i', $msg)) {
10099 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
10101 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
10103 } elseif (preg_match(
'/<br/i', $msg)) {
10109 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
10110 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
10112 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
10114 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
10116 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
10118 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
10120 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
10122 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
10124 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
10126 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
10128 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
10131 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
10133 } elseif (preg_match(
'/&#x[a-f0-9][a-f0-9];/i', $msg)) {
10155function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
10157 if (!empty($invert)) {
10165 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
10180 return $text1.$text2;
10192 if (!is_string($callback)) {
10193 throw new InvalidArgumentException(
"Les callbacks sont désactivés.");
10196 $allowed_callbacks = [
'strtolower',
'strtoupper',
'intval'];
10197 if (!in_array($callback, $allowed_callbacks,
true)) {
10198 throw new InvalidArgumentException(
"Callback function not allowed.");
10200 return array_map($callback, $array);
10217function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude =
null,
$object =
null, $include =
null)
10221 $substitutionarray = array();
10223 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
10227 $emailsendersignature = $user->signature;
10228 $usersignature = $user->signature;
10229 $substitutionarray = array_merge($substitutionarray, array(
10230 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
10234 if (is_object($user) && ($user instanceof
User)) {
10235 $substitutionarray = array_merge($substitutionarray, array(
10236 '__USER_ID__' => (
string) $user->id,
10237 '__USER_LOGIN__' => (
string) $user->login,
10238 '__USER_EMAIL__' => (
string) $user->email,
10239 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
10240 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10241 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10242 '__USER_FAX__' => (
string) $user->office_fax,
10243 '__USER_LASTNAME__' => (
string) $user->lastname,
10244 '__USER_FIRSTNAME__' => (
string) $user->firstname,
10245 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
10246 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
10247 '__USER_JOB__' => (
string) $user->job,
10249 '__USER_VCARD_URL__' => (
string) $user->getOnlineVirtualCardUrl(
'',
'external')
10253 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object(
$mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
10254 $substitutionarray = array_merge($substitutionarray, array(
10255 '__MYCOMPANY_NAME__' =>
$mysoc->name,
10256 '__MYCOMPANY_EMAIL__' =>
$mysoc->email,
10257 '__MYCOMPANY_URL__' =>
$mysoc->url,
10259 '__MYCOMPANY_PHONEMOBILE__' =>
dol_print_phone((
string)
$mysoc->phone_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10261 '__MYCOMPANY_PROFID1__' =>
$mysoc->idprof1,
10262 '__MYCOMPANY_PROFID2__' =>
$mysoc->idprof2,
10263 '__MYCOMPANY_PROFID3__' =>
$mysoc->idprof3,
10264 '__MYCOMPANY_PROFID4__' =>
$mysoc->idprof4,
10265 '__MYCOMPANY_PROFID5__' =>
$mysoc->idprof5,
10266 '__MYCOMPANY_PROFID6__' =>
$mysoc->idprof6,
10267 '__MYCOMPANY_PROFID7__' =>
$mysoc->idprof7,
10268 '__MYCOMPANY_PROFID8__' =>
$mysoc->idprof8,
10269 '__MYCOMPANY_PROFID9__' =>
$mysoc->idprof9,
10270 '__MYCOMPANY_PROFID10__' =>
$mysoc->idprof10,
10271 '__MYCOMPANY_CAPITAL__' =>
$mysoc->capital,
10272 '__MYCOMPANY_FULLADDRESS__' => (method_exists(
$mysoc,
'getFullAddress') ?
$mysoc->getFullAddress(1,
', ') :
''),
10274 '__MYCOMPANY_VATNUMBER__' =>
$mysoc->tva_intra,
10275 '__MYCOMPANY_ZIP__' =>
$mysoc->zip,
10276 '__MYCOMPANY_TOWN__' =>
$mysoc->town,
10277 '__MYCOMPANY_STATE__' =>
$mysoc->state,
10278 '__MYCOMPANY_COUNTRY__' =>
$mysoc->country,
10279 '__MYCOMPANY_COUNTRY_ID__' =>
$mysoc->country_id,
10280 '__MYCOMPANY_COUNTRY_CODE__' =>
$mysoc->country_code,
10281 '__MYCOMPANY_CURRENCY_CODE__' =>
$conf->currency
10285 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
10287 $substitutionarray[
'__ID__'] =
'__ID__';
10288 $substitutionarray[
'__REF__'] =
'__REF__';
10289 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
10290 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
10291 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
10292 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
10293 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
10294 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
10295 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
10298 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
10299 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
10300 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
10301 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
10302 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
10303 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
10305 $substitutionarray[
'__THIRDPARTY_URL__'] =
'__THIRDPARTY_URL__';
10307 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
10308 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
10309 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
10310 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
10311 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
10312 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
10313 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
10314 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
10315 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
10316 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
10317 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
10318 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
10319 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
10320 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
10321 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
10322 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
10323 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
10324 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
10325 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
10327 if (
isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
10328 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
10329 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
10330 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
10331 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
10332 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
10337 if (
isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
10338 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
10339 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
10340 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
10341 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
10342 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
10343 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
10344 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
10345 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
10346 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
10348 if (
isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
10349 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
10350 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
10351 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
10353 if (
isModEnabled(
'holiday') && (!is_object(
$object) ||
$object->element ==
'holiday') && (empty($exclude) || !in_array(
'holiday', $exclude)) && (empty($include) || in_array(
'holiday', $include))) {
10354 $substitutionarray[
'__HOLIDAY_ARRAY_PER_EMPLOYEE_FOR_PERIOD__'] =
'__HOLIDAY_ARRAY_PER_EMPLOYEE_FOR_PERIOD__';
10356 if (
isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
10357 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
10358 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
10359 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
10363 if (
isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
10364 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
10365 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
10366 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
10367 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
10369 if (
isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
10370 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
10372 if (
isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
10373 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
10375 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
10376 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
10377 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
10378 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
10379 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
10380 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
10381 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
10383 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
10384 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
10385 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
10386 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
10387 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
10388 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
'Direct download url of a supplier order';
10389 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
'Direct download url of a supplier invoice';
10392 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
10393 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
10394 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
10397 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
10398 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
10401 '@phan-var-force Adherent|Delivery $object';
10403 $substitutionarray[
'__ID__'] =
$object->id;
10404 $substitutionarray[
'__REF__'] =
$object->ref;
10405 $substitutionarray[
'__NEWREF__'] =
$object->newref;
10407 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10408 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10409 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
10410 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
10412 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
10413 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
10414 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
10417 $date_delivery =
null;
10418 if (property_exists(
$object,
'date_delivery')) {
10419 $date_delivery =
$object->date_delivery;
10420 } elseif (property_exists(
$object,
'delivery_date')) {
10421 $date_delivery =
$object->delivery_date;
10423 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10424 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
10425 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
10426 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
10427 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
10428 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
10429 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
10430 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
10431 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
10434 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10435 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10437 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10438 $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 :
'')) :
'');
10442 '@phan-var-force Adherent $object';
10446 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
10447 if (method_exists(
$object,
'getCivilityLabel')) {
10448 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
10450 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
10451 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
10452 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
10453 if (method_exists(
$object,
'getFullName')) {
10454 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
10456 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
10457 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
10458 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
10459 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
10460 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
10461 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
10462 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
10463 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
10464 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
10465 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
10466 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
10470 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
10471 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
10473 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
10474 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
10475 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
10476 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
10477 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
10478 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
10479 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
10480 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
10481 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
10482 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
10483 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
10488 '@phan-var-force Societe $object';
10489 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->id ??
'';
10490 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->name ??
'';
10491 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->name_alias ??
'';
10492 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->code_client ??
'';
10493 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->code_fournisseur ??
'';
10494 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->email ??
'';
10495 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->email ??
'');
10496 $substitutionarray[
'__THIRDPARTY_URL__'] =
$object->url ??
'';
10497 $substitutionarray[
'__THIRDPARTY_URL_URLENCODED__'] = urlencode(
$object->url ??
'');
10500 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->address ??
'';
10501 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->zip ??
'';
10502 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->town ??
'';
10503 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->state ??
'';
10504 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->country_id > 0 ?:
'');
10505 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->country_code ??
'';
10506 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->idprof1 ??
'';
10507 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->idprof2 ??
'';
10508 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->idprof3 ??
'';
10509 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->idprof4 ??
'';
10510 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->idprof5 ??
'';
10511 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->idprof6 ??
'';
10512 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->tva_intra ??
'';
10515 } elseif (is_object(
$object) && is_object(
$object->thirdparty)) {
10516 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->thirdparty->id ??
'';
10517 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->thirdparty->name ??
'';
10518 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->thirdparty->name_alias ??
'';
10519 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->thirdparty->code_client ??
'';
10520 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->thirdparty->code_fournisseur ??
'';
10521 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->thirdparty->email ??
'';
10522 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->thirdparty->email ??
'');
10525 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->thirdparty->address ??
'';
10526 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->thirdparty->zip ??
'';
10527 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->thirdparty->town ??
'';
10528 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->thirdparty->state ??
'';
10529 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->thirdparty->country_id > 0 ?:
'');
10530 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->thirdparty->country_code ??
'';
10531 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->thirdparty->idprof1 ??
'';
10532 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->thirdparty->idprof2 ??
'';
10533 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->thirdparty->idprof3 ??
'';
10534 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->thirdparty->idprof4 ??
'';
10535 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->thirdparty->idprof5 ??
'';
10536 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->thirdparty->idprof6 ??
'';
10537 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->thirdparty->tva_intra ??
'';
10542 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
10543 '@phan-var-force RecruitmentCandidature $object';
10545 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
10546 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10547 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10549 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
10550 '@phan-var-force ConferenceOrBoothAttendee $object';
10552 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
10553 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10554 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10558 '@phan-var-force Project $object';
10560 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
10561 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
10562 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
10563 } elseif (is_object(
$object)) {
10565 if (!empty(
$object->project)) {
10568 if (!is_null($project) && is_object($project)) {
10569 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
10570 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
10571 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
10576 $project_id =
$object->fk_project;
10577 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
10578 $project_id =
$object->fk_project;
10580 if ($project_id > 0) {
10582 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10583 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10584 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10590 '@phan-var-force Facture $object';
10592 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
10595 '@phan-var-force Expedition $object';
10597 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
10598 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
10599 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
10602 '@phan-var-force Reception $object';
10604 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
10605 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
10609 '@phan-var-force Contrat $object';
10611 $dateplannedstart =
'';
10612 $datenextexpiration =
'';
10613 foreach (
$object->lines as $line) {
10614 if ($line->date_start > $dateplannedstart) {
10615 $dateplannedstart = $line->date_start;
10617 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
10618 $datenextexpiration = $line->date_end;
10621 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
10622 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
10623 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
10625 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
10626 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
10627 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
10631 '@phan-var-force Ticket $object';
10633 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
10634 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
10635 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
10636 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
10637 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
10638 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
10639 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
10640 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
10642 if (
$object->fk_user_assign > 0) {
10643 $userstat->fetch(
$object->fk_user_assign);
10644 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10647 if (
$object->fk_user_create > 0) {
10648 $userstat->fetch(
$object->fk_user_create);
10649 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10655 if (!is_object($extrafields)) {
10658 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
10660 if (
$object->fetch_optionals() > 0) {
10661 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
10662 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
10663 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
10664 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day');
10665 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day',
'tzserver', $outputlangs);
10666 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'dayrfc');
10667 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
10668 $datetime =
$object->array_options[
'options_' . $key];
10669 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
10670 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
10671 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
10672 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
10673 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
10674 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_phone(
$object->array_options[
'options_' . $key]);
10675 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
10676 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
$object->array_options[
'options_' . $key];
10677 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATED__'] =
price(
$object->array_options[
'options_' . $key]);
10678 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATTED__'] =
price(
$object->array_options[
'options_' . $key]);
10679 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'select') {
10680 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10681 $val = $extrafields->attributes[
$object->table_element][
'param'][$key][
'options'][
$object->array_options[
'options_'.$key]] ??
$object->array_options[
'options_'.$key];
10682 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LABEL__'] = $val;
10683 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
10684 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10692 if (empty($substitutionarray[
'__REF__'])) {
10696 require_once DOL_DOCUMENT_ROOT .
'/core/lib/payments.lib.php';
10697 $outputlangs->loadLangs(array(
'paypal',
'other'));
10700 $typeforonlinepayment =
'free';
10702 $typeforonlinepayment =
'order';
10705 $typeforonlinepayment =
'invoice';
10708 $typeforonlinepayment =
'member';
10709 if (!empty(
$object->last_subscription_amount)) {
10710 $amounttouse =
$object->last_subscription_amount;
10714 $typeforonlinepayment =
'contract';
10717 $typeforonlinepayment =
'ficheinter';
10720 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], (
float) $amounttouse);
10721 $paymenturl = $url;
10725 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
10726 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
10730 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
10735 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10737 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
10740 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10742 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
10745 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10747 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
10750 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
10752 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
10755 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
10757 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
10760 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10762 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
10765 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10767 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
'';
10770 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10772 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
'';
10776 '@phan-var-force Propal $object';
10778 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/comm/propal/card.php?id=" .
$object->id;
10779 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10780 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', (
string)
$object->ref, 1,
$object);
10783 '@phan-var-force Commande $object';
10785 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT .
"/commande/card.php?id=" .
$object->id;
10788 '@phan-var-force Facture $object';
10790 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/compta/facture/card.php?id=" .
$object->id;
10793 '@phan-var-force Contrat $object';
10795 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT .
"/contrat/card.php?id=" .
$object->id;
10796 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10797 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', (
string)
$object->ref, 1,
$object);
10800 '@phan-var-force Fichinter $object';
10802 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT .
"/fichinter/card.php?id=" .
$object->id;
10803 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10804 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', (
string)
$object->ref, 1,
$object);
10806 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
10807 '@phan-var-force SupplierProposal $object';
10809 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/supplier_proposal/card.php?id=" .
$object->id;
10811 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
10812 '@phan-var-force FactureFournisseur $object';
10814 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/fourn/facture/card.php?id=" .
$object->id;
10816 if (is_object(
$object) &&
$object->element ==
'payment_supplier') {
10817 '@phan-var-force PaiementFourn $object';
10820 $liste_factures = [];
10824 $sql =
'SELECT f.ref,f.multicurrency_code as f_mccode, pf.*
10825 FROM '.MAIN_DB_PREFIX.
'paiementfourn_facturefourn as pf
10826 JOIN '.MAIN_DB_PREFIX.
'facture_fourn as f ON pf.fk_facturefourn = f.rowid
10827 WHERE pf.fk_paiementfourn = '.((int)
$object->id);
10829 $resql =
$db->query($sql);
10831 while ($objp =
$db->fetch_object($resql)) {
10832 $liste_factures[] =
' - '.$outputlangs->trans(
'Invoice').
' '. $objp->ref.
' '.$outputlangs->trans(
'AmountPayed').
' '.
price($objp->multicurrency_amount, 0, $outputlangs, 0, -1, -1, $objp->multicurrency_code);
10835 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_LIST__'] = implode(
"\n", $liste_factures);
10837 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_TOTAL__'] =
price(
$object->multicurrency_amount, 0, $outputlangs, 0, -1, -1,
$object->multicurrency_code ?
$object->multicurrency_code :
$conf->currency);
10840 '@phan-var-force Expedition $object';
10842 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT .
"/expedition/card.php?id=" .
$object->id;
10844 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10845 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'expedition', (
string)
$object->ref, 1,
$object);
10851 '@phan-var-force ActionComm $object';
10853 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
10854 $substitutionarray[
'__EVENT_DESCRIPTION__'] =
$object->note;
10855 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action" .
$object->type_code);
10856 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date(
$object->datep,
'day',
'auto', $outputlangs);
10857 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
10858 $substitutionarray[
'__EVENT_DATE_TZUSER__'] =
dol_print_date(
$object->datep,
'day',
'tzuserrel', $outputlangs);
10859 $substitutionarray[
'__EVENT_TIME_TZUSER__'] =
dol_print_date(
$object->datep,
'hour',
'tzuserrel', $outputlangs);
10864 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
10865 '@phan-var-force Facture|FactureRec $object';
10867 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functionsnumtoword.lib.php';
10870 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
10872 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
10874 $already_payed_all = 0;
10880 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
10884 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
10888 $substitutionarray[
'__DEPOSIT_PERCENT__'] = is_object(
$object) ?
$object->deposit_percent :
'';
10891 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
10893 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10897 $mysocuselocaltax1 =
false;
10898 $mysocuselocaltax2 =
false;
10900 $tmparray =
$mysoc->useLocalTax(-1);
10901 $mysocuselocaltax1 = $tmparray[1];
10902 $mysocuselocaltax2 = $tmparray[2];
10906 if ($onlykey != 2 || $mysocuselocaltax1) {
10907 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
10909 if ($onlykey != 2 || $mysocuselocaltax2) {
10910 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
10914 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10915 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10916 $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) :
'';
10917 $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)) :
'';
10918 if ($onlykey != 2 || $mysocuselocaltax1) {
10919 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10921 if ($onlykey != 2 || $mysocuselocaltax2) {
10922 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10925 if ($onlykey != 2) {
10926 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
10927 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
10928 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
10929 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
10930 if ($mysocuselocaltax1) {
10931 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
10933 if (
$mysoc->useLocalTax2) {
10934 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
10938 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
10939 $substitutionarray[
'__AMOUNT_MULTICURRENCY_FORMATED__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
price(
$object->multicurrency_total_ttc, 0, $outputlangs, 0, -1, -1,
$object->multicurrency_code) :
'';
10940 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
10941 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
10942 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
10946 if ($onlykey != 2) {
10947 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
10948 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
10949 $substitutionarray[
'__TOTAL_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10954 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
10955 include_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
10965 $daytext = $outputlangs->trans(
'Day' . $tmp[
'wday']);
10967 $substitutionarray = array_merge($substitutionarray, array(
10968 '__NOW_TMS__' => (
string) $now,
10969 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
10970 '__DAY__' => (
string) $tmp[
'mday'],
10971 '__DAY_TEXT__' => $daytext,
10972 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
10973 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
10974 '__MONTH__' => (
string) $tmp[
'mon'],
10975 '__MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp[
'mon'])),
10976 '__MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp[
'mon'])),
10977 '__MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp[
'mon'])),
10978 '__YEAR__' => (
string) $tmp[
'year'],
10979 '__YEAR_PREVIOUS_MONTH__' => (
string) $tmp3[
'year'],
10980 '__YEAR_NEXT_MONTH__' => (
string) $tmp5[
'year'],
10981 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
10982 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
10983 '__PREVIOUS_MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp3[
'month'])),
10984 '__PREVIOUS_MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp3[
'month'])),
10985 '__PREVIOUS_MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp3[
'month'])),
10986 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
10987 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
10988 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
10989 '__NEXT_MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp5[
'month'])),
10990 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp5[
'month'])),
10991 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp5[
'month'])),
10992 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
10997 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' =>
$conf->entity));
10999 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
11000 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
11001 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->transnoentitiesnoconv(
'TranslationOfKey');
11002 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->transnoentitiesnoconv(
'TranslationOfKey') .
' (load also language file before)';
11003 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->transnoentitiesnoconv(
'ValueOfConstantKey');
11008 return $substitutionarray;
11027function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
11029 global
$db, $langs;
11031 if (!is_array($substitutionarray)) {
11032 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
11035 if (empty($outputlangs)) {
11036 $outputlangs = $langs;
11046 if (is_object($outputlangs)) {
11048 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
11050 $tmp = explode(
'|', $reg[1]);
11051 if (!empty($tmp[1])) {
11052 $outputlangs->load($tmp[1]);
11055 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
11057 if (empty($converttextinhtmlifnecessary)) {
11059 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
11061 if (! $msgishtml) {
11065 if ($valueishtml) {
11073 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $value, $text);
11081 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
11082 $originalkeyfound = $reg[1];
11083 $keyfound = preg_replace(
'/\|urlencode$/',
'', $originalkeyfound);
11086 $value =
'*****forbidden*****';
11090 if (preg_match(
'/\|urlencode$/', $originalkeyfound)) {
11091 $value = urlencode($value);
11095 if (empty($converttextinhtmlifnecessary)) {
11097 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
11099 if (! $msgishtml) {
11102 if ($valueishtml) {
11110 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $value, $text);
11115 foreach ($substitutionarray as $key => $value) {
11116 if (!isset($value)) {
11120 if (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN') && ($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__')) {
11124 if (empty($converttextinhtmlifnecessary)) {
11125 $text = str_replace((
string) $key, (
string) $value, $text);
11127 if (! $msgishtml) {
11130 if ($valueishtml) {
11137 $text = str_replace((
string) $key, (
string) $value, $text);
11152 $memory_object_list = array();
11153 foreach ($substitutionarray as $key => $value) {
11154 $lazy_load_arr = array();
11155 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
11156 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
11157 $key_to_substitute = $lazy_load_arr[1];
11158 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
11159 $param_arr = explode(
':', (
string) $value);
11161 if (count($param_arr) >= 4) {
11162 $path = $param_arr[0];
11163 $class = $param_arr[1];
11164 $method = $param_arr[2];
11165 $id = (int) $param_arr[3];
11166 $keyinarrayresult = empty($param_arr[4]) ?
'' : $param_arr[4];
11169 if (!isset($memory_object_list[$class])) {
11171 require_once DOL_DOCUMENT_ROOT . $path;
11172 if (class_exists($class)) {
11173 $memory_object_list[$class] = array(
11181 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
11182 if (method_exists($class, $method)) {
11183 if (!isset($memory_object_list[$class][
'list'][
$id])) {
11184 $tmpobj =
new $class(
$db);
11186 $tmpvaluetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
11187 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
11190 $tmpobj = $memory_object_list[$class][
'list'][
$id];
11192 $tmpvaluetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
11195 if ($keyinarrayresult) {
11196 $valuetouseforsubstitution = (
string) $tmpvaluetouseforsubstitution[$keyinarrayresult];
11198 $valuetouseforsubstitution = (
string) $tmpvaluetouseforsubstitution;
11200 $text = str_replace((
string) $key_to_substitute, $valuetouseforsubstitution, $text);
11226 global
$conf, $user;
11228 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
11233 $dirsubstitutions = array_merge(array(), (array)
$conf->modules_parts[
'substitutions']);
11235 foreach ($dirsubstitutions as $reldir) {
11243 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
11244 foreach ($substitfiles as $substitfile) {
11246 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
11249 dol_syslog(
"Library " . $substitfile[
'name'] .
" found into " . $dir);
11251 require_once $dir . $substitfile[
'name'];
11253 $function_name = $module .
"_" . $callfunc;
11254 if (function_exists($function_name)) {
11255 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
11263 foreach ($substitutionarray as $key => $value) {
11264 $tags .=
'{' . $key .
'} => ' . $value .
"\n";
11266 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
11300 if (!is_object($outputlangs)) {
11301 $outputlangs = $langs;
11305 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date(
$date_start, $format, false, $outputlangs),
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11308 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date(
$date_start, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11311 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11329 if ($nameorder < 0) {
11332 if ($nameorder == 1) {
11333 $ret .= $firstname;
11334 if ($firstname && $lastname) {
11338 } elseif ($nameorder == 2 || $nameorder == 3) {
11339 $ret .= $firstname;
11340 if (empty($ret) && $nameorder == 3) {
11345 if (empty($ret) && $nameorder == 5) {
11346 $ret .= $firstname;
11348 if ($nameorder == 0) {
11349 if ($firstname && $lastname) {
11352 $ret .= $firstname;
11371function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
11374 if (!is_array($mesgs)) {
11375 $mesgs = trim((
string) $mesgs);
11378 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
11382 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11384 $_SESSION[
'dol_events'][$style][] = $mesgs;
11389 foreach ($mesgs as $mesg) {
11390 $mesg = trim((
string) $mesg);
11392 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
11396 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11398 $_SESSION[
'dol_events'][$style][] = $mesg;
11418function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
11420 if (empty($mesg) && empty($mesgs)) {
11428 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE" . $messagekey])) {
11429 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
11430 dol_print_error(
null,
'Bad parameter style=' . $style .
' for setEventMessages');
11432 if (empty($mesgs)) {
11435 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
11456 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
11457 if (empty($disabledoutputofmessages)) {
11460 unset($_SESSION[
'dol_events'][
'mesgs']);
11463 if (isset($_SESSION[
'dol_events'][
'errors'])) {
11464 if (empty($disabledoutputofmessages)) {
11467 unset($_SESSION[
'dol_events'][
'errors']);
11471 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
11472 if (empty($disabledoutputofmessages)) {
11475 unset($_SESSION[
'dol_events'][
'warnings']);
11493function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
11495 global
$conf, $langs;
11500 $divstart = $divend =
'';
11503 if ((empty(
$conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
11504 $divstart =
'<div class="' . $style .
' clearboth">';
11505 $divend =
'</div>';
11508 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
11509 $langs->load(
"errors");
11511 if (is_array($mesgarray) && count($mesgarray)) {
11512 foreach ($mesgarray as $message) {
11514 $out .= $langs->trans($message);
11515 if ($ret < count($mesgarray)) {
11522 $out .= $langs->trans($mesgstring);
11528 if (!empty(
$conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
11529 $return =
'<script nonce="' .
getNonce() .
'">
11530 $(document).ready(function() {
11531 /* jnotify(message, preset of message type, keepmessage) */
11532 $.jnotify("' .
dol_escape_js($out) .
'", "' . ($style ==
"ok" ? 3000 : $style) .
'", ' . ($style ==
"ok" ?
"false" :
"true") .
',{ remove: function (){} } );
11572function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
11574 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
11580 if (is_array($mesgarray)) {
11581 foreach ($mesgarray as $val) {
11582 if ($val && preg_match(
'/class="error"/i', $val)) {
11586 if ($val && preg_match(
'/class="warning"/i', $val)) {
11591 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
11593 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
11596 if ($style ==
'error' || $style ==
'errors') {
11599 if ($style ==
'warning' || $style ==
'warnings') {
11603 if ($iserror || $iswarning) {
11605 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
11606 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
11607 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
11609 if (is_array($mesgarray)) {
11610 $newmesgarray = array();
11611 foreach ($mesgarray as $val) {
11612 if (is_string($val)) {
11613 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
11614 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
11615 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
11616 $newmesgarray[] = $tmpmesgstring;
11618 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
11621 $mesgarray = $newmesgarray;
11623 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
11666function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
11669 $order = strtolower($order);
11671 if (is_array($array)) {
11672 $sizearray = count($array);
11673 if ($sizearray > 0) {
11676 foreach (array_keys($array) as $key) {
11677 $tmpmultikey = explode(
',', $index);
11678 $newindex = $tmpmultikey[0];
11679 if (is_object($array[$key])) {
11680 $temp[$key] = empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex;
11682 if (!empty($tmpmultikey[1])) {
11683 $newindex = $tmpmultikey[1];
11684 $temp[$key] .=
'__' . (empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex);
11688 $temp[$key] = empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex];
11690 if (!empty($tmpmultikey[1])) {
11691 $newindex = $tmpmultikey[1];
11693 $temp[$key] .=
'__' . (empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex]);
11696 if ($natsort == -1) {
11697 $temp[$key] =
'___' . $temp[$key];
11700 if (empty($natsort) || $natsort == -1) {
11701 if ($order ==
'asc') {
11707 if ($case_sensitive) {
11710 natcasesort($temp);
11712 if ($order !=
'asc') {
11713 $temp = array_reverse($temp,
true);
11719 foreach (array_keys($temp) as $key) {
11720 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
11742 $strLength = strlen($str);
11743 for ($i = 0; $i < $strLength; $i++) {
11744 if (ord($str[$i]) < 0x80) {
11746 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
11748 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
11750 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
11752 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
11754 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
11759 for ($j = 0; $j < $n; $j++) {
11760 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
11781 return preg_match(
'//u', $str) ? true :
false;
11793 if (function_exists(
'mb_check_encoding')) {
11795 if (!mb_check_encoding($str,
'ASCII')) {
11799 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
11817 $tmp = ini_get(
"unicode.filesystem_encoding");
11818 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
11819 $tmp =
'iso-8859-1';
11828 if ($tmp ==
'iso-8859-1') {
11829 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
11850function dol_getIdFromCode(
$db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
11860 if ($useCache && isset(
$conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
11861 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
11864 dol_syslog(
'dol_getIdFromCode (value for field ' . $fieldid .
' from key ' . $key .
' not found into cache)', LOG_DEBUG);
11866 $sql =
"SELECT " .
$db->sanitize($fieldid) .
" as valuetoget";
11867 $sql .=
" FROM " . MAIN_DB_PREFIX .
$db->sanitize($tablename);
11868 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
11869 $sql .=
" WHERE " .
$db->sanitize($fieldkey) .
" = " . ((int) $key);
11871 $sql .=
" WHERE " .
$db->sanitize($fieldkey) .
" = '" .
$db->escape($key) .
"'";
11873 if (!empty($entityfilter)) {
11874 $sql .=
" AND entity IN (" .
getEntity($tablename) .
")";
11880 $resql =
$db->query($sql);
11882 $obj =
$db->fetch_object($resql);
11885 $valuetoget = $obj->valuetoget;
11886 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
11888 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
11892 return $valuetoget;
11912 $regextext = preg_replace(
'#^/\^?#',
'', (
string) $regextext);
11913 $regextext = preg_replace(
'#\$?/[imsxuADSUXJ]*$#',
'', $regextext);
11915 if ($matchrule == 1) {
11916 if ($var ==
'mainmenu') {
11918 return (preg_match(
'/^' . $regextext .
'/', $mainmenu));
11919 } elseif ($var ==
'leftmenu') {
11921 return (preg_match(
'/^' . $regextext .
'/', $leftmenu));
11923 return 'This variable is not accessible with dol_eval';
11926 return 'This value '.$matchrule.
' for param $matchrule is not yet implemented';
11940function verifCond($strToEvaluate, $onlysimplestring =
'1')
11944 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
11947 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
11951 $rights = (bool) $rep && (!is_string($rep) || (strpos($rep,
'Exception during') ===
false && strpos($rep,
'Bad call of') ===
false && strpos($rep,
'Bad string syntax to evaluate') ===
false));
11971function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
11973 if ($returnvalue != 1) {
11974 dol_syslog(
"Use of dol_eval with parameter returnvalue = 0 is now forbidden. Please fix this", LOG_ERR);
11998 $db, $langs, $user, $website, $websitepage,
11999 $action, $mainmenu, $leftmenu,
12011 defined(
'T_COALESCE_EQUAL') || define(
'T_COALESCE_EQUAL', PHP_INT_MAX);
12012 defined(
'T_FN') || define(
'T_FN', PHP_INT_MAX);
12015 defined(
'T_ATTRIBUTE') || define(
'T_ATTRIBUTE', PHP_INT_MAX);
12016 defined(
'T_MATCH') || define(
'T_MATCH', PHP_INT_MAX);
12017 defined(
'T_NAME_FULLY_QUALIFIED') || define(
'T_NAME_FULLY_QUALIFIED', PHP_INT_MAX);
12018 defined(
'T_NAME_QUALIFIED') || define(
'T_NAME_QUALIFIED', PHP_INT_MAX);
12019 defined(
'T_NAME_RELATIVE') || define(
'T_NAME_RELATIVE', PHP_INT_MAX);
12022 defined(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
12023 defined(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
12024 defined(
'T_ENUM') || define(
'T_ENUM', PHP_INT_MAX);
12025 defined(
'T_READONLY') || define(
'T_READONLY', PHP_INT_MAX);
12028 defined(
'T_PRIVATE_SET') || define(
'T_PRIVATE_SET', PHP_INT_MAX);
12029 defined(
'T_PROTECTED_SET') || define(
'T_PROTECTED_SET', PHP_INT_MAX);
12030 defined(
'T_PUBLIC_SET') || define(
'T_PUBLIC_SET', PHP_INT_MAX);
12032 $prohibited_token_ids = [
12039 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
12040 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
12090 'T_OPEN_TAG_WITH_ECHO',
12124 $prohibited_variables = [
12136 $prohibited_functions = [
12139 'override_function',
12141 'session_create_id',
12142 'session_regenerate_id',
12144 'call_user_func_array',
12153 'dol_eval_standard',
12161 'mb_eregi_replace',
12162 'dol_compress_dir',
12166 'dol_delete_dir_recursive',
12168 'archiveOrBackupFile',
12170 'file_put_contents',
12184 'filter_input_array',
12188 $prohibited_token_arrangements = [
12193 ' T_CONSTANT_ENCAPSED_STRING ( ',
12197 $tokens = token_get_all(
"<?php return {$s};", TOKEN_PARSE);
12199 $tokens_arrangement =
' ';
12201 for ($i = 2,
$c = count($tokens) - 1; $i <
$c; ++$i) {
12202 if (is_array($tokens[$i])) {
12203 $token_id = $tokens[$i][0];
12204 $token_value = $tokens[$i][1];
12205 $token_name = token_name($tokens[$i][0]);
12207 $token_id = $tokens[$i];
12208 $token_value = $tokens[$i];
12209 $token_name = $tokens[$i];
12213 if (T_WHITESPACE === $token_id) {
12218 $tokens_arrangement .=
"{$token_name} ";
12222 T_VARIABLE === $token_id
12223 && in_array($token_value, $prohibited_variables,
true)
12225 return "« {$token_value} » is prohibited in « {$s} »";
12230 T_STRING === $token_id
12231 && in_array($token_value, $prohibited_functions,
true)
12233 return "« {$token_value} » is prohibited in « {$s} »";
12238 $maxi = count($prohibited_token_ids);
12239 for ($i = 0; $i < $maxi; ++$i) {
12240 if (
false !== strpos($tokens_arrangement,
" {$prohibited_token_ids[$i]} ")) {
12241 return "« {$prohibited_token_ids[$i]} » is prohibited in « {$s} »";
12246 $maxi = count($prohibited_token_arrangements);
12247 for ($i = 0; $i < $maxi; ++$i) {
12248 if (
false !== strpos($tokens_arrangement, $prohibited_token_arrangements[$i])) {
12249 return "« {$prohibited_token_arrangements[$i]} » is prohibited in « {$s} »";
12255 return @eval(
"return {$s};") ??
'';
12256 }
catch (Throwable $ex) {
12257 return "Exception during evaluation: " . $s .
" - " . $ex->getMessage();
12281 global
$db, $langs, $user, $website, $websitepage;
12282 global $action, $mainmenu, $leftmenu;
12284 global $objectoffield;
12292 $isObBufferActive =
false;
12293 if ($onlysimplestring ==
'0') {
12294 $onlysimplestring =
'1';
12296 if (!in_array($onlysimplestring, array(
'1',
'2'))) {
12297 return "Bad call of dol_eval. Parameter onlysimplestring must be '1' or '2'.";
12299 if (!is_scalar($s)) {
12300 return "Bad call of dol_eval. First parameter must be a string, found ".var_export($s,
true);
12304 global $dolibarr_main_restrict_eval_methods;
12307 if (!isset($dolibarr_main_restrict_eval_methods)) {
12308 $dolibarr_main_restrict_eval_methods =
'getDolGlobalString, getDolGlobalInt, getDolCurrency, getDolEntity, getDolDBType, fetchNoCompute, hasRight, isAdmin, isExternalUser, isModEnabled, isStringVarMatching, abs, min, max, round, dol_now, preg_match';
12311 $dolibarr_main_restrict_eval_methods_array = explode(
',', str_replace(
" ",
"", $dolibarr_main_restrict_eval_methods));
12319 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
12320 if ($onlysimplestring ==
'2') {
12321 $specialcharsallowed .=
'<[]';
12323 global $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12324 if (!empty($dolibarr_main_allow_unsecured_special_chars_in_dol_eval)) {
12325 $specialcharsallowed .= (
string) $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12327 if (preg_match(
'/[^a-z0-9\s' . preg_quote($specialcharsallowed,
'/') .
']/i', $s)) {
12328 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): ' . $s;
12340 if (strpos($s,
'/*') !==
false || strpos($s,
'//') !==
false) {
12341 return 'Bad string syntax to evaluate (The comment string /* and // are not allowed): ' . $s;
12345 $tmps = str_replace(
' ? ',
'__XXX__', $s);
12346 if (strpos($tmps,
'?') !==
false) {
12347 return 'Bad string syntax to evaluate (The char ? can be used only with a space before and after): ' . $s;
12351 if (preg_match(
'/<=?[^\s]/', $s)) {
12352 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found a < or <= without space after): ' . $s;
12356 if (preg_match(
'/(include|include_once|require|require_once)/', $s)) {
12357 return 'Bad string syntax to evaluate (found not allowed key include|include_once|require|require_once): ' . $s;
12361 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
12362 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;
12365 if (empty($dolibarr_main_restrict_eval_methods)) {
12371 while ($scheck && $savescheck != $scheck) {
12372 $savescheck = $scheck;
12373 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12374 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12375 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
12376 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
12377 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
12378 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12379 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12380 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
12381 $scheck = preg_replace(
'/\s!\(/',
' __NOTANDPARENTHESIS__', $scheck);
12382 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
12387 if (strpos($scheck,
'(') !==
false) {
12388 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found call of a function or method without using the direct name of the function): ' . $s;
12392 if (strpos($s,
'`') !==
false) {
12393 return 'Bad string syntax to evaluate (backtick char is forbidden): ' . $s;
12398 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
12399 return 'Bad string syntax to evaluate (dot char is forbidden if not strictly between 2 numbers): ' . $s;
12407 while ($scheck && $savescheck != $scheck) {
12408 $savescheck = $scheck;
12409 $scheck = preg_replace(
'/\$conf->[a-z\_]+->enabled/',
'__VARCONFENABLED__', $scheck);
12410 $scheck = preg_replace(
'/\$user->id/',
'__VARUSERID__', $scheck);
12411 $scheck = preg_replace(
'/\$user->hasRight/',
'__VARUSERHASRIGHT__', $scheck);
12412 $scheck = preg_replace(
'/\$user->rights/',
'__VARUSERHASRIGHT__', $scheck);
12413 $scheck = preg_replace(
'/\$user->isAdmin/',
'__VARUSERHASRIGHT__', $scheck);
12414 $scheck = preg_replace(
'/\$user->admin/',
'__VARUSERISADMIN__', $scheck);
12415 $scheck = preg_replace(
'/\$user->isExternalUser/',
'__VARUSERSOCID__', $scheck);
12416 $scheck = preg_replace(
'/\$user->socid/',
'__VARUSERSOCID__', $scheck);
12417 $scheck = preg_replace(
'/\(\$db\)/',
'__VARDB__', $scheck);
12418 $scheck = preg_replace(
'/\$langs/',
'__VARLANGSTRANS__', $scheck);
12419 $scheck = preg_replace(
'/\$mysoc/',
'__VARMYSOC__', $scheck);
12420 $scheck = preg_replace(
'/\$action/',
'__VARACTION__', $scheck);
12421 $scheck = preg_replace(
'/\$mainmenu/',
'__VARMAINMENU__', $scheck);
12422 $scheck = preg_replace(
'/\$leftmenu/',
'__VARLEFTMENU__', $scheck);
12423 $scheck = preg_replace(
'/\$websitepage/',
'__VARWEBSITEPAGE__', $scheck);
12424 $scheck = preg_replace(
'/\$website/',
'__VARWEBSITE__', $scheck);
12425 $scheck = preg_replace(
'/\$objectoffield/',
'__VAROBJECTOFFIELD__', $scheck);
12426 $scheck = preg_replace(
'/\$object/',
'__VAROBJECT__', $scheck);
12427 $scheck = preg_replace(
'/\$var/',
'__VARVAR__', $scheck);
12430 $scheck = preg_replace(
'/\$soc->canvas/',
'__VARSOCCANVAS__', $scheck);
12431 $scheck = preg_replace(
'/\$obj->canvas/',
'__VAROBJCANVAS__', $scheck);
12434 if (strpos($scheck,
'$') !==
false) {
12435 dol_syslog(
'Bad string syntax to evaluate (found use of $ not matching pattern: $user->hasRight, ($db), $langs, $mysoc, $action, $mainmenu, $leftmenu, $website, $websitepage, $objectoffield or $var123): ' . $s, LOG_WARNING);
12436 return 'Bad string syntax to evaluate (found use of $ not matching pattern: $user->hasRight, ($db), $langs, $mysoc, $action, $mainmenu, $leftmenu, $website, $websitepage, $objectoffield or $var123): ' . $s;
12441 $forbiddenphpstrings = array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_GLOBAL',
'_POST',
'_REQUEST',
'ReflectionFunction',
'SplFileObject',
'SplTempFileObject');
12443 if (empty($dolibarr_main_restrict_eval_methods)) {
12447 $forbiddenphpfunctions = array();
12448 $forbiddenphpmethods = array();
12450 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
12451 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
12452 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
12454 $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"));
12455 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
12456 $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"));
12457 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
12458 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
12460 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
12462 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
12463 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
12464 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"pcntl_alarm",
"pcntl_exec",
"pcntl_fork",
"pcntl_waitpid",
"pcntl_wait",
"pcntl_wifexited",
"pcntl_wifstopped",
"pcntl_wifsignaled",
"pcntl_wifcontinued",
"pcntl_wexitstatus",
"pcntl_wtermsig",
"pcntl_wstopsig",
"pcntl_signal"));
12465 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"pcntl_signal_get_handler",
"pcntl_signal_dispatch",
"pcntl_get_last_error",
"pcntl_strerror",
"pcntl_sigprocmask",
"pcntl_sigwaitinfo",
"pcntl_sigtimedwait",
"pcntl_getpriority",
"pcntl_async_signals",
"pcntl_unshare", ));
12466 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"putenv",
"dl",
"apache_child_terminate",
"apache_setenv"));
12467 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"posix_kill",
"posix_setuid",
"posix_setgid"));
12468 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"executeCLI",
"verifCond",
"GETPOST",
"dolEncrypt",
"dolDecrypt"));
12469 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
12470 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
12471 $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"));
12472 $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"));
12473 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
12476 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64" .
"_" .
"decode",
"rawurl" .
"decode",
"url" .
"decode",
"str" .
"_rot13",
"hex" .
"2bin",
"printf",
"sprintf"));
12477 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concat",
"dol_concatdesc"));
12486 $forbiddenphpmethods = array_merge($forbiddenphpmethods, array(
'invoke',
'invokeArgs'));
12494 $forbiddenphpregex =
'global\s*\$';
12495 $forbiddenphpregex .=
'|';
12496 $forbiddenphpregex .=
'\b(' . implode(
'|', $forbiddenphpfunctions) .
')\b';
12498 $forbiddenphpmethodsregex =
'->(' . implode(
'|', $forbiddenphpmethods) .
')';
12502 $oldstringtoclean = $s;
12503 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12504 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12505 $s = preg_replace(
'/' . $forbiddenphpmethodsregex .
'/i',
'__forbiddenstring__', $s);
12507 }
while ($oldstringtoclean != $s);
12509 if (strpos($s,
'__forbiddenstring__') !==
false) {
12510 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12511 return 'Bad string syntax to evaluate: ' . $s;
12515 if (!empty($dolibarr_main_restrict_eval_methods)) {
12518 $pattern =
'/([\s\w\'\]\"]+)\(/';
12520 $matches = array();
12521 preg_match_all($pattern, $s, $matches);
12523 if (count($matches)) {
12524 foreach ($matches[1] as $m) {
12530 if (!preg_match(
'/new ([A-Z][\w]+)/i', $m, $reg)) {
12531 if (!in_array($m, $dolibarr_main_restrict_eval_methods_array)) {
12532 if ($m !=
"'" && $m !=
'"') {
12533 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12534 return 'Bad string syntax to evaluate. A function or method "'.$m.
'" was called and is not into the parameter $dolibarr_main_restrict_eval_methods of white-listed functions and methods: ' . $s;
12538 if (!class_exists($reg[1])) {
12539 dol_syslog(
'Bad string syntax to evaluate: Class "'.$reg[1].
'" does not exist. ' . $s, LOG_WARNING);
12540 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" does not exist. ' . $s;
12542 $parents = class_parents($reg[1]);
12543 if (!in_array(
'CommonObject', $parents)) {
12544 dol_syslog(
'Bad string syntax to evaluate: Class "'.$reg[1].
'" is not allowed because only classes extended CommonObject can be used in dynamic evaluation. ' . $s, LOG_WARNING);
12545 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" is not allowed because only classes extended CommonObject can be used in dynamic evaluation. ' . $s;
12551 $forbiddenphpregex =
'global\s*\$';
12552 $forbiddenphpregex .=
'|';
12553 $forbiddenphpregex .=
'}\s*\[';
12554 $forbiddenphpregex .=
'|';
12555 $forbiddenphpregex .=
'\)\s*\(';
12559 $oldstringtoclean = $s;
12560 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12561 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12564 }
while ($oldstringtoclean != $s);
12566 if (strpos($s,
'__forbiddenstring__') !==
false) {
12567 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12568 return 'Bad string syntax to evaluate: ' . $s;
12574 $isObBufferActive =
true;
12575 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
12576 $tmpo = ob_get_clean();
12577 $isObBufferActive =
false;
12579 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
12583 if ($isObBufferActive) {
12585 $tmpo = ob_get_clean();
12586 $isObBufferActive =
false;
12588 $error =
'dol_eval try/catch error for string: ' . $s .
' - Error: ';
12589 $error .= $e->getMessage();
12591 return 'Exception during evaluation: ' . $s;
12592 }
catch (Error $e) {
12593 if ($isObBufferActive) {
12595 $tmpo = ob_get_clean();
12596 $isObBufferActive =
false;
12598 $error =
'dol_eval try/catch error for string: ' . $s .
' - Error: ';
12599 $error .= $e->getMessage();
12601 return 'Exception during evaluation: ' . $s;
12614 return (trim($element) !=
'');
12627 if (empty($codelang)) {
12631 if ($codelang ==
'auto') {
12632 return '<span class="fa fa-language"></span>';
12635 $langtocountryflag = array(
12637 'ca_ES' =>
'catalonia',
12641 'sw_SW' =>
'unknown',
12651 if (isset($langtocountryflag[$codelang])) {
12652 $flagImage = $langtocountryflag[$codelang];
12654 $tmparray = explode(
'_', $codelang);
12655 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
12660 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
12661 $morecss = $reg[1];
12666 return '<span class="flag-sprite ' . strtolower($flagImage) . ($morecss ?
' ' . $morecss :
'') .
'"' . ($moreatt ?
' ' . $moreatt :
'') . (!$notitlealt ?
' title="' . $codelang .
'"' :
'') .
'></span>';
12680 if (empty($countrycode)) {
12684 if (strtoupper($countrycode) ==
'MQ') {
12687 if (strtoupper($countrycode) ==
'SE') {
12690 if (strtoupper($countrycode) ==
'CH') {
12691 if (
$mysoc->country_code ==
'FR') {
12694 if (
$mysoc->country_code ==
'DE') {
12697 if (
$mysoc->country_code ==
'IT') {
12879 $buildprimarykeytotest = strtolower($countrycode) .
'-' . strtoupper($countrycode);
12880 if (in_array($buildprimarykeytotest, $locales)) {
12881 return strtolower($countrycode) .
'_' . strtoupper($countrycode);
12884 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
12885 foreach ($locales as $locale) {
12886 $locale_language = locale_get_primary_language($locale);
12887 $locale_region = locale_get_region($locale);
12888 if (strtoupper($countrycode) == $locale_region) {
12890 return strtolower($locale_language) .
'_' . strtoupper($locale_region);
12894 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
12932 global $hookmanager,
$db;
12934 if (isset(
$conf->modules_parts[
'tabs'][$type]) && is_array(
$conf->modules_parts[
'tabs'][$type])) {
12935 foreach (
$conf->modules_parts[
'tabs'][$type] as $value) {
12936 $values = explode(
':', $value);
12939 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
12940 if (count($values) !== 6) {
12941 dol_syslog(
'The module_parts["tabs"] entries must be composed of 6 values separated by ":", but got "' . $value .
'". Please check your module descriptor classes.', LOG_ERR);
12948 if ($values[0] != $type) {
12956 $posstart = strpos($str,
'(');
12957 if ($posstart > 0) {
12958 $posend = strpos($str,
')');
12959 if ($posstart > 0) {
12960 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
12961 if (is_numeric($res1)) {
12962 $postab = (int) $res1;
12963 $values[1] =
'+' . substr($str, $posend + 1);
12968 global $objectoffield;
12976 if ($filterorigmodule) {
12977 if (strpos($values[3],
'@')) {
12978 if ($filterorigmodule !=
'external') {
12982 if ($filterorigmodule !=
'core') {
12987 $langs->load($values[3]);
12990 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
12992 $substitutionarray = array();
12997 $labeltemp = explode(
',', $values[2]);
12998 $label = $langs->trans($labeltemp[0]);
13000 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
13002 $classtoload = $labeltemp[1];
13003 if (class_exists($classtoload)) {
13004 $obj =
new $classtoload(
$db);
13005 $function = $labeltemp[3];
13006 if ($obj && $function && method_exists($obj, $function)) {
13008 $nbrec = $obj->$function(
$object->id, $obj);
13009 if (!empty($nbrec)) {
13010 $label .=
'<span class="badge marginleftonlyshort">' . $nbrec .
'</span>';
13016 $url = preg_replace(
'/__ID__/i', ((is_object(
$object) && !empty(
$object->id)) ?
$object->id :
''), $values[5]);
13017 $link = parse_url($url);
13019 if (isset($link[
'query'])) {
13020 parse_str($link[
'query'], $query);
13023 $newtab[1] = $label;
13024 $newtab[2] = str_replace(
'+',
'', $values[1]);
13028 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
13029 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
13030 if ($values[0] != $type) {
13033 $tabname = str_replace(
'-',
'', $values[1]);
13034 foreach ($head as $key => $val) {
13035 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
13037 if ($head[$key][2] == $tabname && $condition) {
13038 unset($head[$key]);
13047 if (!empty($hookmanager)) {
13048 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule,
'type' => $type);
13050 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
13051 if ($reshook > 0) {
13052 $head = $hookmanager->resArray;
13054 $head = array_merge($head, $hookmanager->resArray);
13073 global
$conf, $hookmanager, $user, $langs;
13075 global $micro_start_time;
13077 if ($zone ==
'private') {
13078 print
"\n" .
'<!-- Common footer for private page -->' .
"\n";
13080 print
"\n" .
'<!-- Common footer for public page -->' .
"\n";
13084 print
"\n<!-- A div to store page_y POST parameter -->\n";
13085 print
'<div id="page_y" style="display: none;">' . (
GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'') .
'</div>' .
"\n";
13087 $parameters = array(
'zone' => $zone);
13090 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters, $tmpobject, $action);
13091 if (empty($reshook)) {
13097 if (!empty(
$conf->use_javascript_ajax)) {
13098 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
13099 print
'<script>' .
"\n";
13100 print
'jQuery(document).ready(function() {' .
"\n";
13102 if ($zone ==
'private' && empty(
$conf->dol_use_jmobile)) {
13104 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */' .
"\n";
13105 print
'jQuery("li.menuhider").click(function(event) {';
13106 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }' .
"\n";
13107 print
' console.log("We click on .menuhider");' .
"\n";
13108 print
' $("body").toggleClass("sidebar-collapse")' .
"\n";
13109 print
'});' .
"\n";
13113 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"])))) {
13114 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */' .
"\n";
13115 $relativepathstring = $_SERVER[
"PHP_SELF"];
13117 if (constant(
'DOL_URL_ROOT')) {
13118 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
13120 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
13121 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
13124 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
13125 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
13127 if ($defkey !=
'_noquery_') {
13128 $tmpqueryarraytohave = explode(
'&', $defkey);
13130 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
13131 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
13133 if (!
GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
13137 if (!$foundintru) {
13146 print
'console.log("set the focus by executing jQuery(...).focus();")' .
"\n";
13147 foreach ($defval as $paramkey => $paramval) {
13149 print
'jQuery("input[name=\'' . $paramkey .
'\']
").focus();' . "\n
";
13150 print 'jQuery("textarea[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // TODO KO with ckeditor
13151 print 'jQuery("select[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // Not really useful, but we keep it in case of.
13156 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
13157 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
13159 if ($defkey != '_noquery_') {
13160 $tmpqueryarraytohave = explode('&', $defkey);
13162 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
13163 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
13164 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
13165 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
13169 if (!$foundintru) {
13172 //var_dump($defkey.'-'.$qualified);
13178 print 'console.log("set the js code to manage fields that are
set as mandatory
");' . "\n
";
13180 foreach ($defval as $paramkey => $paramval) {
13181 // Solution 1: Add handler on submit to check if mandatory fields are empty
13182 print 'var form = $(\'[name="'.dol_escape_js($paramkey).'"]\').closest("form
");'."\n
";
13183 print "form.on(
'submit',
function(event) {
13184 var submitter = \$(
this).find(
':submit:focus').get(0);
13185 var buttonName = submitter ? \$(submitter).attr(
'name') :
'save';
13187 if (buttonName ==
'cancel') {
13188 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
13192 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');
13194 var tmpvalue = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').val();
13195 let tmptypefield = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').prop(
'nodeName').toLowerCase();
13197 if (tmptypefield ==
'textarea') {
13199 var tmpeditor = CKEDITOR.instances[
'" . dol_escape_js($paramkey) . "'];
13201 tmpvalue = tmpeditor.getData();
13202 console.log(
'For textarea tmpvalue is '+tmpvalue);
13206 let tmpvalueisempty =
false;
13207 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1) {
13208 tmpvalueisempty =
true;
13210 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
13211 tmpvalueisempty =
true;
13213 if (tmpvalueisempty && buttonName !==
'cancel') {
13214 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
13215 event.preventDefault();
13216 event.stopPropagation();
13218 alert(
'".dol_escape_js($langs->transnoentitiesnoconv("ErrorFieldRequired", $paramkey).' (
'.$langs->transnoentitiesnoconv("CustomMandatoryFieldRule").')
')."');
13222 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
13227 // Solution 2: Add property 'required' on input
13228 // so browser will check value and try to focus on it when submitting the form.
13229 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
13230 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13231 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13232 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
13233 //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
";
13234 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
13240 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");' .
"\n";
13244 print
'jQuery("input[name=\'cancel\']").click(function() {
13245 console.log("We click on cancel button so removed all required attribute");
13246 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
13253 print
'});' .
"\n";
13256 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
13258 print
"/* JS CODE TO ENABLE to add memory info */\n";
13259 print
'window.console && console.log("';
13264 if (!empty($micro_start_time)) {
13265 $micro_end_time = microtime(
true);
13266 print
' - Build time: ' . ceil(1000 * ($micro_end_time - $micro_start_time)) .
' ms';
13269 if (function_exists(
"memory_get_usage")) {
13270 print
' - Mem: ' . memory_get_usage();
13272 if (function_exists(
"memory_get_peak_usage")) {
13273 print
' - Real mem peak: ' . memory_get_peak_usage(
true);
13275 if (function_exists(
"zend_loader_file_encoded")) {
13276 print
' - Zend encoded file: ' . (zend_loader_file_encoded() ?
'yes' :
'no');
13278 print
'");' .
"\n";
13281 print
"\n" .
'</script>' .
"\n";
13287 foreach ($tmptagarray as $tmptag) {
13289 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
13291 <!-- Global site tag (gtag.js) - Google Analytics -->
13292 <script nonce="' .
getNonce() .
'" async src="https://www.googletagmanager.com/gtag/js?id=' . trim($tmptag) .
'"></script>
13294 window.dataLayer = window.dataLayer || [];
13295 function gtag(){dataLayer.push(arguments);}
13296 gtag(\'js\', new Date());
13298 gtag(\'config\', \'' . trim($tmptag) .
'\');
13305 // Add Xdebug coverage of code
13306 if (defined('XDEBUGCOVERAGE
')) {
13307 print_r(xdebug_get_code_coverage());
13310 // Output string from hooks
13311 if (!empty($hookmanager->resPrint)) {
13312 print $hookmanager->resPrint;
13315 // Add DebugBar data
13316 if ($user->hasRight('debugbar
', 'read
')) {
13318 if ($debugbar instanceof DebugBar\DebugBar) {
13319 if (isset($debugbar['time
'])) {
13320 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
13321 $debugbar['time
']->stopMeasure('pageaftermaster
');
13323 print '<!-- Output debugbar data -->
' . "\n";
13324 $renderer = $debugbar->getJavascriptRenderer();
13325 print $renderer->render();
13327 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
13329 print "<!-- Start of log output\n";
13330 //print '<div
class=
"hidden">
'."\n";
13331 foreach ($conf->logbuffer as $logline) {
13332 print $logline . "<br>\n";
13334 //print '</div>
'."\n";
13335 print "End of log output -->\n";
13349function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
13351 if (is_null($string)) {
13355 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
13356 // This is a regex string
13357 $newdelimiter = $delimiter;
13359 // This is a simple string
13360 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
13361 $newdelimiter = preg_quote($delimiter, '/
');
13364 if ($a = preg_split('/
' . $newdelimiter . '/
', $string)) {
13366 foreach ($a as $s) { // each part
13368 if ($pos = strpos($s, $kv)) { // key/value delimiter
13369 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
13370 } else { // key delimiter not found
13388function dolExplodeKeepIfQuotes($input)
13390 // Use regexp to capture words and section in quotes
13391 $matches = array();
13392 preg_match_all('/
"([^"]*)
"|\'([^\']*)\'|(\S+)/', $input, $matches);
13394 // Merge result and delete empty values
13396 $result = array_map(
13403 static function ($a, $b, $c) {
13419 return array_values(array_filter(
13427 static function ($val) {
13428 return $val !== '';
13440function dol_set_focus($selector)
13442 print "\n
" . '<!-- Set focus onto a specific field -->' . "\n
";
13443 print '<script nonce="' . getNonce() . '">jQuery(document).ready(function() { console.log("Force focus by
dol_set_focus"); jQuery("' . dol_escape_js($selector) . '").focus(); });</script>' . "\n
";
13454function dol_getmypid()
13456 if (!function_exists('getmypid')) {
13457 return mt_rand(99900000, 99965535);
13459 return getmypid(); // May be a number on 64 bits (depending on OS)
13485function natural_search($fields, $value, $mode = 0, $nofirstand = 0, $sqltoadd = '')
13487 global $db, $langs;
13489 $value = trim($value);
13492 $value = preg_replace('/\*/', '%', $value); // Replace * with %
13495 $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
13498 $value = preg_replace('/\s*\|\s*/', '|', $value);
13500 // Split criteria on ' ' but not if we are inside quotes.
13501 // For mode 3, the split is done later on the , only and not on the ' '.
13502 if ($mode != -3 && $mode != 3) {
13503 $crits = dolExplodeKeepIfQuotes($value);
13505 $crits = array($value);
13509 if (!is_array($fields)) {
13510 $fields = array($fields);
13512 $i1 = 0; // count the nb of "and
" criteria added (all fields / criteria)
13513 foreach ($crits as $crit) { // Loop on each AND criteria
13514 $crit = trim($crit);
13515 $i2 = 0; // count the nb of valid criteria added for this this first criteria
13518 foreach ($fields as $field) {
13520 $tmpcrits = explode('|', $crit);
13521 $i3 = 0; // count the nb of valid criteria added for this current field
13522 foreach ($tmpcrits as $tmpcrit) {
13523 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13526 $tmpcrit = trim($tmpcrit);
13528 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13531 $newcrit = preg_replace('/([!<>=]+)/', '', $tmpcrit);
13534 preg_match('/([!<>=]+)/', $tmpcrit, $reg);
13535 if (!empty($reg[1])) {
13536 $operator = $reg[1];
13538 if ($newcrit != '') {
13539 $numnewcrit = price2num($newcrit);
13540 if (is_numeric($numnewcrit)) {
13541 $newres .= $db->sanitize($field) . ' ' . $operator . ' ' . ((float) $numnewcrit); // should be a numeric
13543 $newres .= '1 = 2'; // force false, we received a corrupted data
13545 $i3++; // a criteria was added to string
13548 $i2++; // a criteria for 1 more field was added to string
13549 } elseif ($mode == 2 || $mode == -2) {
13550 $crit = preg_replace('/[^\-0-9,]/', '', $crit); // ID are always integer
13551 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -2 ? 'NOT ' : '');
13552 $newres .= $crit ? "IN (
" . $db->sanitize($db->escape($crit)) . ")
" : "IN (0)
";
13554 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13556 $i2++; // a criteria for 1 more field was added to string
13557 } elseif ($mode == 3 || $mode == -3) {
13558 $tmparray = explode(',', $crit);
13559 if (count($tmparray)) {
13561 $listofcodesnot = '';
13562 foreach ($tmparray as $val) {
13565 if (preg_match('/^!/', $val)) {
13566 $listofcodesnot .= ($listofcodesnot ? ',' : '');
13567 $listofcodesnot .= "'" . $db->escape(preg_replace('/^!=?/
', '', $val)) . "'";
13569 $listofcodes .= ($listofcodes ? ',' : '');
13570 $listofcodes .= "'" . $db->escape($val) . "'";
13574 $newres .= ($i2 > 0 ? ' OR ' : '');
13575 if ($listofcodes && $listofcodesnot) {
13578 if ($listofcodes) {
13579 $newres .= $db->sanitize($field) . " " . ($mode == -3 ? 'NOT IN' : 'IN') . " (
" . $db->sanitize($listofcodes, 1, 0, 1) . ")
";
13581 if ($listofcodes && $listofcodesnot) {
13582 $newres .= ' AND ';
13584 if ($listofcodesnot) {
13585 $newres .= $db->sanitize($field) . " " . ($mode == -3 ? 'IN ' : 'NOT IN') . " (
" . $db->sanitize($listofcodesnot, 1, 0, 1) . ")
";
13587 if ($listofcodes && $listofcodesnot) {
13590 $i2++; // a criteria for 1 more field was added to string
13593 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13595 } elseif ($mode == 4) {
13596 $tmparray = explode(',', $crit);
13597 if (count($tmparray)) {
13599 foreach ($tmparray as $val) {
13602 $newres .= ($i2 > 0 ? " OR (
" : "(
") . $db->sanitize($field) . " LIKE
'" . $db->escape($val) . ",%'";
13603 $newres .= ' OR ' . $db->sanitize($field) . " =
'" . $db->escape($val) . "'";
13604 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . "'";
13605 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . ",%'";
13607 $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)
13611 } else { // $mode=0
13612 $tmpcrits = explode('|', $crit);
13613 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
13614 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
13615 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13618 $tmpcrit = trim($tmpcrit);
13620 if ($tmpcrit == '^$' || strpos($crit, '!') === 0) { // If we search empty, we must combined different OR fields with AND
13621 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND ' : '');
13623 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13626 $isSellist = false;
13627 $table = $label = $key = null;
13629 if (strpos($field, 'ef.') === 0) {
13630 $extrafieldName = substr($field, 3);
13631 $extrafields = new ExtraFields($db);
13632 $extrafields->fetch_name_optionals_label('product');
13634 if (isset($extrafields->attributes['product']['type'][$extrafieldName]) && $extrafields->attributes['product']['type'][$extrafieldName] === 'sellist') {
13636 $paramArray = $extrafields->attributes['product']['param'][$extrafieldName]['options'] ?? [];
13637 $param = array_key_first($paramArray);
13638 list($table, $label, $key) = explode(':', $param);
13642 if (preg_match('/\.(id|rowid)$/', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
13643 $newres .= $db->sanitize($field) . " =
" . (is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0');
13645 $tmpcrit2 = $tmpcrit;
13651 $newres .= $field . " IN (SELECT t.
" . $key . " FROM
" . $db->prefix() . $table . " AS t WHERE t.
" . $label . " LIKE
'%" . $db->escape($tmpcrit2) . "%')
";
13653 if (preg_match('/^!/', $tmpcrit)) {
13654 $tmps .= $db->sanitize($field) . " NOT LIKE
"; // ! as exclude character
13655 $tmpcrit2 = preg_replace('/^!/', '', $tmpcrit2);
13657 $tmps .= $db->sanitize($field) . " LIKE
";
13661 if (preg_match('/^[\^\$]/
', $tmpcrit)) {
13663 $tmpcrit2 = preg_replace('/^[\^\$]/
', '', $tmpcrit2);
13665 if (preg_match('/[\^\$]$/
', $tmpcrit)) {
13667 $tmpcrit2 = preg_replace('/[\^\$]$/
', '', $tmpcrit2);
13670 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
13671 $tmps = "(" . $tmps;
13674 $newres .= $tmpbefore;
13675 $newres .= $db->escape($tmpcrit2);
13676 $newres .= $tmpafter;
13678 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
13679 $newres .= " OR
" . $field . " IS NULL)
";
13687 $i2++; // a criteria for 1 more field was added to string
13692 $newres .= ($newres ? '' : ' OR ').str_replace('__KEYTOSEARCH__', $crit, $sqltoadd);
13696 $res = $res . ($res ? ' AND ' : '') . ($i2 > 1 ? '(' : '') . $newres . ($i2 > 1 ? ')' : '');
13700 $res = ($nofirstand ? "" : " AND
") . "(
" . $res . ")
";
13712function showSimpleHTMLTable($outputlangs, $object)
13716 $discountIsAvailable = false;
13717 $orderPositionHasNoPrice = false;
13719 if (!property_exists($object->lines[0], "remise_percent
") ||
13720 !property_exists($object->lines[0], "fk_unit
") ||
13721 !property_exists($object->lines[0], "multicurrency_total_ttc
") ||
13722 !property_exists($object->lines[0], "description") ||
13723 !property_exists($object->lines[0], "qty
")) {
13727 foreach ($object->lines as $order_position) {
13728 if (!property_exists($order_position, "price")) {
13729 $orderPositionHasNoPrice = true;
13733 if (!empty($order_position->remise_percent)) {
13734 $discountIsAvailable = true;
13739 if ($orderPositionHasNoPrice) {
13743 $discountHeader = $discountIsAvailable ? '<th style="width:120px
">'.$outputlangs->trans("Discount
").'</th>' : '';
13745 $table = '<table border="0
" cellpadding="1
" cellspacing="1
">';
13749 <th style="width:50px; text-align:left
">#</th>
13750 <th style="text-align:left
">'.$outputlangs->trans("Description
").'</th>
13751 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Price
").'</th>
13752 <th style="width:100px; text-align:right;
">'.$outputlangs->trans("Quantity
").'</th>
13753 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Unit
").'</th>'.
13755 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Sum
").'</th>
13760 foreach ($object->lines as $index => $order_position) {
13761 $position = $index + 1;
13762 $price = price($order_position->price, 0, $outputlangs, 0, -1, -1, $conf->currency);
13763 $unit = measuringUnitString($order_position->fk_unit, '', null, 1);
13764 $total = price($order_position->multicurrency_total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency);
13765 $discount = $discountIsAvailable ? '<td style="text-align:center
">'.$order_position->remise_percent.'%</td>' : "";
13769 <td>'.$position.'</td>
13770 <td>'.$order_position->description.'</td>
13771 <td style="text-align:right
">'.$price.'</td>
13772 <td style="text-align:right
">'.$order_position->qty.'</td>
13773 <td style="text-align:right
">'.$unit.'</td>'.
13775 <td style="text-align:right
">'.$total.'</td>
13778 $table .= '</tbody></table>';
13789function showDirectDownloadLink($object)
13794 $url = $object->getLastMainDocLink($object->element);
13796 $out .= img_picto($langs->trans("PublicDownloadLinkDesc
"), 'globe') . ' <span class="opacitymedium
">' . $langs->trans("DirectDownloadLink
") . '</span><br>';
13798 $out .= '<div class="urllink
"><input type="text
" id="directdownloadlink
" class="quatrevingtpercent
" value="' . $url . '"></div>';
13799 $out .= ajax_autoselect("directdownloadlink
", '');
13801 $out .= '<div class="urllink
">' . $langs->trans("FileNotShared
") . '</div>';
13815function getImageFileNameForSize($file, $extName, $extImgTarget = '')
13817 $dirName = dirname($file);
13818 if ($dirName == '.') {
13822 if (!in_array($extName, array('', '_small', '_mini'))) {
13823 return 'Bad parameter extName';
13826 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp|\.avif)$/i', '', $file); // We remove image extension, whatever is its case
13827 $fileName = basename($fileName);
13829 if (empty($extImgTarget)) {
13830 $extImgTarget = (preg_match('/\.jpg$/i', $file) ? '.jpg' : '');
13832 if (empty($extImgTarget)) {
13833 $extImgTarget = (preg_match('/\.jpeg$/i', $file) ? '.jpeg' : '');
13835 if (empty($extImgTarget)) {
13836 $extImgTarget = (preg_match('/\.gif$/i', $file) ? '.gif' : '');
13838 if (empty($extImgTarget)) {
13839 $extImgTarget = (preg_match('/\.png$/i', $file) ? '.png' : '');
13841 if (empty($extImgTarget)) {
13842 $extImgTarget = (preg_match('/\.bmp$/i', $file) ? '.bmp' : '');
13844 if (empty($extImgTarget)) {
13845 $extImgTarget = (preg_match('/\.webp$/i', $file) ? '.webp' : '');
13847 if (empty($extImgTarget)) {
13848 $extImgTarget = (preg_match('/\.avif$/i', $file) ? '.avif' : '');
13851 if (!$extImgTarget) {
13857 $subdir = 'thumbs/';
13860 return ($dirName ? $dirName . '/' : '') . $subdir . $fileName . $extName . $extImgTarget; // New filename for thumb
13873function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '')
13875 global $conf, $langs;
13877 if (empty($conf->use_javascript_ajax)) {
13881 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
13883 if ($alldata == 1) {
13884 if ($isAllowedForPreview) {
13885 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));
13891 // old behavior, return a string
13892 if ($isAllowedForPreview) {
13893 $tmpurl = DOL_URL_ROOT . '/document.php?modulepart=' . urlencode($modulepart) . '&attachment=0&file=' . urlencode($relativepath) . ($param ? '&' . $param : '');
13894 $title = $langs->transnoentities("Preview
");
13895 //$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().
13896 //$tmpurl = 'file='.urlencode("'-alert(document.domain)-'_small.jpg
"); // An example of tmpurl that should be blocked by the dol_escape_uri()
13898 // 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,
13899 // 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.
13900 // Using the dol_escape_uri guarantee that we encode for URI so decode retrieve original expected value.
13901 return 'javascript:' . dol_escape_uri('document_preview(\'' . dol_escape_js($tmpurl) . '\', \'' . dol_escape_js(dol_mimetype($relativepath)) . '\', \'' . dol_escape_js($title) . '\')');
13913function getLabelSpecialCode($idcode)
13917 $arrayspecialines = array(1 => 'Transport', 2 => 'EcoTax', 3 => 'Option');
13918 if ($idcode > 10) {
13919 return 'Module ID ' . $idcode;
13921 if (!empty($arrayspecialines[$idcode])) {
13922 return $langs->trans($arrayspecialines[$idcode]);
13936function ajax_autoselect($htmlname, $addlink = '', $textonlink = 'Link')
13939 $out = '<script nonce="
' . getNonce() . '">
13940 jQuery(document).ready(function () {
13941 jQuery("' . ((strpos($htmlname, '.
') === 0 ? '' : '#
') . $htmlname) . '").click(function() { jQuery(this).select(); } );
13945 if ($textonlink === 'image') {
13946 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . img_picto('', 'globe') . '</a>';
13948 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . $langs->trans("Link") . '</a>';
13961function dolIsAllowedForPreview($file)
13963 // Check .noexe extension in filename
13964 if (preg_match('/\.noexe$/i', $file)) {
13968 // Check mime types
13969 $mime_preview = array('avif', 'bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css', 'webp', 'webm', 'mp4');
13970 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES')) {
13971 $mime_preview[] = 'svg+xml';
13973 //$mime_preview[]='vnd.oasis.opendocument.presentation';
13974 //$mime_preview[]='archive';
13975 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
13976 if ($num_mime !== false) {
13980 // By default, not allowed for preview
13994function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0)
13997 $imgmime = 'other.png';
13998 $famime = 'file-o';
14001 $tmpfile = preg_replace('/\.noexe$/', '', $file);
14003 // Plain text files
14004 if (preg_match('/\.txt$/i', $tmpfile)) {
14005 $mime = 'text/plain';
14006 $imgmime = 'text.png';
14007 $famime = 'file-alt';
14008 } elseif (preg_match('/\.rtx$/i', $tmpfile)) {
14009 $mime = 'text/richtext';
14010 $imgmime = 'text.png';
14011 $famime = 'file-alt';
14012 } elseif (preg_match('/\.csv$/i', $tmpfile)) {
14013 $mime = 'text/csv';
14014 $imgmime = 'text.png';
14015 $famime = 'file-csv';
14016 } elseif (preg_match('/\.tsv$/i', $tmpfile)) {
14017 $mime = 'text/tab-separated-values';
14018 $imgmime = 'text.png';
14019 $famime = 'file-alt';
14020 } elseif (preg_match('/\.(cf|conf|log)$/i', $tmpfile)) {
14021 $mime = 'text/plain';
14022 $imgmime = 'text.png';
14023 $famime = 'file-alt';
14024 } elseif (preg_match('/\.ini$/i', $tmpfile)) {
14025 $mime = 'text/plain';
14026 $imgmime = 'text.png';
14028 $famime = 'file-alt';
14029 } elseif (preg_match('/\.md$/i', $tmpfile)) {
14030 $mime = 'text/plain';
14031 $imgmime = 'text.png';
14033 $famime = 'file-alt';
14034 } elseif (preg_match('/\.css$/i', $tmpfile)) {
14035 $mime = 'text/css';
14036 $imgmime = 'css.png';
14038 $famime = 'file-alt';
14039 } elseif (preg_match('/\.lang$/i', $tmpfile)) {
14040 $mime = 'text/plain';
14041 $imgmime = 'text.png';
14043 $famime = 'file-alt';
14044 } elseif (preg_match('/\.(crt|cer|key|pub)$/i', $tmpfile)) { // Certificate files
14045 $mime = 'text/plain';
14046 $imgmime = 'text.png';
14047 $famime = 'file-alt';
14048 } elseif (preg_match('/\.(html|htm|shtml)$/i', $tmpfile)) { // XML based (HTML/XML/XAML)
14049 $mime = 'text/html';
14050 $imgmime = 'html.png';
14052 $famime = 'file-alt';
14053 } elseif (preg_match('/\.(xml|xhtml)$/i', $tmpfile)) {
14054 $mime = 'text/xml';
14055 $imgmime = 'other.png';
14057 $famime = 'file-alt';
14058 } elseif (preg_match('/\.xaml$/i', $tmpfile)) {
14059 $mime = 'text/xml';
14060 $imgmime = 'other.png';
14062 $famime = 'file-alt';
14063 } elseif (preg_match('/\.bas$/i', $tmpfile)) { // Languages
14064 $mime = 'text/plain';
14065 $imgmime = 'text.png';
14067 $famime = 'file-code';
14068 } elseif (preg_match('/\.(c)$/i', $tmpfile)) {
14069 $mime = 'text/plain';
14070 $imgmime = 'text.png';
14072 $famime = 'file-code';
14073 } elseif (preg_match('/\.(cpp)$/i', $tmpfile)) {
14074 $mime = 'text/plain';
14075 $imgmime = 'text.png';
14077 $famime = 'file-code';
14078 } elseif (preg_match('/\.cs$/i', $tmpfile)) {
14079 $mime = 'text/plain';
14080 $imgmime = 'text.png';
14082 $famime = 'file-code';
14083 } elseif (preg_match('/\.(h)$/i', $tmpfile)) {
14084 $mime = 'text/plain';
14085 $imgmime = 'text.png';
14087 $famime = 'file-code';
14088 } elseif (preg_match('/\.(java|jsp)$/i', $tmpfile)) {
14089 $mime = 'text/plain';
14090 $imgmime = 'text.png';
14092 $famime = 'file-code';
14093 } elseif (preg_match('/\.php([0-9]{1})?$/i', $tmpfile)) {
14094 $mime = 'text/plain';
14095 $imgmime = 'php.png';
14097 $famime = 'file-code';
14098 } elseif (preg_match('/\.phtml$/i', $tmpfile)) {
14099 $mime = 'text/plain';
14100 $imgmime = 'php.png';
14102 $famime = 'file-code';
14103 } elseif (preg_match('/\.(pl|pm)$/i', $tmpfile)) {
14104 $mime = 'text/plain';
14105 $imgmime = 'pl.png';
14107 $famime = 'file-code';
14108 } elseif (preg_match('/\.sql$/i', $tmpfile)) {
14109 $mime = 'text/plain';
14110 $imgmime = 'text.png';
14112 $famime = 'file-code';
14113 } elseif (preg_match('/\.js$/i', $tmpfile)) {
14114 $mime = 'text/x-javascript';
14115 $imgmime = 'jscript.png';
14117 $famime = 'file-code';
14118 } elseif (preg_match('/\.odp$/i', $tmpfile)) { // Open office
14119 $mime = 'application/vnd.oasis.opendocument.presentation';
14120 $imgmime = 'ooffice.png';
14121 $famime = 'file-powerpoint';
14122 } elseif (preg_match('/\.ods$/i', $tmpfile)) {
14123 $mime = 'application/vnd.oasis.opendocument.spreadsheet';
14124 $imgmime = 'ooffice.png';
14125 $famime = 'file-excel';
14126 } elseif (preg_match('/\.odt$/i', $tmpfile)) {
14127 $mime = 'application/vnd.oasis.opendocument.text';
14128 $imgmime = 'ooffice.png';
14129 $famime = 'file-word';
14130 } elseif (preg_match('/\.mdb$/i', $tmpfile)) { // MS Office
14131 $mime = 'application/msaccess';
14132 $imgmime = 'mdb.png';
14134 } elseif (preg_match('/\.doc[xm]?$/i', $tmpfile)) {
14135 $mime = 'application/msword';
14136 $imgmime = 'doc.png';
14137 $famime = 'file-word';
14138 } elseif (preg_match('/\.dot[xm]?$/i', $tmpfile)) {
14139 $mime = 'application/msword';
14140 $imgmime = 'doc.png';
14141 $famime = 'file-word';
14142 } elseif (preg_match('/\.xlt(x)?$/i', $tmpfile)) {
14143 $mime = 'application/vnd.ms-excel';
14144 $imgmime = 'xls.png';
14145 $famime = 'file-excel';
14146 } elseif (preg_match('/\.xla(m)?$/i', $tmpfile)) {
14147 $mime = 'application/vnd.ms-excel';
14148 $imgmime = 'xls.png';
14149 $famime = 'file-excel';
14150 } elseif (preg_match('/\.xls$/i', $tmpfile)) {
14151 $mime = 'application/vnd.ms-excel';
14152 $imgmime = 'xls.png';
14153 $famime = 'file-excel';
14154 } elseif (preg_match('/\.xls[bmx]$/i', $tmpfile)) {
14155 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
14156 $imgmime = 'xls.png';
14157 $famime = 'file-excel';
14158 } elseif (preg_match('/\.pps[mx]?$/i', $tmpfile)) {
14159 $mime = 'application/vnd.ms-powerpoint';
14160 $imgmime = 'ppt.png';
14161 $famime = 'file-powerpoint';
14162 } elseif (preg_match('/\.ppt[mx]?$/i', $tmpfile)) {
14163 $mime = 'application/x-mspowerpoint';
14164 $imgmime = 'ppt.png';
14165 $famime = 'file-powerpoint';
14166 } elseif (preg_match('/\.pdf$/i', $tmpfile)) { // Other
14167 $mime = 'application/pdf';
14168 $imgmime = 'pdf.png';
14169 $famime = 'file-pdf';
14170 } elseif (preg_match('/\.bat$/i', $tmpfile)) { // Scripts
14171 $mime = 'text/x-bat';
14172 $imgmime = 'script.png';
14174 $famime = 'file-code';
14175 } elseif (preg_match('/\.sh$/i', $tmpfile)) {
14176 $mime = 'text/x-sh';
14177 $imgmime = 'script.png';
14179 $famime = 'file-code';
14180 } elseif (preg_match('/\.ksh$/i', $tmpfile)) {
14181 $mime = 'text/x-ksh';
14182 $imgmime = 'script.png';
14184 $famime = 'file-code';
14185 } elseif (preg_match('/\.bash$/i', $tmpfile)) {
14186 $mime = 'text/x-bash';
14187 $imgmime = 'script.png';
14189 $famime = 'file-code';
14190 } elseif (preg_match('/\.ico$/i', $tmpfile)) { // Images
14191 $mime = 'image/x-icon';
14192 $imgmime = 'image.png';
14193 $famime = 'file-image';
14194 } elseif (preg_match('/\.(jpg|jpeg)$/i', $tmpfile)) {
14195 $mime = 'image/jpeg';
14196 $imgmime = 'image.png';
14197 $famime = 'file-image';
14198 } elseif (preg_match('/\.png$/i', $tmpfile)) {
14199 $mime = 'image/png';
14200 $imgmime = 'image.png';
14201 $famime = 'file-image';
14202 } elseif (preg_match('/\.gif$/i', $tmpfile)) {
14203 $mime = 'image/gif';
14204 $imgmime = 'image.png';
14205 $famime = 'file-image';
14206 } elseif (preg_match('/\.bmp$/i', $tmpfile)) {
14207 $mime = 'image/bmp';
14208 $imgmime = 'image.png';
14209 $famime = 'file-image';
14210 } elseif (preg_match('/\.(tif|tiff)$/i', $tmpfile)) {
14211 $mime = 'image/tiff';
14212 $imgmime = 'image.png';
14213 $famime = 'file-image';
14214 } elseif (preg_match('/\.svg$/i', $tmpfile)) {
14215 $mime = 'image/svg+xml';
14216 $imgmime = 'image.png';
14217 $famime = 'file-image';
14218 } elseif (preg_match('/\.webp$/i', $tmpfile)) {
14219 $mime = 'image/webp';
14220 $imgmime = 'image.png';
14221 $famime = 'file-image';
14222 } elseif (preg_match('/\.vcs$/i', $tmpfile)) { // Calendar
14223 $mime = 'text/calendar';
14224 $imgmime = 'other.png';
14225 $famime = 'file-alt';
14226 } elseif (preg_match('/\.ics$/i', $tmpfile)) {
14227 $mime = 'text/calendar';
14228 $imgmime = 'other.png';
14229 $famime = 'file-alt';
14230 } elseif (preg_match('/\.torrent$/i', $tmpfile)) { // Other
14231 $mime = 'application/x-bittorrent';
14232 $imgmime = 'other.png';
14233 $famime = 'file-o';
14234 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) { // Audio
14236 $imgmime = 'audio.png';
14237 $famime = 'file-audio';
14238 } elseif (preg_match('/\.mp4$/i', $tmpfile)) { // Video
14239 $mime = 'video/mp4';
14240 $imgmime = 'video.png';
14241 $famime = 'file-video';
14242 } elseif (preg_match('/\.ogv$/i', $tmpfile)) {
14243 $mime = 'video/ogg';
14244 $imgmime = 'video.png';
14245 $famime = 'file-video';
14246 } elseif (preg_match('/\.webm$/i', $tmpfile)) {
14247 $mime = 'video/webm';
14248 $imgmime = 'video.png';
14249 $famime = 'file-video';
14250 } elseif (preg_match('/\.avif$/i', $tmpfile)) {
14251 $mime = 'image/avif';
14252 $imgmime = 'image.png';
14253 $famime = 'file-image';
14254 } elseif (preg_match('/\.avi$/i', $tmpfile)) {
14255 $mime = 'video/x-msvideo';
14256 $imgmime = 'video.png';
14257 $famime = 'file-video';
14258 } elseif (preg_match('/\.divx$/i', $tmpfile)) {
14259 $mime = 'video/divx';
14260 $imgmime = 'video.png';
14261 $famime = 'file-video';
14262 } elseif (preg_match('/\.xvid$/i', $tmpfile)) {
14263 $mime = 'video/xvid';
14264 $imgmime = 'video.png';
14265 $famime = 'file-video';
14266 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
14268 $imgmime = 'video.png';
14269 $famime = 'file-video';
14270 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) { // Archive
14271 // application/xxx where zzz is zip, ...
14273 $imgmime = 'archive.png';
14274 $famime = 'file-archive';
14275 } elseif (preg_match('/\.(exe|com)$/i', $tmpfile)) { // Exe
14276 $mime = 'application/octet-stream';
14277 $imgmime = 'other.png';
14278 $famime = 'file-o';
14279 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i', $tmpfile)) { // Lib
14281 $imgmime = 'library.png';
14282 $famime = 'file-o';
14283 } elseif (preg_match('/\.err$/i', $tmpfile)) { // phpcs:ignore
14285 $imgmime = 'error.png';
14286 $famime = 'file-alt';
14289 if ($famime == 'file-o') {
14290 // file-o seems to not work in fontawesome 5
14294 // Return mimetype string
14295 switch ((int) $mode) {
14297 $tmp = explode('/', $mime);
14298 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
14320function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid')
14324 $tablename = preg_replace('/^' . preg_quote(MAIN_DB_PREFIX, '/') . '/', '', $tablename); // Clean name of table for backward compatibility.
14326 $dictvalues = (isset($conf->cache['dictvalues_' . $tablename]) ? $conf->cache['dictvalues_' . $tablename] : null);
14328 if (is_null($dictvalues)) {
14329 $dictvalues = array();
14331 $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
14332 if ($checkentity) {
14333 $sql .= ' AND entity IN (0,' . getEntity($tablename) . ')';
14336 $resql = $db->query($sql);
14338 while ($obj = $db->fetch_object($resql)) {
14339 $dictvalues[$obj->$rowidfield] = $obj; // $obj is stdClass
14342 dol_print_error($db);
14345 $conf->cache['dictvalues_' . $tablename] = $dictvalues;
14348 if (!empty($dictvalues[$id])) {
14350 $tmp = $dictvalues[$id];
14351 return (property_exists($tmp, $field) ? $tmp->$field : '');
14364function colorIsLight($stringcolor)
14366 $stringcolor = str_replace('#', '', $stringcolor);
14368 if (!empty($stringcolor)) {
14370 $tmp = explode(',', $stringcolor);
14371 if (count($tmp) > 1) { // This is a comma RGB ('255','255','255')
14376 $hexr = $stringcolor[0] . $stringcolor[1];
14377 $hexg = $stringcolor[2] . $stringcolor[3];
14378 $hexb = $stringcolor[4] . $stringcolor[5];
14379 $r = hexdec($hexr);
14380 $g = hexdec($hexg);
14381 $b = hexdec($hexb);
14383 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0; // HSL algorithm
14384 if ($bright > 0.6) {
14399function isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
14401 //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms'];
14402 //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal);
14403 if (empty($menuentry['enabled'])) {
14404 return 0; // Entry disabled by condition
14406 if ($type_user && array_key_exists('module', $menuentry) && $menuentry['module']) {
14407 $tmploops = explode('|', $menuentry['module']);
14409 foreach ($tmploops as $tmploop) {
14410 if (in_array($tmploop, $listofmodulesforexternal)) {
14416 return 0; // Entry is for menus all excluded to external users
14419 if (!$menuentry['perms'] && $type_user) {
14420 return 0; // No permissions and user is external
14422 if (!$menuentry['perms'] && getDolGlobalString('MAIN_MENU_HIDE_UNAUTHORIZED')) {
14423 return 0; // No permissions and option to hide when not allowed, even for internal user, is on
14425 if (!$menuentry['perms']) {
14426 return 2; // No permissions and user is external
14438function roundUpToNextMultiple($n, $x = 5)
14440 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
14441 return (int) $result;
14455function dolGetBadge($label, $html = '', $type = 'primary', $mode = '', $url = '', $params = array())
14457 $csstouse = 'badge';
14458 $csstouse .= (!empty($mode) ? ' badge-' . $mode : '');
14459 $csstouse .= (!empty($type) ? ' badge-' . $type : '');
14460 $csstouse .= (empty($params['css']) ? '' : ' ' . $params['css']);
14463 'class' => $csstouse
14466 if (empty($html)) {
14470 if (!empty($url)) {
14471 $attr['href'] = $url;
14474 if ($mode === 'dot') {
14475 $attr['class'] .= ' classfortooltip';
14476 $attr['title'] = $html;
14477 $attr['aria-label'] = $label;
14482 if (!empty($params['attr']) && is_array($params['attr'])) {
14483 foreach ($params['attr'] as $key => $value) {
14484 if ($key == 'class') {
14485 $attr['class'] .= ' ' . $value;
14486 } elseif ($key == 'classOverride') {
14487 $attr['class'] = $value;
14489 $attr[$key] = $value;
14496 // escape all attribute
14497 $attr = array_map('dolPrintHTMLForAttribute', $attr);
14499 $TCompiledAttr = array();
14500 foreach ($attr as $key => $value) {
14501 $TCompiledAttr[] = $key . '="
' . $value . '"';
14504 $compiledAttributes = !empty($TCompiledAttr) ? implode(' ', $TCompiledAttr) : '';
14506 $tag = !empty($url) ? 'a' : 'span';
14508 return '<' . $tag . ' ' . $compiledAttributes . '>' . $html . '</' . $tag . '>';
14524function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $statusType = 'status0', $displayMode = 0, $url = '', $params = array())
14529 $dolGetBadgeParams = array();
14531 if (!empty($params['badgeParams'])) {
14532 $dolGetBadgeParams = $params['badgeParams'];
14535 // TODO : add a hook
14536 if ($displayMode == 0) {
14537 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
14538 } elseif ($displayMode == 1) {
14539 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14540 } elseif (getDolGlobalString('MAIN_STATUS_USES_IMAGES')) {
14541 // Use status with images (for backward compatibility)
14543 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ? '<span class="hideonsmartphone
">' : '') . (!empty($html) ? $html : $statusLabel) . (in_array($displayMode, array(1, 2, 5)) ? '</span>' : '');
14544 $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>' : '');
14546 // For small screen, we always use the short label instead of long label.
14547 if (!empty($conf->dol_optimize_smallscreen)) {
14548 if ($displayMode == 0) {
14550 } elseif ($displayMode == 4) {
14552 } elseif ($displayMode == 6) {
14557 // For backward compatibility. Image's filename are still in French, so we use this array to convert
14558 $statusImg = array(
14559 'status0' => 'statut0',
14560 'status1' => 'statut1',
14561 'status2' => 'statut2',
14562 'status3' => 'statut3',
14563 'status4' => 'statut4',
14564 'status5' => 'statut5',
14565 'status6' => 'statut6',
14566 'status7' => 'statut7',
14567 'status8' => 'statut8',
14568 'status9' => 'statut9'
14571 if (!empty($statusImg[$statusType])) {
14572 $htmlImg = img_picto($statusLabel, $statusImg[$statusType]);
14574 $htmlImg = img_picto($statusLabel, $statusType);
14577 if ($displayMode === 2) {
14578 $return = $htmlImg . ' ' . $htmlLabelShort;
14579 } elseif ($displayMode === 3) {
14580 $return = $htmlImg;
14581 } elseif ($displayMode === 4) {
14582 $return = $htmlImg . ' ' . $htmlLabel;
14583 } elseif ($displayMode === 5) {
14584 $return = $htmlLabelShort . ' ' . $htmlImg;
14585 } else { // $displayMode >= 6
14586 $return = $htmlLabel . ' ' . $htmlImg;
14588 } elseif (!getDolGlobalString('MAIN_STATUS_USES_IMAGES') && !empty($displayMode)) {
14590 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14592 $dolGetBadgeParams['attr']['class'] = 'badge-status';
14593 if (empty($dolGetBadgeParams['attr']['title'])) {
14594 $dolGetBadgeParams['attr']['title'] = empty($params['tooltip']) ? $statusLabel : ($params['tooltip'] != 'no' ? $params['tooltip'] : '');
14595 } else { // If a title was forced from $params['badgeParams']['attr']['title'], we set the class to get it as a tooltip.
14596 $dolGetBadgeParams['attr']['class'] .= ' classfortooltip';
14597 // And if we use tooltip, we can output title in HTML @phan-suppress-next-line PhanTypeInvalidDimOffset
14598 $dolGetBadgeParams['attr']['title'] = dol_htmlentitiesbr((string) $dolGetBadgeParams['attr']['title'], 1);
14601 if ($displayMode == 3) {
14602 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), '', $statusType, 'dot', $url, $dolGetBadgeParams);
14603 } elseif ($displayMode === 5) {
14604 $return = dolGetBadge($statusLabelShort, $html, $statusType, '', $url, $dolGetBadgeParams);
14606 $return = dolGetBadge(((empty($conf->dol_optimize_smallscreen) && $displayMode != 2) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType, '', $url, $dolGetBadgeParams);
14649function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = '', $id = '', $userRight = 1, $params = array())
14651 global $hookmanager, $action, $object, $langs;
14653 // If $url is an array, we must build a dropdown button or recursively iterate over each value
14654 if (is_array($url)) {
14655 // Loop on $url array to remove entries of disabled modules
14656 foreach ($url as $key => $subbutton) {
14657 if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
14664 if (array_key_exists('areDropdownButtons', $params) && $params["areDropdownButtons
"] === false) { // @phan-suppress-current-line PhanTypeInvalidDimOffset
14665 foreach ($url as $button) {
14666 if (!empty($button['lang'])) {
14667 $langs->load($button['lang']);
14669 $label = $langs->trans($button['label']);
14670 $text = $button['text'] ?? '';
14671 $actionType = $button['actionType'] ?? '';
14672 $tmpUrl = DOL_URL_ROOT . $button['url'] . (empty($params['backtopage']) ? '' : '&backtopage=' . urlencode($params['backtopage']));
14673 $id = $button['id'] ?? '';
14674 $userRight = $button['perm'] ?? 1;
14675 $button['params'] = $button['params'] ?? []; // @phan-suppress-current-line PhanPluginDuplicateExpressionAssignmentOperation
14677 $out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
14682 if (count($url) > 1) {
14683 $out .= '<div class="dropdown
inline-block dropdown-holder
">';
14684 $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>';
14685 $out .= '<div class="dropdown-content
">';
14686 foreach ($url as $subbutton) {
14687 if (!empty($subbutton['lang'])) {
14688 $langs->load($subbutton['lang']);
14691 if (!empty($subbutton['urlraw'])) {
14692 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14694 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14695 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14698 $subbuttonparam = array();
14699 if (!empty($subbutton['attr'])) {
14700 $subbuttonparam['attr'] = $subbutton['attr'];
14702 $subbuttonparam['isDropDown'] = (empty($params['isDropDown']) ? ($subbutton['isDropDown'] ?? false) : $params['isDropDown']);
14704 $out .= dolGetButtonAction($subbutton['text'] ?? '', $langs->trans($subbutton['label']), 'default', $tmpurl, $subbutton['id'] ?? '', $subbutton['perm'], $subbuttonparam);
14709 foreach ($url as $subbutton) { // Should loop on 1 record only
14710 if (!empty($subbutton['lang'])) {
14711 $langs->load($subbutton['lang']);
14714 if (!empty($subbutton['urlraw'])) {
14715 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14717 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14718 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14721 $label = $langs->trans($subbutton['label']);
14722 $text = $subbutton['text'] ?? '';
14723 if (empty($text)) {
14728 $out .= dolGetButtonAction($label, $text, 'default', $tmpurl, '', $subbutton['perm'], $params);
14735 // Here, $url is a simple link
14736 if (!empty($params['isDropdown']) || !empty($params['isDropDown'])) { // Use the dropdown-item style (not for action button)
14737 $class = "dropdown-item
";
14739 $class = 'butAction';
14740 if ($actionType == 'edit') {
14741 $class = 'butAction butActionEdit';
14742 } elseif ($actionType == 'email') {
14743 $class = 'butAction butActionEmail';
14744 } elseif ($actionType == 'clone') {
14745 $class = 'butAction butActionClone';
14746 } elseif ($actionType == 'cancel') {
14747 $class = 'butAction butActionDelete';
14748 } elseif ($actionType == 'danger' || $actionType == 'delete') {
14749 $class = 'butAction butActionDelete';
14750 if (!empty($url) && strpos($url, 'token=') === false) {
14751 $url .= '&token=' . newToken();
14757 'href' => empty($url) ? '' : $url,
14761 if (empty($text)) {
14763 $attr['title'] = ''; // if html not set, using label on title is redundant
14765 $attr['title'] = $label;
14766 $attr['aria-label'] = $label;
14769 if (empty($userRight) || $userRight < 0) {
14770 $attr['class'] = 'butActionRefused';
14771 $attr['href'] = '';
14772 $attr['title'] = (($label && $text && $label != $text) ? $label : '');
14773 $attr['title'] = ($attr['title'] ? $attr['title'] . (empty($userRight) ? '<br>' : '') : '');
14774 $attr['title'] .= ((empty($userRight) && empty($label)) ? $langs->trans('NotEnoughPermissions') : '');
14782 if (!empty($params['attr']) && is_array($params['attr'])) {
14783 foreach ($params['attr'] as $key => $value) {
14784 if ($key == 'class') {
14785 $attr['class'] .= ' ' . $value;
14786 } elseif ($key == 'classOverride') {
14787 $attr['class'] = $value;
14789 $attr[$key] = $value;
14794 // automatic add tooltip when title is detected
14795 if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
14796 $attr['class'] .= ' classfortooltip';
14799 // Js Confirm button
14800 if ($userRight && !empty($params['confirm'])) {
14801 if (!is_array($params['confirm'])) {
14802 $params['confirm'] = array();
14805 if (empty($params['confirm']['url'])) {
14806 $params['confirm']['url'] = $url . (strpos($url, '?') > 0 ? '&' : '?') . 'confirm=yes';
14809 // for js disabled compatibility set $url as call to confirm action and $params['confirm']['url'] to confirmed action
14810 $attr['data-confirm-url'] = $params['confirm']['url'];
14811 $attr['data-confirm-title'] = !empty($params['confirm']['title']) ? $params['confirm']['title'] : $langs->trans('ConfirmBtnCommonTitle', $label);
14812 $attr['data-confirm-content'] = !empty($params['confirm']['content']) ? $params['confirm']['content'] : $langs->trans('ConfirmBtnCommonContent', $label);
14813 $attr['data-confirm-content'] = preg_replace("/\r|\n/
", "", $attr['data-confirm-content']);
14814 $attr['data-confirm-action-btn-label'] = !empty($params['confirm']['action-btn-label']) ? $params['confirm']['action-btn-label'] : $langs->trans('Confirm');
14815 $attr['data-confirm-cancel-btn-label'] = !empty($params['confirm']['cancel-btn-label']) ? $params['confirm']['cancel-btn-label'] : $langs->trans('CloseDialog');
14816 $attr['data-confirm-modal'] = !empty($params['confirm']['modal']) ? $params['confirm']['modal'] : true;
14818 $attr['class'] .= ' butActionConfirm';
14821 if (isset($attr['href']) && empty($attr['href'])) {
14822 unset($attr['href']);
14825 // TODO replace this $TCompiledAttr generation block by commonHtmlAttributeBuilder like line below
14826 // $TCompiledAttr = commonHtmlAttributeBuilder($attr, $params['use_unsecured_unescapedattr'] ?? []);
14827 $TCompiledAttr = array();
14828 foreach ($attr as $key => $value) {
14829 if (!empty($params['use_unsecured_unescapedattr']) && is_array($params['use_unsecured_unescapedattr']) && in_array($key, $params['use_unsecured_unescapedattr'])) {
14830 // Deprecated, forbidden.
14831 $value = dol_htmlentities($value, ENT_QUOTES | ENT_SUBSTITUTE);
14832 } elseif ($key == 'href') {
14833 $value = dolPrintHTMLForAttributeUrl($value);
14835 $value = dolPrintHTMLForAttribute($value);
14838 $TCompiledAttr[] = $key . '="' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14840 $compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
14842 $tag = !empty($attr['href']) ? 'a' : 'span';
14844 $parameters = array(
14845 'TCompiledAttr' => $TCompiledAttr, // array
14846 'compiledAttributes' => $compiledAttributes, // string
14851 'actionType' => $actionType,
14854 'userRight' => $userRight,
14855 'params' => $params
14858 $reshook = $hookmanager->executeHooks('dolGetButtonAction', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
14859 if ($reshook < 0) {
14860 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
14863 if (empty($reshook)) {
14864 if (dol_textishtml($text)) { // If content already HTML encoded
14865 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . $text . '</span></' . $tag . '>';
14867 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . dol_escape_htmltag($text) . '</span></' . $tag . '>';
14870 return $hookmanager->resPrint;
14904function commonHtmlAttributeBuilder($attr, array $unescapedAttr = [])
14906 $TCompiledAttr = array();
14907 if (empty($attr)) {
14911 foreach ($attr as $key => $value) {
14912 // special boolean attributes case
14913 if (in_array($key, getListOfHtmlBooleanAttributes())) {
14915 $TCompiledAttr[$key] = $key;
14920 if (!empty($unescapedAttr) && in_array($key, $unescapedAttr)) {
14922 $value = dol_htmlentities((string) $value, ENT_QUOTES | ENT_SUBSTITUTE);
14923 } elseif ($key == 'href') {
14924 $value = dolPrintHTMLForAttributeUrl((string) $value);
14926 $value = dolPrintHTMLForAttribute((string) $value);
14929 $TCompiledAttr[$key] = $key . '="
' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14932 return $TCompiledAttr;
14949function getListOfHtmlBooleanAttributes(): array
14998function dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot = true)
15004 $parsedUrl = parse_url($url);
15005 if ((isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], ['javascript', 'mailto', 'tel'])) || strpos($url, '#') === 0) {
15009 if (!empty($parsedUrl['query'])) {
15010 // Use parse_str() function to parse the string passed via URL
15012 parse_str($parsedUrl['query'], $urlQuery);
15013 if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
15014 $url .= '&backtopage=' . urlencode($params['backtopage']);
15018 if (!isset($parsedUrl['scheme']) && $addDolUrlRoot) {
15019 $url = DOL_URL_ROOT . $url;
15032function dolGetButtonTitleSeparator($moreClass = "
")
15034 return '<span class="button-title-separator
' . $moreClass . '" ></span>';
15043function getFieldErrorIcon($fieldValidationErrorMsg)
15046 if (!empty($fieldValidationErrorMsg)) {
15047 $out .= '<span class="field-error-icon classfortooltip
" title="' . dol_escape_htmltag($fieldValidationErrorMsg, 1) . '" role="alert
" >'; // role alert is used for accessibility
15048 $out .= '<span class="fa fa-exclamation-circle
" aria-hidden="true" ></span>'; // For accessibility icon is separated and aria-hidden
15067function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $url = '', $id = '', $status = 1, $params = array())
15069 global $langs, $user;
15071 // Actually this conf is used in css too for external module compatibility and smooth transition to this function
15072 if (getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
15075 // Fix old picto fa-th-list to use fa-grid-vertical instead
15076 if ($iconClass == 'fa fa-th-list imgforviewmode') {
15077 $iconClass = ' fa fa-grip-horizontal imgforviewmode';
15080 $class = 'btnTitle';
15081 if (in_array($iconClass, array('fa fa-plus-circle', 'fa fa-plus-circle size15x', 'fa fa-comment-dots', 'fa fa-paper-plane'))) {
15082 $class .= ' btnTitlePlus';
15084 $useclassfortooltip = 1;
15086 if (!empty($params['morecss'])) {
15087 $class .= ' ' . $params['morecss'];
15092 'href' => empty($url) ? '' : $url
15095 if (!empty($helpText)) {
15096 $attr['title'] = $helpText;
15097 } elseif ($label) { // empty($attr['title']) &&
15098 $attr['title'] = $label;
15099 $useclassfortooltip = 0;
15102 if ($status == 2) {
15103 $attr['class'] .= ' btnTitleSelected';
15104 } elseif ($status <= 0) {
15105 $attr['class'] .= ' refused';
15107 $attr['href'] = '';
15109 if ($status == -1) { // disable
15110 $attr['title'] = $langs->transnoentitiesnoconv("FeatureDisabled
");
15111 } elseif ($status == 0) { // Not enough permissions
15112 $attr['title'] = $langs->transnoentitiesnoconv("NotEnoughPermissions
");
15116 if (!empty($attr['title']) && $useclassfortooltip) {
15117 $attr['class'] .= ' classfortooltip';
15125 if (!empty($params['attr']) && is_array($params['attr'])) {
15126 foreach ($params['attr'] as $key => $value) {
15127 if ($key == 'class') {
15128 $attr['class'] .= ' ' . $value;
15129 } elseif ($key == 'classOverride') {
15130 $attr['class'] = $value;
15132 $attr[$key] = $value;
15137 if (isset($attr['href']) && empty($attr['href'])) {
15138 unset($attr['href']);
15141 // TODO : add a hook
15143 // Generate attributes with escapement
15144 $TCompiledAttr = array();
15145 foreach ($attr as $key => $value) {
15146 $TCompiledAttr[] = $key . '="' . dol_escape_htmltag($value) . '"'; // Do not use dolPrintHTMLForAttribute() here, we must accept "javascript:
string"
15149 $compiledAttributes = (empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr));
15151 $tag = (empty($attr['href']) ? 'span' : 'a');
15153 $button = '<' . $tag . ' ' . $compiledAttributes . '>';
15154 $button .= '<span class="' . $iconClass . ' valignmiddle btnTitle-icon
"></span>';
15155 if (!empty($params['forcenohideoftext'])) {
15156 $button .= '<span class="valignmiddle text-plus-circle btnTitle-label
' . (empty($params['forcenohideoftext
']) ? ' hideonsmartphone
' : '') . '">' . $label . '</span>';
15158 $button .= '</' . $tag . '>';
15173function getElementProperties($elementType)
15175 global $conf, $db, $hookmanager;
15179 //$element_type='facture';
15181 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element = '';
15183 // Parse element/subelement
15184 $module = $elementType;
15185 $element = $elementType;
15186 $subelement = $elementType;
15187 $table_element = $elementType;
15189 // If we ask a resource form external module (instead of default path)
15190 if (preg_match('/^([^@]+)@([^@]+)$/i', $elementType, $regs)) { // 'myobject@mymodule'
15191 $element = $subelement = $regs[1];
15192 $module = $regs[2];
15195 // If we ask a resource for a string with an element and a subelement
15196 // Example 'project_task'
15197 if (preg_match('/^([^_]+)_([^_]+)/i', $element, $regs)) { // 'myobject_mysubobject' with myobject=mymodule
15198 $module = $element = $regs[1];
15199 $subelement = $regs[2];
15202 // Object lines will use parent classpath and module ref
15203 if (substr($elementType, -3) == 'det') {
15204 $module = preg_replace('/det$/', '', $element);
15205 $subelement = preg_replace('/det$/', '', $subelement);
15206 $classpath = $module . '/class';
15207 $classfile = $module;
15208 $classname = preg_replace('/det$/', 'Line', $element);
15209 if (in_array($module, array('expedition', 'propale', 'facture', 'contrat', 'fichinter', 'supplier_order', 'commandefournisseur'))) {
15210 $classname = preg_replace('/det$/', 'Ligne', $element);
15213 // For compatibility and to work with non standard path
15214 if ($elementType == "action
" || $elementType == "actioncomm
") {
15215 $classpath = 'comm/action/class';
15216 $subelement = 'Actioncomm';
15217 $module = 'agenda';
15218 $table_element = 'actioncomm';
15219 } elseif ($elementType == 'cronjob') {
15220 $classpath = 'cron/class';
15222 $table_element = 'cron';
15223 } elseif ($elementType == 'adherent_type') {
15224 $classpath = 'adherents/class';
15225 $classfile = 'adherent_type';
15226 $module = 'adherent';
15227 $subelement = 'adherent_type';
15228 $classname = 'AdherentType';
15229 $table_element = 'adherent_type';
15230 } elseif ($elementType == 'bank_account') {
15231 $classpath = 'compta/bank/class';
15232 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
15233 $classfile = 'account';
15234 $classname = 'Account';
15235 } elseif ($elementType == 'bank_line') {
15236 $classpath = 'compta/bank/class';
15237 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
15238 $classfile = 'account';
15239 $classname = 'AccountLine';
15240 } elseif ($elementType == 'category') {
15241 $classpath = 'categories/class';
15242 $module = 'categorie';
15243 $subelement = 'categorie';
15244 $table_element = 'categorie';
15245 } elseif ($elementType == 'contact') {
15246 $classpath = 'contact/class';
15247 $classfile = 'contact';
15248 $module = 'societe';
15249 $subelement = 'contact';
15250 $table_element = 'socpeople';
15251 } elseif ($elementType == 'inventory') {
15252 $module = 'product';
15253 $classpath = 'product/inventory/class';
15254 } elseif ($elementType == 'inventoryline') {
15255 $module = 'product';
15256 $classpath = 'product/inventory/class';
15257 $table_element = 'inventorydet';
15258 $parent_element = 'inventory';
15259 } elseif ($elementType == 'stock' || $elementType == 'entrepot' || $elementType == 'warehouse') {
15261 $classpath = 'product/stock/class';
15262 $classfile = 'entrepot';
15263 $classname = 'Entrepot';
15264 $table_element = 'entrepot';
15265 } elseif ($elementType == 'project') {
15266 $classpath = 'projet/class';
15267 $module = 'projet';
15268 $table_element = 'projet';
15269 } elseif ($elementType == 'project_task') {
15270 $classpath = 'projet/class';
15271 $module = 'projet';
15272 $subelement = 'task';
15273 $table_element = 'projet_task';
15274 } elseif ($elementType == 'mo') {
15275 $classpath = 'mrp/class';
15279 $table_element = 'mrp_mo';
15280 } elseif ($elementType == 'facture' || $elementType == 'invoice') {
15281 $classpath = 'compta/facture/class';
15282 $module = 'facture';
15283 $subelement = 'facture';
15284 $table_element = 'facture';
15285 } elseif ($elementType == 'facturedet') {
15286 $classpath = 'compta/facture/class';
15287 $classfile = 'facture';
15288 $classname = 'FactureLigne';
15289 $module = 'facture';
15290 $table_element = 'facturedet';
15291 $parent_element = 'facture';
15292 } elseif ($elementType == 'facturerec' || $elementType == 'facture_rec') {
15293 $classpath = 'compta/facture/class';
15294 $classfile = 'facture-rec';
15295 $module = 'facture';
15296 $classname = 'FactureRec';
15297 } elseif ($elementType == 'commande' || $elementType == 'order') {
15298 $classpath = 'commande/class';
15299 $module = 'commande';
15300 $subelement = 'commande';
15301 $table_element = 'commande';
15302 } elseif ($elementType == 'commandedet') {
15303 $classpath = 'commande/class';
15304 $classfile = 'commande';
15305 $classname = 'OrderLine';
15306 $module = 'commande';
15307 $table_element = 'commandedet';
15308 $parent_element = 'commande';
15309 } elseif ($elementType == 'propal') {
15310 $classpath = 'comm/propal/class';
15311 $table_element = 'propal';
15312 } elseif ($elementType == 'propaldet') {
15313 $classpath = 'comm/propal/class';
15314 $classfile = 'propal';
15315 $subelement = 'propaleligne';
15316 $module = 'propal';
15317 $table_element = 'propaldet';
15318 $parent_element = 'propal';
15319 } elseif ($elementType == 'shipping' || $elementType == 'shipment') {
15320 $classpath = 'expedition/class';
15321 $classfile = 'expedition';
15322 $classname = 'Expedition';
15323 $module = 'expedition';
15324 $table_element = 'expedition';
15325 } elseif ($elementType == 'expeditiondet' || $elementType == 'shippingdet') {
15326 $classpath = 'expedition/class';
15327 $classfile = 'expedition';
15328 $classname = 'ExpeditionLigne';
15329 $module = 'expedition';
15330 $table_element = 'expeditiondet';
15331 $parent_element = 'expedition';
15332 } elseif ($elementType == 'delivery_note') {
15333 $classpath = 'delivery/class';
15334 $subelement = 'delivery';
15335 $module = 'expedition';
15336 } elseif ($elementType == 'delivery') {
15337 $classpath = 'delivery/class';
15338 $subelement = 'delivery';
15339 $module = 'expedition';
15340 } elseif ($elementType == 'deliverydet') {
15342 } elseif ($elementType == 'supplier_proposal') {
15343 $classpath = 'supplier_proposal/class';
15344 $module = 'supplier_proposal';
15345 $element = 'supplierproposal';
15346 $classfile = 'supplier_proposal';
15347 $subelement = 'supplierproposal';
15348 } elseif ($elementType == 'supplier_proposaldet') {
15349 $classpath = 'supplier_proposal/class';
15350 $module = 'supplier_proposal';
15351 $classfile = 'supplier_proposal';
15352 $classname = 'SupplierProposalLine';
15353 $table_element = 'supplier_proposaldet';
15354 $parent_element = 'supplier_proposal';
15355 } elseif ($elementType == 'contract') {
15356 $classpath = 'contrat/class';
15357 $module = 'contrat';
15358 $subelement = 'contrat';
15359 $table_element = 'contract';
15360 } elseif ($elementType == 'contratdet') {
15361 $classpath = 'contrat/class';
15362 $module = 'contrat';
15363 $table_element = 'contratdet';
15364 $parent_element = 'contrat';
15365 } elseif ($elementType == 'mailing') {
15366 $classpath = 'comm/mailing/class';
15367 $module = 'mailing';
15368 $classfile = 'mailing';
15369 $classname = 'Mailing';
15371 } elseif ($elementType == 'member' || $elementType == 'adherent') {
15372 $classpath = 'adherents/class';
15373 $module = 'adherent';
15374 $subelement = 'adherent';
15375 $table_element = 'adherent';
15376 } elseif ($elementType == 'subscription') {
15377 $classpath = 'adherents/class';
15378 $classfile = 'subscription';
15379 $module = 'adherent';
15380 $subelement = 'subscription';
15381 $classname = 'Subscription';
15382 $table_element = 'subscription';
15383 } elseif ($elementType == 'usergroup') {
15384 $classpath = 'user/class';
15386 } elseif ($elementType == 'mo' || $elementType == 'mrp') {
15387 $classpath = 'mrp/class';
15392 $table_element = 'mrp_mo';
15393 } elseif ($elementType == 'mrp_production') {
15394 $classpath = 'mrp/class';
15396 $classname = 'MoLine';
15399 $table_element = 'mrp_production';
15400 $parent_element = 'mo';
15401 } elseif ($elementType == 'cabinetmed_cons') {
15402 $classpath = 'cabinetmed/class';
15403 $module = 'cabinetmed';
15404 $subelement = 'cabinetmedcons';
15405 $table_element = 'cabinetmedcons';
15406 } elseif ($elementType == 'fichinter') {
15407 $classpath = 'fichinter/class';
15408 $module = 'ficheinter';
15409 $subelement = 'fichinter';
15410 $table_element = 'fichinter';
15411 } elseif ($elementType == 'dolresource' || $elementType == 'resource') {
15412 $classpath = 'resource/class';
15413 $module = 'resource';
15414 $subelement = 'dolresource';
15415 $table_element = 'resource';
15416 } elseif ($elementType == 'opensurvey_sondage') {
15417 $classpath = 'opensurvey/class';
15418 $module = 'opensurvey';
15419 $subelement = 'opensurveysondage';
15420 } elseif ($elementType == 'order_supplier' || $elementType == 'supplier_order' || $elementType == 'commande_fournisseur' || $elementType == 'commandefournisseur') {
15421 $classpath = 'fourn/class';
15422 $module = 'fournisseur';
15423 $classfile = 'fournisseur.commande';
15424 $element = 'order_supplier';
15426 $classname = 'CommandeFournisseur';
15427 $table_element = 'commande_fournisseur';
15428 } elseif ($elementType == 'commande_fournisseurdet') {
15429 $classpath = 'fourn/class';
15430 $module = 'fournisseur';
15431 $classfile = 'fournisseur.commande';
15432 $element = 'commande_fournisseurdet';
15434 $classname = 'CommandeFournisseurLigne';
15435 $table_element = 'commande_fournisseurdet';
15436 $parent_element = 'commande_fournisseur';
15437 } elseif ($elementType == 'invoice_supplier' || $elementType == 'supplier_invoice' || $elementType == 'facture_fourn') {
15438 $classpath = 'fourn/class';
15439 $module = 'fournisseur';
15440 $classfile = 'fournisseur.facture';
15441 $element = 'invoice_supplier';
15443 $classname = 'FactureFournisseur';
15444 $table_element = 'facture_fourn';
15445 } elseif ($elementType == 'facture_fourn_det') {
15446 $classpath = 'fourn/class';
15447 $module = 'fournisseur';
15448 $classfile = 'fournisseur.facture';
15449 $element = 'facture_fourn_det';
15451 $classname = 'SupplierInvoiceLine';
15452 $table_element = 'facture_fourn_det';
15453 $parent_element = 'invoice_supplier';
15454 } elseif ($elementType == "service
") {
15455 $classpath = 'product/class';
15456 $subelement = 'product';
15457 $table_element = 'product';
15458 } elseif ($elementType == 'salary') {
15459 $classpath = 'salaries/class';
15460 $module = 'salaries';
15461 } elseif ($elementType == 'payment_salary') {
15462 $classpath = 'salaries/class';
15463 $classfile = 'paymentsalary';
15464 $classname = 'PaymentSalary';
15465 $module = 'salaries';
15466 } elseif ($elementType == 'productlot') {
15467 $module = 'productbatch';
15468 $classpath = 'product/stock/class';
15469 $classfile = 'productlot';
15470 $classname = 'Productlot';
15471 $element = 'productlot';
15473 $table_element = 'product_lot';
15474 } elseif ($elementType == 'societeaccount') {
15475 $classpath = 'societe/class';
15476 $classfile = 'societeaccount';
15477 $classname = 'SocieteAccount';
15478 $module = 'societe';
15479 } elseif ($elementType == 'websitepage' || $elementType == 'website_page') {
15480 $classpath = 'website/class';
15481 $classfile = 'websitepage';
15482 $classname = 'Websitepage';
15483 $module = 'website';
15484 $subelement = 'websitepage';
15485 $table_element = 'website_page';
15486 } elseif ($elementType == 'fiscalyear') {
15487 $classpath = 'core/class';
15488 $module = 'accounting';
15489 $subelement = 'fiscalyear';
15490 } elseif ($elementType == 'chargesociales') {
15491 $classpath = 'compta/sociales/class';
15493 $table_element = 'chargesociales';
15494 } elseif ($elementType == 'tva') {
15495 $classpath = 'compta/tva/class';
15498 $table_element = 'tva';
15499 } elseif ($elementType == 'emailsenderprofile') {
15501 $classpath = 'core/class';
15502 $classfile = 'emailsenderprofile';
15503 $classname = 'EmailSenderProfile';
15504 $table_element = 'c_email_senderprofile';
15506 } elseif ($elementType == 'conferenceorboothattendee') {
15507 $classpath = 'eventorganization/class';
15508 $classfile = 'conferenceorboothattendee';
15509 $classname = 'ConferenceOrBoothAttendee';
15510 $module = 'eventorganization';
15511 } elseif ($elementType == 'conferenceorbooth') {
15512 $classpath = 'eventorganization/class';
15513 $classfile = 'conferenceorbooth';
15514 $classname = 'ConferenceOrBooth';
15515 $module = 'eventorganization';
15516 } elseif ($elementType == 'ccountry') {
15518 $classpath = 'core/class';
15519 $classfile = 'ccountry';
15520 $classname = 'Ccountry';
15521 $table_element = 'c_country';
15523 } elseif ($elementType == 'ecmfiles') {
15525 $classpath = 'ecm/class';
15526 $classfile = 'ecmfiles';
15527 $classname = 'Ecmfiles';
15528 $table_element = 'ecmfiles';
15530 } elseif ($elementType == 'knowledgerecord' || $elementType == 'knowledgemanagement') {
15531 $module = 'knowledgemanagement';
15532 $classpath = 'knowledgemanagement/class';
15533 $classfile = 'knowledgerecord';
15534 $classname = 'KnowledgeRecord';
15535 $table_element = 'knowledgemanagement_knowledgerecord';
15537 } elseif ($elementType == 'customer') {
15538 $module = 'societe';
15539 $classpath = 'societe/class';
15540 $classfile = 'client';
15541 $classname = 'Client';
15542 $table_element = 'societe';
15544 } elseif ($elementType == 'fournisseur' || $elementType == 'supplier') {
15545 $module = 'societe';
15546 $classpath = 'fourn/class';
15547 $classfile = 'fournisseur';
15548 $classname = 'Fournisseur';
15549 $table_element = 'societe';
15551 } elseif ($elementType == 'recruitmentcandidature') {
15552 $module = 'recruitment';
15553 $classfile = 'recruitmentcandidature';
15554 $classpath = 'recruitment/class';
15555 $classname = 'RecruitmentCandidature';
15556 $subelement = 'recruitmentcandidature';
15557 $subdir = '/recruitmentcandidature';
15558 } elseif ($elementType == 'recruitmentjobposition') {
15559 $module = 'recruitment';
15560 $classfile = 'recruitmentjobposition';
15561 $classpath = 'recruitment/class';
15562 $classname = 'RecruitmentJobPosition';
15563 $subelement = 'recruitmentjobposition';
15564 $subdir = '/recruitmentjobposition';
15568 if (empty($classfile)) {
15569 $classfile = strtolower($subelement);
15571 if (empty($classname)) {
15572 $classname = ucfirst($subelement);
15574 if (empty($classpath)) {
15575 $classpath = $module . '/class';
15578 //print 'getElementProperties subdir='.$subdir;
15581 if ($module && isset($conf->$module)) { // The generic case
15582 if (!empty($conf->$module->multidir_output[$conf->entity])) {
15583 $dir_output = $conf->$module->multidir_output[$conf->entity];
15584 } elseif (!empty($conf->$module->output[$conf->entity])) {
15585 $dir_output = $conf->$module->output[$conf->entity];
15586 } elseif (!empty($conf->$module->dir_output)) {
15587 $dir_output = $conf->$module->dir_output;
15589 if (!empty($conf->$module->multidir_temp[$conf->entity])) {
15590 $dir_temp = $conf->$module->multidir_temp[$conf->entity];
15591 } elseif (!empty($conf->$module->temp[$conf->entity])) {
15592 $dir_temp = $conf->$module->temp[$conf->entity];
15593 } elseif (!empty($conf->$module->dir_temp)) {
15594 $dir_temp = $conf->$module->dir_temp;
15598 // Overwrite value for special cases
15599 if ($element == 'order_supplier' && isModEnabled('fournisseur')) {
15600 $dir_output = $conf->fournisseur->commande->dir_output;
15601 $dir_temp = $conf->fournisseur->commande->dir_temp;
15602 } elseif ($element == 'invoice_supplier' && isModEnabled('fournisseur')) {
15603 $dir_output = $conf->fournisseur->facture->dir_output;
15604 $dir_temp = $conf->fournisseur->facture->dir_temp;
15606 $dir_output .= $subdir;
15607 $dir_temp .= $subdir;
15609 $elementProperties = array(
15610 'module' => $module,
15611 'element' => $element,
15612 'table_element' => $table_element,
15613 'subelement' => $subelement,
15614 'classpath' => $classpath,
15615 'classfile' => $classfile,
15616 'classname' => $classname,
15617 'dir_output' => $dir_output,
15618 'dir_temp' => $dir_temp,
15619 'parent_element' => $parent_element,
15624 if (!is_object($hookmanager)) {
15625 include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
15626 $hookmanager = new HookManager($db);
15628 $hookmanager->initHooks(array('elementproperties'));
15632 $parameters = array(
15633 'elementType' => $elementType,
15634 'elementProperties' => $elementProperties
15637 $reshook = $hookmanager->executeHooks('getElementProperties', $parameters);
15640 $elementProperties = $hookmanager->resArray;
15641 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for security against misconfigured external modules
15642 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
15645 // context of elementproperties doesn't need to exist out of this function so delete it to avoid elementproperties context is equal to all
15646 if (($key = array_search('elementproperties', $hookmanager->contextarray)) !== false) {
15647 unset($hookmanager->contextarray[$key]);
15650 return $elementProperties;
15666function fetchObjectByElement($element_id, $element_type, $element_ref = '', $useCache = 0, $maxCacheByType = 10)
15672 $element_prop = getElementProperties($element_type);
15673 //var_dump($element_prop); exit;
15675 if ($element_prop['module'] == 'product' || $element_prop['module'] == 'service') {
15676 // For example, for an extrafield 'product' (shared for both product and service) that is a link to an object,
15677 // this is called with $element_type = 'product' when we need element properties of a service, we must return a product. If we create the
15678 // extrafield for a service, it is not supported and not found when editing the product/service card. So we must keep 'product' for extrafields
15679 // of service and we will return properties of a product.
15680 $ismodenabled = (isModEnabled('product') || isModEnabled('service'));
15681 } elseif ($element_prop['module'] == 'societeaccount') {
15682 $ismodenabled = isModEnabled('website') || isModEnabled('webportal');
15684 $ismodenabled = isModEnabled($element_prop['module']);
15686 //var_dump('element_type='.$element_type);
15687 //var_dump($element_prop);
15688 //var_dump($element_prop['module'].' '.$ismodenabled);
15689 if (is_array($element_prop) && (empty($element_prop['module']) || $ismodenabled)) {
15690 if ($useCache === 1 && $element_id > 0
15691 && !empty($conf->cache['fetchObjectByElement'][$element_type])
15692 && !empty($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15693 && is_object($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15695 return $conf->cache['fetchObjectByElement'][$element_type][$element_id];
15698 dol_include_once('/' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15700 if (class_exists($element_prop['classname'])) {
15701 $className = $element_prop['classname'];
15702 $objecttmp = new $className($db);
15703 '@phan-var-force CommonObject $objecttmp';
15706 if ($element_id > 0 || !empty($element_ref)) {
15707 $ret = $objecttmp->fetch($element_id, $element_ref);
15709 if (empty($objecttmp->module)) {
15710 $objecttmp->module = $element_prop['module'];
15713 if ($useCache > 0) {
15714 if (!isset($conf->cache['fetchObjectByElement'][$element_type])) {
15715 $conf->cache['fetchObjectByElement'][$element_type] = [];
15718 // Manage cache limit
15719 if (! empty($conf->cache['fetchObjectByElement'][$element_type]) && is_array($conf->cache['fetchObjectByElement'][$element_type]) && count($conf->cache['fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
15720 array_shift($conf->cache['fetchObjectByElement'][$element_type]);
15723 $conf->cache['fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
15729 return $objecttmp; // returned an object without fetch
15732 dol_syslog($element_prop['classname'] . ' doesn\'t exists in /' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15745function getExecutableContent()
15747 $arrayofregexextension = array(
15774 return $arrayofregexextension;
15783function isAFileWithExecutableContent($filename)
15785 $arrayofregexextension = getExecutableContent();
15787 foreach ($arrayofregexextension as $fileextension) {
15788 if (preg_match('/\.' . preg_quote($fileextension, '/') . '$/i', $filename)) {
15805 return empty($_SESSION['newtoken']) ? '' : $_SESSION['newtoken'];
15815function currentToken()
15817 return isset($_SESSION['token']) ? $_SESSION['token'] : '';
15829 if (empty($conf->cache['nonce'])) {
15830 include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php';
15831 $conf->cache['nonce'] = dolGetRandomBytes(8);
15834 return $conf->cache['nonce'];
15851function startSimpleTable($header, $link = "
", $arguments = "", $emptyColumns = 0, $number = -1, $pictofulllist = '')
15855 print '<div class="div-
table-responsive-no-min
">';
15856 print '<table class="noborder centpercent
">';
15857 print '<tr class="liste_titre
">';
15859 print ($emptyColumns < 1) ? '<th>' : '<th colspan="' . ($emptyColumns + 1) . '">';
15861 print '<span class="valignmiddle
">' . $langs->trans($header) . '</span>';
15863 if (!empty($link)) {
15864 if (!empty($arguments)) {
15865 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '?
' . $arguments . '">';
15867 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '">';
15871 if ($number > -1) {
15872 print '<span class="badge marginleftonlyshort
">' . $number . '</span>';
15873 } elseif (!empty($link)) {
15874 print '<span class="badge marginleftonlyshort
">...</span>';
15877 if (!empty($link)) {
15883 if ($number < 0 && !empty($link)) {
15884 print '<th class="right
">';
15899function finishSimpleTable($addLineBreak = false)
15904 if ($addLineBreak) {
15920function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord = "None
", $extraRightColumn = false)
15925 print '<tr class="oddeven
">';
15926 print '<td colspan="' . $tableColumnCount . '"><span class="opacitymedium
">' . $langs->trans($noneWord) . '</span></td>';
15931 if ($nbofloop === 0) {
15932 // don't show a summary line
15936 /* Case already handled above, commented to satisfy phpstan.
15938 $colspan = $tableColumnCount;
15941 if ($num > $nbofloop) {
15942 $colspan = $tableColumnCount;
15944 $colspan = $tableColumnCount - 1;
15947 if ($extraRightColumn) {
15951 print '<tr class="liste_total
">';
15953 if ($nbofloop > 0 && $num > $nbofloop) {
15954 print '<td colspan="' . $colspan . '" class="right
">' . $langs->trans("XMoreLines
", ($num - $nbofloop)) . '</td>';
15956 print '<td colspan="' . $colspan . '" class="right
"> ' . $langs->trans("Total
") . '</td>';
15957 print '<td class="right centpercent
">' . price($total) . '</td>';
15960 if ($extraRightColumn) {
15975function readfileLowMemory($fullpath_original_file_osencoded, $method = -1)
15977 if ($method == -1) {
15979 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_FREAD')) {
15982 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_STREAM_COPY')) {
15987 // Be sure we don't have output buffering enabled to have readfile working correctly
15988 $level = ob_get_level();
15990 while (ob_get_level() > $level) {
15995 if ($method == 0) {
15996 readfile($fullpath_original_file_osencoded);
15997 } elseif ($method == 1) {
15999 $handle = fopen($fullpath_original_file_osencoded, "rb
");
16000 while (!feof($handle)) {
16001 print fread($handle, 8192);
16004 } elseif ($method == 2) {
16006 $handle1 = fopen($fullpath_original_file_osencoded, "rb
");
16007 $handle2 = fopen("php:
16008 stream_copy_to_stream($handle1, $handle2);
16029 $result =
'<span class="clipboardCP' . ($showonlyonhover ?
' clipboardCPShowOnHover valignmiddle' :
'') .
'">';
16030 if ($texttoshow ===
'none') {
16031 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16032 $result .=
'<span class="clipboardCPValueToPrint"></span>';
16033 } elseif ($texttoshow) {
16034 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16035 $result .=
'<span class="clipboardCPValueToPrint">' .
dol_escape_htmltag($texttoshow, 1, 1) .
'</span>';
16037 $result .=
'<' . $tag .
' class="clipboardCPValue">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16039 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="' .
dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")) .
'"></span>';
16040 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
16041 $result .=
'<span class="clipboardCPText"></span>';
16042 $result .=
'</span>';
16057 $result = json_decode($stringtodecode, $assoc);
16058 if ($result ===
null) {
16059 $result = unserialize($stringtodecode, [
'allowed_classes' =>
false]);
16086 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
16089 if (!preg_match(
'/^\(.*\)$/', $filter)) {
16090 $filter =
'(' . $filter .
')';
16093 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
16094 $firstandlastparenthesis = 0;
16096 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
16100 return 'Filter syntax error - ' . $errorstr;
16105 $t = preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeDummyCriteriaCallback', $filter);
16106 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
16109 if (preg_match(
'/[^\(\)]/', $t)) {
16110 $tmperrorstr =
'Bad syntax of the search string';
16111 $errorstr =
'Bad syntax of the search string: ' . $filter;
16115 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - " . $errorstr, LOG_WARNING);
16116 return 'Filter error - ' . $tmperrorstr;
16120 $ret = ($noand ?
"" :
" AND ") . ($nopar ?
"" :
'(') . preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeSQLCriteriaCallback', $filter) . ($nopar ?
"" :
')');
16122 if (is_object(
$db)) {
16123 $ret = str_replace(
'__NOW__',
"'" .
$db->idate(
dol_now()) .
"'", $ret);
16125 if (is_object($user)) {
16126 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
16141 $arrayofandtags = array();
16145 $parenthesislevel = 0;
16150 if ($parenthesislevel >= 1) {
16151 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
16156 $countparenthesis = 0;
16157 while ($i < $nbofchars) {
16160 if ($char ==
'(') {
16161 $countparenthesis++;
16162 } elseif ($char ==
')') {
16163 $countparenthesis--;
16166 if ($countparenthesis == 0) {
16167 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
16168 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
16169 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
16172 if (!preg_match(
'/^\(.*\)$/', $s)) {
16173 $s =
'(' . $s .
')';
16175 $arrayofandtags[] = $s;
16188 if (!preg_match(
'/^\(.*\)$/', $s)) {
16189 $s =
'(' . $s .
')';
16191 $arrayofandtags[] = $s;
16194 return $arrayofandtags;
16206function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
16210 $tmp = $sqlfilters;
16214 $parenthesislevel = 0;
16222 if ($char ==
'(') {
16223 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
16225 $parenthesislevel++;
16228 } elseif ($char ==
')') {
16229 $nbcharremaining = ($nb - $i - 1);
16230 if ($nbcharremaining >= $counter) {
16231 $parenthesislevel = min($parenthesislevel, $counter - 1);
16233 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
16234 $parenthesislevel = $counter;
16239 if ($counter < 0) {
16240 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
16241 $parenthesislevel = 0;
16249 if ($counter > 0) {
16250 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
16251 $parenthesislevel = 0;
16269 if (empty($matches[1])) {
16272 $tmp = explode(
':', $matches[1]);
16273 if (count($tmp) < 3) {
16294 if (empty($matches[1])) {
16297 $tmp = explode(
':', $matches[1], 3);
16298 if (count($tmp) < 3) {
16302 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
16304 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
16307 'NOTLIKE' =>
'NOT LIKE',
16308 'ISNOT' =>
'IS NOT',
16309 'NOTIN' =>
'NOT IN',
16313 if (array_key_exists($operator, $realOperator)) {
16314 $operator = $realOperator[$operator];
16317 $tmpescaped = $tmp[2];
16323 if ($operator ==
'IN' || $operator ==
'NOT IN') {
16324 global $dolibarr_allow_unsecured_select_in_extrafields_filter;
16327 $tmpescaped2 =
'(';
16329 $tmpelemarray = explode(
',', $tmpescaped);
16330 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
16332 $tmpelem = trim($tmpelem);
16333 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
16334 $tmpelemarray[$tmpkey] =
"'" .
$db->escape(
$db->sanitize($reg[1], 2, 1, 1, 1)) .
"'";
16335 } elseif (ctype_digit((
string) $tmpelem)) {
16336 $tmpelemarray[$tmpkey] = (int) $tmpelem;
16337 } elseif (is_numeric((
string) $tmpelem)) {
16338 $tmpelemarray[$tmpkey] = (float) $tmpelem;
16339 } elseif (!empty($dolibarr_allow_unsecured_select_in_extrafields_filter)) {
16340 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_<>=!\s]/i',
'', $tmpelem);
16342 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpelem);
16345 $tmpescaped2 .= implode(
',', $tmpelemarray);
16346 $tmpescaped2 .=
')';
16348 $tmpescaped = $tmpescaped2;
16349 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
16350 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
16351 $tmpescaped = $regbis[1];
16354 $tmpescaped =
"'" .
$db->escape($tmpescaped) .
"'";
16355 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
16358 $tmpescaped =
"'" .
$db->escape($regbis[1]) .
"'";
16360 if (strtoupper($tmpescaped) ==
'NULL') {
16361 $tmpescaped =
'NULL';
16362 } elseif (ctype_digit((
string) $tmpescaped)) {
16363 $tmpescaped = (int) $tmpescaped;
16364 } elseif (is_numeric((
string) $tmpescaped)) {
16365 $tmpescaped = (float) $tmpescaped;
16367 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
16371 return '(' .
$db->escape($operand) .
' ' . strtoupper($operator) .
' ' . $tmpescaped .
')';
16386 dol_syslog(
'getTimelineIcon::begin', LOG_DEBUG);
16389 $out =
'<!-- timeline icon -->' .
"\n";
16390 $iconClass =
'fa fa-comments';
16395 if ($histo[$key][
'percent'] == -1) {
16396 $colorClass =
'timeline-icon-not-applicble';
16397 $pictoTitle = $langs->trans(
'StatusNotApplicable');
16398 } elseif ($histo[$key][
'percent'] == 0) {
16399 $colorClass =
'timeline-icon-todo';
16400 $pictoTitle = $langs->trans(
'StatusActionToDo') .
' (0%)';
16401 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
16402 $colorClass =
'timeline-icon-in-progress';
16403 $pictoTitle = $langs->trans(
'StatusActionInProcess') .
' (' . $histo[$key][
'percent'] .
'%)';
16404 } elseif ($histo[$key][
'percent'] >= 100) {
16405 $colorClass =
'timeline-icon-done';
16406 $pictoTitle = $langs->trans(
'StatusActionDone') .
' (100%)';
16409 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
16410 $iconClass =
'fa fa-ticket';
16411 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
16412 $iconClass =
'fa fa-pencilxxx';
16413 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16414 $iconClass =
'fa fa-comments';
16415 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16416 $iconClass =
'fa fa-mask';
16418 if ($actionstatic->type_picto) {
16419 $img_picto =
img_picto(
'', $actionstatic->type_picto);
16421 if ($actionstatic->type_code ==
'AC_RDV') {
16422 $iconClass =
'fa fa-handshake';
16423 } elseif ($actionstatic->type_code ==
'AC_TEL') {
16424 $iconClass =
'fa fa-phone';
16425 } elseif ($actionstatic->type_code ==
'AC_FAX') {
16426 $iconClass =
'fa fa-fax';
16427 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
16428 $iconClass =
'fa fa-envelope';
16429 } elseif ($actionstatic->type_code ==
'AC_INT') {
16430 $iconClass =
'fa fa-shipping-fast';
16431 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
16432 $iconClass =
'fa fa-robot';
16433 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
16434 $iconClass =
'fa fa-robot';
16439 $out .=
'<i class="' . $iconClass .
' ' . $colorClass .
'" title="' . $pictoTitle .
'">' . $img_picto .
'</i>' .
"\n";
16453 $documents = array();
16455 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename, ecm.agenda_id';
16456 $sql .=
' FROM ' . MAIN_DB_PREFIX .
'ecm_files ecm';
16457 $sql .=
" WHERE ecm.filepath = 'agenda/" . ((int)
$object->id) .
"'";
16459 $sql .=
' OR ecm.agenda_id = ' . (int)
$object->id;
16460 $sql .=
' ORDER BY ecm.position ASC';
16462 $resql =
$db->query($sql);
16464 if (
$db->num_rows($resql)) {
16465 while ($obj =
$db->fetch_object($resql)) {
16466 $documents[$obj->id] = $obj;
16492function show_actions_messaging(
$conf, $langs,
$db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
16494 dol_syslog(
'show_actions_messaging::begin', LOG_DEBUG);
16495 global $user,
$conf;
16498 global $param, $massactionbutton;
16500 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16503 if (!is_object($filterobj) && !is_object($objcon)) {
16508 '@phan-var-force array<int,array{type:string,tododone:string,id:string,datestart:int|string,dateend:int|string,fulldayevent:int,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';
16513 $sortfield_list = explode(
',', $sortfield);
16514 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
16515 $sanitized_sortfield_new_list = array();
16516 foreach ($sortfield_list as $sortfield_value) {
16517 $sanitized_sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
16519 $sanitized_sortfield_new = implode(
',', $sanitized_sortfield_new_list);
16526 if (is_object($objcon) && $objcon->id > 0) {
16527 $sql =
"SELECT DISTINCT a.id, a.label as label,";
16529 $sql =
"SELECT a.id, a.label as label,";
16531 $sql .=
" a.datep as dp,";
16532 $sql .=
" a.note as message,";
16533 $sql .=
" a.datep2 as dp2,";
16534 $sql .=
" a.percent as percent, 'action' as type,";
16535 $sql .=
" a.fk_element, a.elementtype,";
16536 $sql .=
" a.fk_contact, a.fulldayevent,";
16537 $sql .=
" a.email_from as msg_from,";
16538 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
16539 $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";
16540 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16541 $sql .=
", sp.lastname, sp.firstname";
16542 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16543 $sql .=
", m.lastname, m.firstname";
16544 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur',
'Propal',
'Expedition'))) {
16547 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16551 $sql .=
" FROM " . MAIN_DB_PREFIX .
"actioncomm as a";
16552 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"user as u on u.rowid = a.fk_user_action";
16553 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_actioncomm as c ON a.fk_action = c.id";
16555 $force_filter_contact = $filterobj instanceof
User;
16557 if (is_object($objcon) && $objcon->id > 0) {
16558 $force_filter_contact =
true;
16559 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
16560 $sql .=
" AND r.element_type = '" .
$db->escape($objcon->table_element) .
"' AND r.fk_element = " . ((int) $objcon->id);
16563 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
16564 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"socpeople as sp ON a.fk_contact = sp.rowid";
16565 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
16566 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"element_resources as er";
16567 $sql .=
" ON er.resource_type = 'dolresource'";
16568 $sql .=
" AND er.element_id = a.id";
16569 $sql .=
" AND er.resource_id = " . ((int) $filterobj->id);
16570 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16571 $sql .=
", " . MAIN_DB_PREFIX .
"adherent as m";
16572 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16573 $sql .=
", " . MAIN_DB_PREFIX .
"commande_fournisseur as o";
16574 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16575 $sql .=
", " . MAIN_DB_PREFIX .
"product as o";
16576 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16577 $sql .=
", " . MAIN_DB_PREFIX .
"ticket as o";
16578 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16579 $sql .=
", " . MAIN_DB_PREFIX .
"bom_bom as o";
16580 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16581 $sql .=
", " . MAIN_DB_PREFIX .
"contrat as o";
16582 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16583 $sql .=
", " . MAIN_DB_PREFIX .
"facture as o";
16584 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16585 $sql .=
", " . MAIN_DB_PREFIX .
"facture_fourn as o";
16586 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16587 $sql .=
", " . MAIN_DB_PREFIX .
"commande as o";
16588 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16589 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as o";
16590 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16591 $sql .=
", " . MAIN_DB_PREFIX .
"propal as o";
16593 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16594 $sql .=
", " . MAIN_DB_PREFIX . $filterobj->table_element .
" as o";
16597 $sql .=
" WHERE a.entity IN (" .
getEntity(
'agenda') .
")";
16598 if (!$force_filter_contact) {
16599 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
16600 $sql .=
" AND a.fk_soc = " . ((int) $filterobj->id);
16601 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
16602 $sql .=
" AND a.fk_project = o.rowid AND a.fk_project = " . ((int) $filterobj->id);
16603 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16604 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
16605 if ($filterobj->id) {
16606 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16608 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16609 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
16610 if ($filterobj->id) {
16611 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16613 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16614 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'shipping'";
16615 if ($filterobj->id) {
16616 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16618 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16619 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'propal'";
16620 if ($filterobj->id) {
16621 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16623 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16624 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
16625 if ($filterobj->id) {
16626 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16628 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16629 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
16630 if ($filterobj->id) {
16631 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16633 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16634 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
16635 if ($filterobj->id) {
16636 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16638 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16639 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
16640 if ($filterobj->id) {
16641 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16643 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16644 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
16645 if ($filterobj->id) {
16646 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16648 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
16649 $sql .=
" AND a.fk_contact = sp.rowid";
16650 if ($filterobj->id) {
16651 $sql .=
" AND a.fk_contact = " . ((int) $filterobj->id);
16653 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16654 $sql .=
" AND a.fk_element = o.rowid";
16655 if ($filterobj->id) {
16656 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice'";
16658 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16659 $sql .=
" AND a.fk_element = o.rowid";
16660 if ($filterobj->id) {
16661 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice_supplier'";
16664 if (is_object($filterobj) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16665 $sql .=
" AND a.fk_element = o.rowid";
16666 $sql .=
" AND a.elementtype = '" .
$db->escape($filterobj->element) .
"'";
16667 if ($filterobj->id) {
16668 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16673 $sql .=
" AND u.rowid = " . ((int) $filterobj->id);
16677 if (!empty($actioncode) && $actioncode !=
'-1') {
16679 if ($actioncode ==
'AC_NON_AUTO') {
16680 $sql .=
" AND c.type != 'systemauto'";
16681 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16682 $sql .=
" AND c.type = 'systemauto'";
16684 if ($actioncode ==
'AC_OTH') {
16685 $sql .=
" AND c.type != 'systemauto'";
16686 } elseif ($actioncode ==
'AC_OTH_AUTO') {
16687 $sql .=
" AND c.type = 'systemauto'";
16691 if ($actioncode ==
'AC_NON_AUTO') {
16692 $sql .=
" AND c.type != 'systemauto'";
16693 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16694 $sql .=
" AND c.type = 'systemauto'";
16696 $sql .=
" AND c.code = '" .
$db->escape($actioncode) .
"'";
16700 if ($donetodo ==
'todo') {
16701 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '" .
$db->idate($now) .
"'))";
16702 } elseif ($donetodo ==
'done') {
16703 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '" .
$db->idate($now) .
"'))";
16705 if (is_array($filters) && $filters[
'search_agenda_label']) {
16706 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
16713 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')
16715 $langs->load(
"mails");
16717 $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";
16718 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
16719 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
16720 $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";
16721 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16722 $sql2 .=
", '' as lastname, '' as firstname";
16723 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16724 $sql2 .=
", '' as lastname, '' as firstname";
16725 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16726 $sql2 .=
", '' as ref";
16727 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16728 $sql2 .=
", '' as ref";
16729 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16730 $sql2 .=
", '' as ref";
16732 $sql2 .=
" FROM " . MAIN_DB_PREFIX .
"mailing as m, " . MAIN_DB_PREFIX .
"mailing_cibles as mc, " . MAIN_DB_PREFIX .
"user as u";
16733 $sql2 .=
" WHERE mc.email = '" .
$db->escape($objcon->email) .
"'";
16734 $sql2 .=
" AND mc.statut = 1";
16735 $sql2 .=
" AND u.rowid = m.fk_user_valid";
16736 $sql2 .=
" AND mc.fk_mailing=m.rowid";
16740 $MAXWITHOUTPAGINATION =
getDolGlobalInt(
'AGENDA_MAX_EVENTS_ON_PAGE_WITHOUT_PAGINATION', 100);
16742 if ($sql || $sql2) {
16743 if (!empty($sql) && !empty($sql2)) {
16744 $sql = $sql .
" UNION " . $sql2;
16745 } elseif (empty($sql) && !empty($sql2)) {
16751 $limit = $MAXWITHOUTPAGINATION;
16754 $sql .=
$db->order($sanitized_sortfield_new, $sortorder);
16756 $sql .=
$db->plimit($limit + 1, $offset);
16759 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
16761 $resql =
$db->query($sql);
16764 $num =
$db->num_rows($resql);
16766 $imaxinloop = ($limit ? min($num, $limit) : $num);
16767 while ($i < $imaxinloop) {
16768 $obj =
$db->fetch_object($resql);
16770 if ($obj->type ==
'action') {
16772 $contactaction->id = $obj->id;
16773 $result = $contactaction->fetchResources();
16776 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
16782 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
16783 $tododone =
'todo';
16786 $histo[$numaction] = array(
16787 'type' => $obj->type,
16788 'tododone' => $tododone,
16790 'datestart' =>
$db->jdate($obj->dp),
16791 'dateend' =>
$db->jdate($obj->dp2),
16792 'fulldayevent' => (
int) $obj->fulldayevent,
16793 'note' => $obj->label,
16794 'message' => $obj->message,
16795 'percent' => $obj->percent,
16797 'userid' => $obj->user_id,
16798 'login' => $obj->user_login,
16799 'userfirstname' => $obj->user_firstname,
16800 'userlastname' => $obj->user_lastname,
16801 'userphoto' => $obj->user_photo,
16802 'msg_from' => $obj->msg_from,
16804 'contact_id' => $obj->fk_contact,
16805 'socpeopleassigned' => $contactaction->socpeopleassigned,
16806 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
16807 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
16808 'fk_element' => $obj->fk_element,
16809 'elementtype' => $obj->elementtype,
16811 'acode' => $obj->acode,
16812 'alabel' => $obj->alabel,
16813 'libelle' => $obj->alabel,
16814 'apicto' => $obj->apicto
16817 $histo[$numaction] = array(
16818 'type' => $obj->type,
16819 'tododone' =>
'done',
16821 'datestart' =>
$db->jdate($obj->dp),
16822 'dateend' =>
$db->jdate($obj->dp2),
16823 'fulldayevent' => (
int) $obj->fulldayevent,
16824 'note' => $obj->label,
16825 'message' => $obj->message,
16826 'percent' => $obj->percent,
16827 'acode' => $obj->acode,
16829 'userid' => $obj->user_id,
16830 'login' => $obj->user_login,
16831 'userfirstname' => $obj->user_firstname,
16832 'userlastname' => $obj->user_lastname,
16833 'userphoto' => $obj->user_photo
16849 $langs->loadLangs(array(
"admin",
"errors"));
16850 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
16854 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
16856 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16857 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
16858 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
16859 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
16866 $userGetNomUrlCache = array();
16867 $contactGetNomUrlCache = array();
16869 $out .=
'<div class="filters-container" >';
16870 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
16871 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
16874 $objcon && get_class($objcon) ==
'Contact' &&
16875 (is_null($filterobj) || get_class($filterobj) ==
'Societe')
16877 $out .=
'<input type="hidden" name="id" value="' . $objcon->id .
'" />';
16879 $out .=
'<input type="hidden" name="id" value="' . $filterobj->id .
'" />';
16881 if (($filterobj && get_class($filterobj) ==
'Societe')) {
16882 $out .=
'<input type="hidden" name="socid" value="' . $filterobj->id .
'" />';
16884 $out .=
'<input type="hidden" name="userid" value="' . $filterobj->id .
'" />';
16889 $out .=
'<div class="div-table-responsive-no-min">';
16890 $out .=
'<table class="noborder borderbottom centpercent">';
16892 $out .=
'<tr class="liste_titre">';
16895 if (
$conf->main_checkbox_left_column) {
16896 $out .=
'<th class="liste_titre width50 middle">';
16897 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16898 $out .= $searchpicto;
16903 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ') .
"\n";
16905 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">' . $langs->trans(
"Search") .
' : </strong></th>';
16907 $out .=
'<th class="liste_titre"></th>';
16910 $out .=
'<th class="liste_titre">';
16911 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="' . $langs->trans(
"ActionType") .
'"></span>';
16912 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
16915 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
16916 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="' . $filters[
'search_agenda_label'] .
'" placeholder="' . $langs->trans(
"Label") .
'">';
16920 if (!
$conf->main_checkbox_left_column) {
16921 $out .=
'<th class="liste_titre width50 middle">';
16922 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16923 $out .= $searchpicto;
16929 $out .=
'</table>';
16936 $out .=
'<ul class="timeline">';
16940 if ($filterobj instanceof
Societe) {
16941 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16943 if ($filterobj instanceof
User) {
16944 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16946 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
16947 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
16948 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
16950 if ($filterobj instanceof
Societe) {
16953 if ($filterobj instanceof
User) {
16959 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/cactioncomm.class.php';
16961 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
16963 $actualCycleDate =
false;
16966 foreach ($histo as $key => $value) {
16967 $actionstatic->fetch($histo[$key][
'id']);
16969 $actionstatic->type_picto = $histo[$key][
'apicto'];
16970 $actionstatic->type_code = $histo[$key][
'acode'];
16972 $labeltype = $actionstatic->type_code;
16973 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
16974 $labeltype =
'AC_OTH';
16976 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16977 $labeltype = $langs->trans(
"Message");
16979 if (!empty($arraylist[$labeltype])) {
16980 $labeltype = $arraylist[$labeltype];
16982 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
16983 $labeltype .=
' - ' . $arraylist[$actionstatic->code];
16987 $url = DOL_URL_ROOT .
'/comm/action/card.php?id=' . $histo[$key][
'id'];
16989 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
16991 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'] .
'-' . $tmpa[
'yday']) {
16992 $actualCycleDate = $tmpa[
'year'] .
'-' . $tmpa[
'yday'];
16993 $out .=
'<!-- timeline time label -->';
16994 $out .=
'<li class="time-label">';
16995 $out .=
'<span class="timeline-badge-date">';
16996 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
16999 $out .=
'<!-- /.timeline-label -->';
17003 $out .=
'<!-- timeline item -->' .
"\n";
17004 $out .=
'<li class="timeline-code-' . (!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none") .
'">';
17007 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
17012 $out .=
'<div class="timeline-item">' .
"\n";
17014 $out .=
'<span class="time timeline-header-action2">';
17016 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
17017 $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") .
' ';
17018 $out .= $histo[$key][
'id'];
17021 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle') .
' ';
17025 $user->hasRight(
'agenda',
'allactions',
'create') ||
17026 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))
17028 $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) .
'">';
17030 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
17037 $out .=
'<span class="time"><i class="fa fa-clock valignmiddle"></i> ';
17038 $out .=
'<span class="valignmiddle marginrightonly">';
17039 $out .=
dol_print_date($histo[$key][
'datestart'],
'day',
'tzuserrel');
17042 $out .=
' '.dol_print_date($histo[$key][
'datestart'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
17044 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
17045 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
17046 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
17047 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
17048 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false, 1);
17050 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'day',
'tzuserrel');
17052 $out .=
' '.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
17057 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17060 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17063 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
17066 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17070 $out .=
img_warning($langs->trans(
"Late")) .
' ';
17072 $out .=
"</span></span>\n";
17074 $out .=
'<span class="time">';
17075 $out .= $actionstatic->getLibStatut(2);
17079 $out .=
'<h3 class="timeline-header">';
17082 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
17083 if ($histo[$key][
'userid'] > 0) {
17084 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
17085 $userstatic->fetch($histo[$key][
'userid']);
17086 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
17088 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
17089 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
17090 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
17091 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
17092 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
17094 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
17097 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
17099 $out .=
'<img class="photomemberphoto userphoto" alt="" src="/public/theme/common/user_anonymous.png">'.$langs->trans(
"Anonymous");
17104 $out .=
' <div class="messaging-title inline-block">';
17106 if (empty(
$conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
17107 $out .= $labeltype .
' - ';
17112 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
17113 $out .= $langs->trans(
'TicketNewMessage').
' - <em>'.
img_picto($langs->trans(
'Private'),
'lock',
'class="valignmiddle"').
' '.$langs->trans(
'Private').
'</em>';
17114 $summary = preg_replace(
'/\[[^\]]*\]\s*/',
'', $actionstatic->label);
17116 $out .=
' - '.dolPrintHTML($summary);
17118 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
17119 $out .= $langs->trans(
'TicketNewMessage');
17120 } elseif (isset($histo[$key][
'type'])) {
17121 if ($histo[$key][
'type'] ==
'action') {
17122 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
17123 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
17124 $libelle = $histo[$key][
'note'];
17125 $actionstatic->id = $histo[$key][
'id'];
17126 if ($libelle != $labeltype) {
17129 } elseif ($histo[$key][
'type'] ==
'mailing') {
17130 $out .=
'<a href="' . DOL_URL_ROOT .
'/comm/mailing/card.php?id=' . $histo[$key][
'id'] .
'">' .
img_object($langs->trans(
"ShowEMailing"),
"email") .
' ';
17131 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
17132 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
17135 $libelle .= $histo[$key][
'note'];
17139 $out = preg_replace(
'/ - $/',
'', $out);
17141 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
17142 if (isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
17143 $link =
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
17145 if (!isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
17146 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
17148 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
17149 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
17154 if (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
17155 if ($histo[$key][
'elementtype'] ==
'ticket') {
17160 if ($link && $showlink) {
17161 $out .=
' - ' . $link;
17170 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
17171 $newmess = $filterobj->message;
17173 $newmess = $histo[$key][
'message'];
17176 !empty($newmess && $newmess != $libelle)
17177 && $actionstatic->code !=
'AC_TICKET_MODIFY'
17179 $out .=
'<div class="timeline-body wordbreak small">';
17180 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
17182 if ($truncateLines > 0 && strlen($newmess) > strlen($truncatedText)) {
17183 $out .=
'<div class="readmore-block --closed" >';
17184 $out .=
' <div class="readmore-block__excerpt">';
17185 $out .=
dolPrintHTML($truncatedText, 0, array(
'pre',
'code'));
17186 $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>';
17188 $out .=
' <div class="readmore-block__full-text" >';
17190 $out .=
dolPrintHTML($newmess, 0, array(
'pre',
'code'));
17192 $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>';
17196 $out .=
dolPrintHTML($newmess, 0, array(
'pre',
'code'));
17205 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
17207 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
17208 if (empty(
$conf->cache[
'contact'][$cid])) {
17210 $contact->fetch($cid);
17211 $conf->cache[
'contact'][$cid] = $contact;
17213 $contact =
$conf->cache[
'contact'][$cid];
17217 $contactList .= !empty($contactList) ?
', ' :
'';
17218 $contactList .= $contact->getNomUrl(1);
17219 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
17220 if (!empty($contact->phone_pro)) {
17227 $footer .= $langs->trans(
'ActionOnContact') .
' : ' . $contactList;
17228 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
17229 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
17231 $result = $contact->fetch($histo[$key][
'contact_id']);
17232 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
17234 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
17235 $result = ($contact instanceof
Contact) ? $contact->id : 0;
17239 $footer .= $contact->getNomUrl(1);
17240 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
17241 if (!empty($contact->phone_pro)) {
17249 if (!empty($documents)) {
17250 $footer .=
'<div class="timeline-documents-container">';
17251 foreach ($documents as $doc) {
17252 $footer .=
'<span id="document_' . $doc->id .
'" class="timeline-documents" ';
17253 $footer .=
' data-id="' . $doc->id .
'" ';
17254 $footer .=
' data-path="' . $doc->filepath .
'"';
17258 $filePath = DOL_DATA_ROOT .
'/' . $doc->filepath .
'/' . $doc->filename;
17260 if (empty($doc->agenda_id)) {
17261 $dir_ref = $actionstatic->id;
17262 $modulepart =
'actions';
17264 $split_dir = explode(
'/', $doc->filepath);
17265 $modulepart = array_shift($split_dir);
17266 $dir_ref = implode(
'/', $split_dir);
17269 $file = $dir_ref .
'/' . $doc->filename;
17270 $thumb = $dir_ref .
'/thumbs/' . substr($doc->filename, 0, strrpos($doc->filename,
'.')) .
'_mini' . substr($doc->filename, strrpos($doc->filename,
'.'));
17271 $doclink =
dol_buildpath(
'document.php', 1) .
'?modulepart=' . $modulepart .
'&attachment=0&file=' . urlencode($file) .
'&entity=' .
$conf->entity;
17272 $viewlink =
dol_buildpath(
'viewimage.php', 1) .
'?modulepart=' . $modulepart .
'&file=' . urlencode($thumb) .
'&entity=' .
$conf->entity;
17276 $mimeAttr =
' mime="' . $mime .
'" ';
17278 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
17279 $class .=
' documentpreview';
17282 $footer .=
'<a href="' . $doclink .
'" class="btn-link ' . $class .
'" target="_blank" rel="noopener noreferrer" ' . $mimeAttr .
' >';
17283 $footer .=
img_mime($filePath) .
' ' . $doc->filename;
17286 $footer .=
'</span>';
17288 $footer .=
'</div>';
17291 if (!empty($footer)) {
17292 $out .=
'<div class="timeline-footer">' . $footer .
'</div>';
17295 $out .=
'</div>' .
"\n";
17298 $out .=
'<!-- END timeline item -->';
17305 jQuery(document).ready(function () {
17306 $(document).on("click", "[data-read-more-action]", function(e){
17307 console.log("We click on data-read-more-action");
17308 let readMoreBloc = $(this).closest(".readmore-block");
17309 if(readMoreBloc.length > 0){
17310 e.preventDefault();
17311 if($(this).attr("data-read-more-action") == "close"){
17312 readMoreBloc.addClass("--closed").removeClass("--open");
17313 $("html, body").animate({
17314 scrollTop: readMoreBloc.offset().top - 200
17317 readMoreBloc.addClass("--open").removeClass("--closed");
17325 if (empty($histo)) {
17326 $out .=
'<span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span>';
17329 if ($num > $MAXWITHOUTPAGINATION) {
17330 $langs->load(
"errors");
17331 $out .=
'<center><span class="opacitymedium">...' . $langs->trans(
"WarningTooManyDataPleaseUseMoreFilters", $MAXWITHOUTPAGINATION) .
'...</span></center>';
17354function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
17356 if ($timestamp ===
null) {
17357 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
17364 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
17365 $TParam = array_merge($TParam, array(
17372 return '&' . http_build_query($TParam);
17393function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
17395 global
$conf,
$db, $langs, $hookmanager;
17398 if (!is_object($langs)) {
17399 include_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
17401 $langs->setDefaultLang();
17404 $langs->load(
"errors");
17406 if ($printheader) {
17407 if (function_exists(
"llxHeader")) {
17409 } elseif (function_exists(
"llxHeaderVierge")) {
17414 print
'<div class="error">';
17415 if (empty($message)) {
17416 print $langs->trans(
"ErrorRecordNotFound");
17418 print $langs->trans($message);
17423 if (empty($showonlymessage)) {
17424 if (empty($hookmanager)) {
17425 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
17428 $hookmanager->initHooks(array(
'main'));
17431 $parameters = array(
'message' => $message,
'params' => $params);
17432 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
17433 print $hookmanager->resPrint;
17436 if ($printfooter && function_exists(
"llxFooter")) {
17438 if (is_object(
$db)) {
17479 foreach ($array2 as $key => $value) {
17480 if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
17483 $merged[$key] = $value;
17498 if (!empty($obj->socid)) {
17499 return (
int) $obj->socid;
17500 } elseif (!empty($obj->soc_id)) {
17501 return (
int) $obj->soc_id;
17502 } elseif (!empty($obj->societe_id)) {
17503 return (
int) $obj->societe_id;
17516 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
17518 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 950) {
17520 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
global $dolibarr_main_url_root
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=[], $ws='')
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='', $readonly=0)
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.
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
Class to manage GeoIP conversion Usage: $geoip=new GeoIP('country',$datfile); $geoip->getCountryCodeF...
Class to manage invoices.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
isACompany()
Check if third party is a company (Business) or an end user (Consumer)
Class to manage translations.
Class to manage Dolibarr users.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
dol_get_prev_month($month, $year)
Return previous month.
dol_get_next_day($day, $month, $year)
Return next day.
getServerTimeZoneInt($refgmtdate='now')
Return server timezone int.
dol_get_prev_day($day, $month, $year)
Return previous day.
dol_get_next_month($month, $year)
Return next month.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert a PDF file 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.
$date_start
Variables from include:
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
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_now($mode='gmt')
Return date for now.
dol_fiche_end($notab=0)
Show tab footer of a card.
verifCond($strToEvaluate, $onlysimplestring='1')
Verify if condition in string is ok or not.
getDolGlobalLoginBadCharUnauthorized()
Return the list of unauthorized characters in user logins.
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...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
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.
dol_getmypid()
Return getmypid() or random PID when function is disabled Some web hosts disable this php function fo...
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.
img_credit_card($brand, $morecss='fa-2x inline-block valignmiddle')
Return image of a credit card according to its brand name.
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.
dol_print_phone($phone, $countrycode='', $contactid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
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.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
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_osencode($str)
Return a string encoded into OS filesystem encoding.
getObjectSocId($obj)
Get the socid of an object, supporting legacy attribute names.
getListLimitFromScreenHeight()
Get the limit of list to show according to the screen height.
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.
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 ...
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dolOutputDates($datep, $datef=null, $fullday=0, $addseconds=0, $pictotoadd='', $tzoutput='tzuserrel', $reduceformat=0)
Print decorated date-hour.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolEntity()
Return the current entity.
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.
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-...
dol_sanitizePathName($str, $newstr='_', $unaccent=0, $allowdash=0)
Clean a string to use it as a path name.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolOptimizeSmallScreen()
Return if render must be optimized for small screen.
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.
jsonOrUnserialize($stringtodecode, $assoc=true)
Decode an encoded string.
dol_print_socialnetworks($value, $contactid, $socid, $type, $dictsocialnetworks=array())
Show social network link.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tab header of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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_get_object_properties($obj, $properties=[])
Get value of 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)
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.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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)
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
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.
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_clone_in_array($srcobject, $startlevel=0)
Create a clone of instance of object into a full array, using recursive call.
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 ...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
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.
getDolDefaultContextPage($s)
Return the default context page string.
safeArrayMap($callback, array $array)
Add a function to replace array_map with allowed callback.
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.
dolGetCountryCodeFromIp($ip)
Return a country code from IP.
dol_textishtml($msg, $option=0)
Return if a text is a html content.
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)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolForgeSQLCriteriaCallback($matches)
Function to forge a SQL criteria from a USF (Universal Filter Syntax) string.
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.
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')) formatLogObject($data)
Return a string serialized to be output on log with dol_syslog() An option allow to output log in one...
getDolDBType()
Return the current entity.
print_titre($title)
Show a title.
showSimpleHTMLTable($outputlangs, $object)
Returns simple order table template as string.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_string_nounprintableascii($str, $removetabcrlf=1)
Clean a string from all non printable ASCII chars (0x00-0x1F and 0x7F).
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
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).
get_product_localtax_for_country($idprod, $local, $thirdpartytouseforcountry)
Return localtax vat rate of a product in a particular country or default country vat if product is un...
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.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isStringVarMatching($var, $regextext, $matchrule=1)
Check if a variable with name $var start with $regextext.
dolSlugify($stringtoslugify)
Returns text slugified (lowercase and no special char, separator is "-").
dol_concat($text1, $text2)
Concat 2 strings.
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...
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.
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.
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.
isModEnabled($module)
Is Dolibarr module enabled.
array_merge_recursive_distinct(array $array1, array $array2)
Recursively merges two arrays while preserving keys and replacing existing values.
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).
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_eval_standard($s, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
get_product_vat_for_country($idprod, $thirdpartytouseforcountry, $idprodfournprice=0)
Return vat rate of a product in a particular country, or default country vat if product is unknown.
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.
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.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
treeview li table
No Email.
div refaddress div address
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
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.
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
$conf db name
Only used if Module[ID]Name translation string is not found.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
realCharForNumericEntities($matches)
Return the real char for a numeric entities.