55if (!function_exists(
'utf8_encode')) {
63 function utf8_encode($elements)
65 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
69if (!function_exists(
'utf8_decode')) {
77 function utf8_decode($elements)
79 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
82if (!function_exists(
'str_starts_with')) {
91 function str_starts_with($haystack, $needle)
93 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
96if (!function_exists(
'str_ends_with')) {
105 function str_ends_with($haystack, $needle)
107 return $needle !==
'' && substr($haystack, -strlen($needle)) === (string) $needle;
110if (!function_exists(
'str_contains')) {
119 function str_contains($haystack, $needle)
121 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
142 if (!is_object(
$object) && empty($module)) {
145 if (empty($module) && !empty(
$object->element)) {
152 $module =
'ficheinter';
154 case 'invoice_supplier':
155 $module =
'supplier_invoice';
157 case 'order_supplier':
158 $module =
'supplier_order';
160 case 'recruitmentjobposition':
161 $module =
'recruitment';
162 $subdirectory =
'/recruitmentjobposition';
164 case 'recruitmentcandidature':
165 $module =
'recruitment';
166 $subdirectory =
'/recruitmentcandidature';
168 case 'knowledgerecord':
169 $module =
'knowledgemanagement';
170 $subdirectory =
'/knowledgerecord';
186 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
187 if (isset($conf->$module) && property_exists($conf->$module,
'multidir_output')) {
189 if ($mode !=
'outputrel') {
190 $s = $conf->$module->multidir_output[(empty(
$object->entity) ? $conf->entity :
$object->entity)] . $subdirectory;
192 if ($forobject &&
$object->id > 0) {
196 } elseif (isset($conf->$module) && property_exists($conf->$module,
'dir_output')) {
198 if ($mode !=
'outputrel') {
199 $s = $conf->$module->dir_output . $subdirectory;
201 if ($forobject &&
$object->id > 0) {
206 return 'error-diroutput-not-defined-for-this-object=' . $module;
208 } elseif ($mode ==
'temp') {
209 if (isset($conf->$module) && property_exists($conf->$module,
'multidir_temp')) {
210 return $conf->$module->multidir_temp[(empty(
$object->entity) ? $conf->entity :
$object->entity)];
211 } elseif (isset($conf->$module) && property_exists($conf->$module,
'dir_temp')) {
212 return $conf->$module->dir_temp;
214 return 'error-dirtemp-not-defined-for-this-object=' . $module;
217 return 'error-bad-value-for-mode';
261 return (
string) (isset($conf->global->$key) ? $conf->global->$key : $default);
276 return (
int) (isset($conf->global->$key) ? $conf->global->$key : $default);
291 return (
float) (isset($conf->global->$key) ? $conf->global->$key : $default);
305 return (
bool) ($conf->global->$key ?? $default);
316 return (
string) $conf->currency;
327 return (
string) $conf->dol_optimize_smallscreen;
338 return (
int) $conf->entity;
349 return $conf->db->type;
360 return str_replace(
'_',
'', basename(dirname($s)).basename($s,
'.php'));
374 if (empty($tmpuser)) {
379 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
392 if (empty($tmpuser)) {
397 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
414 'adherent' =>
'member',
415 'member_type' =>
'adherent_type',
417 'contrat' =>
'contract',
418 'entrepot' =>
'stock',
419 'projet' =>
'project',
420 'categorie' =>
'category',
421 'commande' =>
'order',
422 'expedition' =>
'shipping',
423 'facture' =>
'invoice',
424 'fichinter' =>
'intervention',
425 'ficheinter' =>
'intervention',
426 'propale' =>
'propal',
427 'socpeople' =>
'contact',
428 'fournisseur' =>
'supplier',
430 'actioncomm' =>
'agenda',
431 'product_price' =>
'productprice',
432 'product_fournisseur_price' =>
'productsupplierprice',
452 $arrayconv[
'supplier_order'] =
'fournisseur';
453 $arrayconv[
'supplier_invoice'] =
'fournisseur';
456 $module_alt = $module;
457 if (!empty($arrayconv[$module])) {
458 $module_alt = $arrayconv[$module];
460 $module_bis = $module;
461 if (!empty($arrayconvbis[$module])) {
462 $module_bis = $arrayconvbis[$module];
465 return !empty($conf->modules[$module]) || !empty($conf->modules[$module_alt]) || !empty($conf->modules[$module_bis]);
483 $moduletomoduletouse = array(
484 'invoice' =>
'facture',
486 $moduleParmsMapping = array(
487 'product' =>
'produit',
490 if (!empty($moduletomoduletouse[$module])) {
491 $module = $moduletomoduletouse[$module];
494 $warningDelayPath = $parmlevel1;
495 if (!empty($moduleParmsMapping[$warningDelayPath])) {
496 $warningDelayPath = $moduleParmsMapping[$warningDelayPath];
500 if (!empty($conf->$module) && !empty($conf->$module->$warningDelayPath) && !empty($conf->$module->$warningDelayPath->$parmlevel2) && !empty($conf->$module->$warningDelayPath->$parmlevel2->warning_delay)) {
501 return (
int) $conf->$module->$warningDelayPath->$parmlevel2->warning_delay;
504 if (!empty($conf->$module) && !empty($conf->$module->$warningDelayPath) && !empty($conf->$module->$warningDelayPath->warning_delay)) {
505 return (
int) $conf->$module->$warningDelayPath->warning_delay;
520 if ($timestamp ===
'') {
521 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page ' . $_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_NOTICE);
524 if (is_null($timestamp) || !is_numeric($timestamp)) {
544 require_once DOL_DOCUMENT_ROOT .
"/core/db/" . $type .
'.class.php';
546 $class =
'DoliDB' . ucfirst($type);
547 $db =
new $class($type, $host, $user, $pass, $name, $port);
568function getEntity($element, $shared = 1, $currentobject =
null)
570 global $conf, $mc, $hookmanager,
$object, $action, $db;
572 if (!is_object($hookmanager)) {
573 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
580 $element =
'project';
583 $element =
'contract';
585 case 'order_supplier':
586 $element =
'supplier_order';
588 case 'invoice_supplier':
589 $element =
'supplier_invoice';
593 if (is_object($mc)) {
594 $out = $mc->getEntity($element, $shared, $currentobject);
597 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
599 $addzero[] =
'c_holiday_types';
601 if (in_array($element, $addzero)) {
604 $out .= ((int) $conf->entity);
609 'element' => $element,
612 'currentobject' => $currentobject,
616 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
618 if (is_numeric($reshook)) {
619 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
620 $out .=
',' . $hookmanager->resPrint;
621 } elseif ($reshook == 1) {
622 $out = $hookmanager->resPrint;
639 if (is_object($mc) && method_exists($mc,
'setEntity')) {
640 return $mc->setEntity($currentobject);
642 return ((is_object($currentobject) && $currentobject->id > 0 && ((
int) $currentobject->entity) > 0) ? (
int) $currentobject->entity : $conf->entity);
654 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
667 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
668 $r = chr($n % 26 + 0x41) . $r;
692 include_once DOL_DOCUMENT_ROOT .
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
699 $user_agent = substr($user_agent, 0, 512);
702 $detectmobile =
new Mobile_Detect(
null, $user_agent);
703 $tablet = $detectmobile->isTablet();
705 if ($detectmobile->isMobile()) {
709 if ($detectmobile->is(
'AndroidOS')) {
710 $os = $phone =
'android';
711 } elseif ($detectmobile->is(
'BlackBerryOS')) {
712 $os = $phone =
'blackberry';
713 } elseif ($detectmobile->is(
'iOS')) {
716 } elseif ($detectmobile->is(
'PalmOS')) {
717 $os = $phone =
'palm';
718 } elseif ($detectmobile->is(
'SymbianOS')) {
720 } elseif ($detectmobile->is(
'webOS')) {
722 } elseif ($detectmobile->is(
'MaemoOS')) {
724 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
730 if (preg_match(
'/linux/i', $user_agent)) {
732 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
734 } elseif (preg_match(
'/windows/i', $user_agent)) {
740 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
742 $version = empty($reg[2]) ?
'' : $reg[2];
743 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
745 $version = empty($reg[2]) ?
'' : $reg[2];
746 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
748 $version = empty($reg[2]) ?
'' : $reg[2];
749 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
752 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
754 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
756 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
758 $version = empty($reg[2]) ?
'' : $reg[2];
759 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
762 $version = empty($reg[2]) ?
'' : $reg[2];
763 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
765 $version = end($reg);
766 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
769 $version = end($reg);
770 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
772 $name =
'textbrowser';
773 $version = empty($reg[3]) ?
'' : $reg[3];
774 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
776 $name =
'textbrowser';
777 $version = empty($reg[1]) ?
'' : $reg[1];
789 'browsername' => $name,
790 'browserversion' => $version,
792 'browserua' => $user_agent,
807 $disconnectdone =
false;
809 if (is_object($db) && !empty($db->connected)) {
810 $depth = $db->transaction_opened;
811 $disconnectdone = $db->close();
813 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));
825function GETPOSTISSET($paramname)
829 $relativepathstring = $_SERVER[
"PHP_SELF"];
831 if (constant(
'DOL_URL_ROOT')) {
832 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
834 $relativepathstring = ltrim($relativepathstring,
'/');
835 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
839 if (!empty($_GET[
'restore_lastsearch_values'])) {
840 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
841 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
842 if (is_array($tmp)) {
843 foreach ($tmp as $key => $val) {
844 if ($key == $paramname) {
852 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
854 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
856 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
858 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
862 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
879 if (empty($method)) {
880 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
881 } elseif ($method == 1) {
882 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
883 } elseif ($method == 2) {
884 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
885 } elseif ($method == 3) {
886 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
888 $val =
'BadFirstParameterForGETPOST';
891 return is_array($val);
906 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
922function GETPOSTFLOAT($paramname, $rounding =
'', $option = 2)
943function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto', $saverestore =
'')
946 if ($hourTime ===
'getpost' || $hourTime ===
'getpostend') {
947 $hour = (GETPOSTISSET($prefix .
'hour') &&
GETPOSTINT($prefix .
'hour') >= 0) ?
GETPOSTINT($prefix .
'hour') : ($hourTime ===
'getpostend' ? 23 : 0);
948 $minute = (GETPOSTISSET($prefix .
'min') &&
GETPOSTINT($prefix .
'min') >= 0) ?
GETPOSTINT($prefix .
'min') : ($hourTime ===
'getpostend' ? 59 : 0);
949 $second = (GETPOSTISSET($prefix .
'sec') &&
GETPOSTINT($prefix .
'sec') >= 0) ?
GETPOSTINT($prefix .
'sec') : ($hourTime ===
'getpostend' ? 59 : 0);
950 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
951 $hour = intval($m[1]);
952 $minute = intval($m[2]);
953 $second = intval($m[3]);
954 } elseif ($hourTime ===
'end') {
959 $hour = $minute = $second = 0;
964 && !GETPOSTISSET($prefix .
'day')
965 && !GETPOSTISSET($prefix .
'month')
966 && !GETPOSTISSET($prefix .
'year')
967 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_day'])
968 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_month'])
969 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_year'])
971 $day = $_SESSION[
'DOLDATE_' . $saverestore .
'_day'];
972 $month = $_SESSION[
'DOLDATE_' . $saverestore .
'_month'];
973 $year = $_SESSION[
'DOLDATE_' . $saverestore .
'_year'];
981 $hour = (int) min($hour, 23);
982 $minute = (int) min($minute, 59);
983 $second = (int) min($second, 59);
986 $_SESSION[
'DOLDATE_' . $saverestore .
'_day'] = $day;
987 $_SESSION[
'DOLDATE_' . $saverestore .
'_month'] = $month;
988 $_SESSION[
'DOLDATE_' . $saverestore .
'_year'] = $year;
992 return dol_mktime($hour, $minute, $second, $month, $day, $year, $gm);
1035function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
1037 global
$mysoc, $user, $conf;
1039 if (empty($paramname)) {
1040 return 'BadFirstParameterForGETPOST';
1042 if (empty($check)) {
1043 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);
1048 if (empty($method)) {
1049 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
1050 } elseif ($method == 1) {
1051 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
1052 } elseif ($method == 2) {
1053 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
1054 } elseif ($method == 3) {
1055 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
1057 return 'BadThirdParameterForGETPOST';
1060 $relativepathstring =
'';
1062 if (empty($method) || $method == 3 || $method == 4) {
1063 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
1065 if (constant(
'DOL_URL_ROOT')) {
1066 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
1068 $relativepathstring = ltrim($relativepathstring,
'/');
1069 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1073 if (!empty($_GET[
'restore_lastsearch_values'])) {
1074 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
1075 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
1076 if (is_array($tmp)) {
1077 foreach ($tmp as $key => $val) {
1078 if ($key == $paramname) {
1086 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
1087 $out = $_SESSION[
'lastsearch_contextpage_' . $relativepathstring];
1088 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
1089 $out = $_SESSION[
'lastsearch_limit_' . $relativepathstring];
1090 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
1091 $out = $_SESSION[
'lastsearch_page_' . $relativepathstring];
1092 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
1093 $out = $_SESSION[
'lastsearch_mode_' . $relativepathstring];
1095 } elseif (!isset($_GET[
'sortfield'])) {
1098 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1101 '@phan-var-force CommonObject $object';
1102 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
1104 $out =
$object->fields[$paramname][
'default'];
1108 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1110 if (!empty($user->default_values)) {
1111 if (isset($user->default_values[$relativepathstring][
'createform'])) {
1112 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
1114 if ($defkey !=
'_noquery_') {
1115 $tmpqueryarraytohave = explode(
'&', $defkey);
1118 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1119 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1131 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
1132 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
1139 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1141 if (!empty($user->default_values)) {
1144 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
1146 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
1148 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
1150 if ($defkey !=
'_noquery_') {
1151 $tmpqueryarraytohave = explode(
'&', $defkey);
1154 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1155 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1167 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1168 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
1172 if ($paramname ==
'sortfield') {
1175 if ($paramname ==
'sortorder') {
1183 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
1184 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
1185 if (!empty($_GET[
'disabledefaultvalues'])) {
1189 if ($defkey !=
'_noquery_') {
1190 $tmpqueryarraytohave = explode(
'&', $defkey);
1193 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1194 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1205 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
1207 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
1210 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1211 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1214 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1215 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1230 '@phan-var-force string $paramname';
1231 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1233 $regreplace = array();
1237 while (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out, $reg) && ($loopnb < $maxloop)) {
1241 if ($reg[1] ==
'DAY') {
1243 $newout = $tmp[
'mday'];
1244 } elseif ($reg[1] ==
'MONTH') {
1246 $newout = $tmp[
'mon'];
1247 } elseif ($reg[1] ==
'YEAR') {
1249 $newout = $tmp[
'year'];
1250 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
1253 $newout = $tmp2[
'day'];
1254 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
1257 $newout = $tmp2[
'month'];
1258 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
1260 $newout = ($tmp[
'year'] - 1);
1261 } elseif ($reg[1] ==
'NEXT_DAY') {
1264 $newout = $tmp2[
'day'];
1265 } elseif ($reg[1] ==
'NEXT_MONTH') {
1268 $newout = $tmp2[
'month'];
1269 } elseif ($reg[1] ==
'NEXT_YEAR') {
1271 $newout = ($tmp[
'year'] + 1);
1272 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1273 $newout =
$mysoc->country_id;
1274 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1275 $newout = $user->id;
1276 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1277 $newout = $user->fk_user;
1278 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1279 $newout = $conf->entity;
1280 } elseif ($reg[1] ==
'ID') {
1283 $newout =
'REGREPLACE_' . $loopnb;
1284 $regreplace[$loopnb] = $reg[0];
1287 $out = preg_replace(
'/__' . preg_quote($reg[1],
'/') .
'__/', $newout, $out);
1289 if (!empty($regreplace)) {
1290 foreach ($regreplace as $key => $value) {
1291 $out = preg_replace(
'/REGREPLACE_' . $key .
'/', $value, $out);
1297 if (preg_match(
'/^array/', $check)) {
1298 $tmpcheck =
'alphanohtml';
1301 } elseif (!is_array($out)) {
1302 $out = explode(
',', $out);
1304 $tmparray = explode(
':', $check);
1305 if (!empty($tmparray[1])) {
1306 $tmpcheck = $tmparray[1];
1309 foreach ($out as $outkey => $outval) {
1310 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1315 if (strpos($paramname,
'search_') === 0) {
1316 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1320 $out =
sanitizeVal($out, $check, $filter, $options);
1327 if (preg_match(
'/^backto/i', $paramname)) {
1328 $out = str_replace(
'\\',
'/', $out);
1329 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1331 $oldstringtoclean = $out;
1332 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1333 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1334 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1335 }
while ($oldstringtoclean != $out);
1340 if (empty($method) || $method == 3 || $method == 4) {
1341 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1348 if ($out !=
'' && isset($user)) {
1349 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1366function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1370 if ($out ===
null) {
1378 if (!is_numeric($out)) {
1383 if (is_array($out)) {
1384 $out = implode(
',', $out);
1386 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1391 dol_syslog(
"Use of parameter value 'san_alpha' in GETPOST is deprecated. Use 'alphanohtml', 'aZ09comma', ...", LOG_WARNING);
1392 $out = filter_var($out, FILTER_SANITIZE_STRING);
1395 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1399 $out = preg_replace(
'/[^:\/\[\]a-z0-9@\$\'\*\~\.\-_,;\?\!=%&+#]+/i',
'', $out);
1403 if (!is_array($out)) {
1405 if (preg_match(
'/[^a-z]+/i', $out)) {
1411 if (!is_array($out)) {
1413 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1419 if (!is_array($out)) {
1421 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1427 if (!is_array($out)) {
1429 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1436 if (!is_array($out)) {
1439 $oldstringtoclean = $out;
1443 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1450 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1451 }
while ($oldstringtoclean != $out);
1455 case 'alphawithlgt':
1456 if (!is_array($out)) {
1459 $oldstringtoclean = $out;
1463 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1470 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1471 }
while ($oldstringtoclean != $out);
1477 case 'restricthtmlnolink':
1478 case 'restricthtml':
1479 case 'restricthtmlallowclass':
1480 case 'restricthtmlallowiframe':
1481 case 'restricthtmlallowlinkscript':
1482 case 'restricthtmlallowunvalid':
1487 if (empty($filter)) {
1488 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1490 if (is_null($options)) {
1493 $out = filter_var($out, $filter, $options);
1497 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1498 $out =
GETPOST($out,
'alphanohtml');
1513function dolSetCookie(
string $cookiename,
string $cookievalue,
int $expire = -1)
1515 global $dolibarr_main_force_https;
1517 if ($expire == -1) {
1518 $expire = (time() + (86400 * 354));
1521 if (PHP_VERSION_ID < 70300) {
1522 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : $expire,
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
1525 $cookieparams = array(
1526 'expires' => empty($cookievalue) ? 0 : $expire,
1529 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
1533 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
1535 if (empty($cookievalue)) {
1536 unset($_COOKIE[$cookiename]);
1540if (!function_exists(
'dol_getprefix')) {
1551 function dol_getprefix($mode =
'')
1554 if ($mode ==
'email') {
1560 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1561 return $_SERVER[
"SERVER_NAME"];
1566 if (!empty($conf->file->instance_unique_id)) {
1567 return sha1(
'dolibarr' . $conf->file->instance_unique_id);
1571 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1575 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1576 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1579 if (!empty($tmp_instance_unique_id)) {
1580 return sha1(
'dolibarr' . $tmp_instance_unique_id);
1584 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1585 return sha1($_SERVER[
"SERVER_NAME"] . $_SERVER[
"DOCUMENT_ROOT"] . DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1587 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1604 global $conf, $langs, $user,
$mysoc;
1606 if (strpos($relpath,
'..') !==
false) {
1608 dol_syslog(
'functions::dol_include_once Tried to load a file with a path including a forbidden sequence ".." : ' . $relpath, LOG_WARNING);
1611 if (!preg_match(
'/\.php$/', $relpath)) {
1613 dol_syslog(
'functions::dol_include_once Tried to load a file that is not a PHP file : ' . $relpath, LOG_WARNING);
1619 if (!file_exists($fullpath)) {
1620 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: ' . $relpath, LOG_WARNING);
1623 if (!empty($classname) && !class_exists($classname)) {
1624 return include $fullpath;
1626 return include_once $fullpath;
1644function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1648 $path = preg_replace(
'/^\//',
'', $path);
1651 $res = DOL_DOCUMENT_ROOT .
'/' . $path;
1652 if (is_array($conf->file->dol_document_root)) {
1653 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1654 if ($key ==
'main') {
1658 if (@file_exists($dirroot .
'/' . $path)) {
1659 if ($key !=
'main' && preg_match(
'/^core\//', $path)) {
1662 $res = $dirroot .
'/' . $path;
1667 if ($returnemptyifnotfound) {
1669 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1681 $res = DOL_URL_ROOT .
'/' . $path;
1684 $res = DOL_MAIN_URL_ROOT .
'/' . $path;
1687 $res = DOL_URL_ROOT .
'/' . $path;
1690 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1691 if ($key ==
'main') {
1696 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim($conf->file->dol_main_url_root));
1697 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1700 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) .
'/' . $path;
1705 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1706 if (!empty($regs[1])) {
1709 if (@file_exists($dirroot .
'/' . $regs[1])) {
1711 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT) . $conf->file->dol_url_root[$key] .
'/' . $path;
1712 } elseif ($type == 2) {
1713 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT) . $conf->file->dol_url_root[$key] .
'/' . $path;
1714 } elseif ($type == 3) {
1718 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim($conf->file->dol_main_url_root));
1719 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1722 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) . $conf->file->dol_url_root[$key] .
'/' . $path;
1741function dolBuildUrl($url, $params = [], $addtoken =
false)
1743 global $db, $hookmanager;
1745 if (!is_object($hookmanager)) {
1746 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
1749 if ((!isset($params[
'mainmenu']) || empty($params[
'mainmenu'])) && GETPOSTISSET(
'mainmenu')) {
1750 $params = array_merge($params, [
'mainmenu' => (
GETPOST(
'mainmenu',
'restricthtml'))]);
1752 if ((!isset($params[
'leftmenu'])) && GETPOSTISSET(
'leftmenu')) {
1753 $params = array_merge($params, [
'leftmenu' => (
GETPOST(
'leftmenu',
'restricthtml'))]);
1757 'params' => &$params,
1758 'addtoken' => &$addtoken,
1760 $hookmanager->executeHooks(
'buildurl', $parameters);
1762 $params = array_merge($params, [
'token' =>
newToken()]);
1766 $params = array_merge($params, [
'debug' =>
'debug']);
1769 $url .=
'?' . http_build_query($params);
1788 if (empty($properties)) {
1789 return get_object_vars($obj);
1792 $existingProperties = [];
1793 $realProperties = get_object_vars($obj);
1796 foreach ($properties as $property) {
1797 if (array_key_exists($property, $realProperties)) {
1799 $existingProperties[$property] = $obj->{$property};
1800 } elseif (property_exists($obj, $property)) {
1802 $existingProperties[$property] = $obj->{$property};
1806 return $existingProperties;
1825function dol_clone($srcobject, $native = 2)
1829 dol_syslog(
"Warning, call to dol_clone() with the deprecated parameter native=0, use 2 instead", LOG_WARNING);
1832 if (isset($srcobject->db) && isset($srcobject->db->db) && is_object($srcobject->db->db) && get_class($srcobject->db->db) ==
'PgSql\Connection') {
1833 $tmpsavdb = $srcobject->db;
1834 unset($srcobject->db);
1837 $myclone = unserialize(serialize($srcobject));
1839 if (!empty($tmpsavdb)) {
1840 $srcobject->db = $tmpsavdb;
1842 } elseif ($native == 2) {
1845 $tmparray = get_object_vars($srcobject);
1847 if (is_array($tmparray)) {
1848 foreach ($tmparray as $propertykey => $propertyval) {
1849 if (is_scalar($propertyval) || is_array($propertyval)) {
1850 $myclone->$propertykey = $propertyval;
1855 $myclone = clone $srcobject;
1872 if (is_object($srcobject)) {
1873 $srcobject = get_object_vars($srcobject);
1876 if (is_array($srcobject)) {
1878 foreach ($srcobject as $key => $value) {
1879 if (in_array($key, array(
'db',
'fields',
'error',
'errorhidden',
'errors',
'oldcopy',
'linkedObjects',
'linked_objects'))) {
1900function dol_size($size, $type =
'')
1903 if (empty($conf->dol_optimize_smallscreen)) {
1906 if ($type ==
'width' && $size > 250) {
1927function dol_sanitizeFileName($str, $newstr =
'_', $unaccent = 1, $includequotes = 0, $allowdash = 0)
1933 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1934 if ($includequotes) {
1935 $filesystem_forbidden_chars[] =
"'";
1938 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1939 if (empty($allowdash)) {
1940 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1941 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1943 $tmp = str_replace(
'..',
'', $tmp);
1944 $tmp = str_replace(
'~', $newstr, $tmp);
1945 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
1972 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1979 $tmp = preg_replace(
'/\-\-+/', $newstr, $tmp);
1980 if (empty($allowdash)) {
1981 $tmp = preg_replace(
'/\s+\-([^\s])/',
' '.$newstr.
'$1', $tmp);
1982 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1984 $tmp = str_replace(
'..', $newstr, $tmp);
1985 $tmp = str_replace(
'~', $newstr, $tmp);
1986 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
2002 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
2004 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
2006 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
2010 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
2014 $oldstringtoclean = $stringtoclean;
2017 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
2018 }
while ($oldstringtoclean != $stringtoclean);
2022 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
2025 return $stringtoclean;
2037 $oldstringtoclean = $stringtoclean;
2038 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
2039 }
while ($oldstringtoclean != $stringtoclean);
2041 return $stringtoclean;
2054 return preg_replace(
'/[^\w]+/',
'', $str);
2068 if (is_null($str)) {
2073 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
2074 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
2075 return $transliterator->transliterate($str);
2078 $string = rawurlencode($str);
2079 $replacements = array(
2156 $string = strtr($string, $replacements);
2157 return rawurldecode($string);
2162 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
2163 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
2164 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
2165 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
2166 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
2167 \xF9\xFA\xFB\xFC\xFD\xFF",
2175 $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"));
2193function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
2195 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
2196 if (empty($keepspaces)) {
2197 $forbidden_chars_to_replace[] =
" ";
2199 $forbidden_chars_to_remove = array();
2202 if (is_array($badcharstoreplace)) {
2203 $forbidden_chars_to_replace = $badcharstoreplace;
2205 if (is_array($badcharstoremove)) {
2206 $forbidden_chars_to_remove = $badcharstoremove;
2210 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
2229 if ($removetabcrlf) {
2230 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
2232 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
2247 if (function_exists(
'iconv')) {
2248 $slug = iconv(
'UTF-8',
'ASCII//TRANSLIT//IGNORE', $slug);
2252 $slug = strtolower($slug);
2255 $slug = preg_replace(
'/[^a-z0-9]+/',
'-', $slug);
2258 $slug = trim($slug,
'-');
2271function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
2273 if (is_null($stringtoescape)) {
2278 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
2280 if (empty($noescapebackslashn)) {
2281 $substitjs[
"\n"] =
'\\n';
2282 $substitjs[
'\\'] =
'\\\\';
2285 $substitjs[
"'"] =
"\\'";
2286 $substitjs[
'"'] =
"\\'";
2287 } elseif ($mode == 1) {
2288 $substitjs[
"'"] =
"\\'";
2289 } elseif ($mode == 2) {
2290 $substitjs[
'"'] =
'\\"';
2291 } elseif ($mode == 3) {
2292 $substitjs[
"'"] =
"\\'";
2293 $substitjs[
'"'] =
"\\\"";
2295 return strtr((
string) $stringtoescape, $substitjs);
2309 return rawurlencode($stringtoescape);
2320 return str_replace(
'"',
'\"', $stringtoescape);
2332 if (is_null($stringtoescape)) {
2336 if ($stringforquotes == 2) {
2337 return str_replace(
'"',
"'", $stringtoescape);
2338 } elseif ($stringforquotes == 1) {
2344 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
2345 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
2348 return 'Bad parameter for stringforquotes in dol_escape_php';
2359 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
2370 return $stringtoescape;
2434 $allowedtags = array(
'br',
'b',
'font',
'hr',
'span');
2435 if (!empty($allowothertags) && is_array($allowothertags)) {
2436 $allowedtags = array_merge($allowedtags, $allowothertags);
2440 if ($escapeonlyhtmltags) {
2441 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 0, 0, 0, $allowedtags), 1, -1,
'', 1, 1);
2443 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, $allowedtags), 1, -1,
'', 0, 1);
2459 $escapeonlyhtmltags = 1;
2460 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 1, 1, 0, array()), 0, 0,
'', $escapeonlyhtmltags, 1);
2485 return htmlspecialchars($s, ENT_HTML5,
'UTF-8');
2505function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2507 if ($noescapetags ==
'common') {
2508 $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';
2510 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2512 if ($cleanalsojavascript) {
2517 if ($escapeonlyhtmltags) {
2518 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2525 $tmp = (string) $stringtoescape;
2528 $tmp = str_ireplace(
'<',
'__DONOTDECODELT', $tmp);
2529 $tmp = str_ireplace(
'>',
'__DONOTDECODEGT', $tmp);
2530 $tmp = str_ireplace(
'&',
'__DONOTDECODEAMP', $tmp);
2531 $tmp = str_ireplace(
'"',
'__DONOTDECODEQUOT', $tmp);
2532 $tmp = str_ireplace(
'&apos',
'__DONOTDECODEAPOS', $tmp);
2533 $tmp = str_ireplace(
''',
'__DONOTDECODE39', $tmp);
2535 $tmp = html_entity_decode((
string) $tmp, ENT_COMPAT,
'UTF-8');
2538 $tmp = str_ireplace(
'__DONOTDECODELT',
'<', $tmp);
2539 $tmp = str_ireplace(
'__DONOTDECODEGT',
'>', $tmp);
2540 $tmp = str_ireplace(
'__DONOTDECODEAMP',
'&', $tmp);
2541 $tmp = str_ireplace(
'__DONOTDECODEQUOT',
'"', $tmp);
2542 $tmp = str_ireplace(
'__DONOTDECODEAPOS',
'&apos', $tmp);
2543 $tmp = str_ireplace(
'__DONOTDECODE39',
''', $tmp);
2545 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE__', $tmp);
2548 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2551 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2552 } elseif ($keepn == -1) {
2553 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2556 if ($escapeonlyhtmltags) {
2557 $tmp = htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2561 $tmparrayoftags = array();
2562 if ($noescapetags) {
2563 $tmparrayoftags = explode(
',', $noescapetags);
2566 if (count($tmparrayoftags)) {
2571 $tmp = str_ireplace(array(
'__DOUBLEQUOTE',
'__BEGINTAGTOREPLACE',
'__ENDTAGTOREPLACE',
'__BEGINENDTAGTOREPLACE'),
'', $tmp);
2573 foreach ($tmparrayoftags as $tagtoreplace) {
2575 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
'>/',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2576 $tmp = str_ireplace(
'</' . $tagtoreplace .
'>',
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2577 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
' \/>/',
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2583 if (preg_match(
'/<' . preg_quote($tagtoreplace,
'/') .
'(\s+)([^>]+)>/', $tmp, $reg)) {
2585 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2586 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE__', $tmpattributes);
2587 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2589 $tmp = str_replace(
'<' . $tagtoreplace . $reg[1] . $reg[2] .
'>',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'[' . $tmpattributes .
']__', $tmp);
2592 $diff = strcmp($tmpold, $tmp);
2596 $tmp = str_ireplace(
'&',
'__ANDNOSEMICOLON__', $tmp);
2597 $tmp = str_ireplace(
'"',
'__DOUBLEQUOTENOSEMICOLON__', $tmp);
2598 $tmp = str_ireplace(
'<',
'__LESSTHAN__', $tmp);
2599 $tmp = str_ireplace(
'>',
'__GREATERTHAN__', $tmp);
2603 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2607 if (count($tmparrayoftags)) {
2609 foreach ($tmparrayoftags as $tagtoreplace) {
2610 $result = str_ireplace(
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
'>', $result);
2611 $result = preg_replace(
'/__BEGINTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1>', $result);
2612 $result = str_ireplace(
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__',
'</' . $tagtoreplace .
'>', $result);
2613 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
' />', $result);
2614 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1 />', $result);
2617 $result = str_ireplace(
'__DOUBLEQUOTE__',
'"', $result);
2619 $result = str_ireplace(
'__ANDNOSEMICOLON__',
'&', $result);
2620 $result = str_ireplace(
'__DOUBLEQUOTENOSEMICOLON__',
'"', $result);
2621 $result = str_ireplace(
'__LESSTHAN__',
'<', $result);
2622 $result = str_ireplace(
'__GREATERTHAN__',
'>', $result);
2625 $result = str_ireplace(
'__SIMPLEQUOTE__',
''', $result);
2642 if (function_exists(
'mb_strtolower')) {
2643 return mb_strtolower($string, $encoding);
2645 return strtolower($string);
2659 if (function_exists(
'mb_strtoupper')) {
2660 return mb_strtoupper($string, $encoding);
2662 return strtoupper($string);
2676 if (function_exists(
'mb_substr')) {
2677 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding) . mb_substr($string, 1,
null, $encoding);
2679 return ucfirst($string);
2693 if (function_exists(
'mb_convert_case')) {
2694 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2696 return ucwords($string);
2708 $backtrace = debug_backtrace();
2710 if (count($backtrace) >= 1) {
2712 if (count($backtrace) == 1) {
2715 $trace = $backtrace[$pos];
2716 if (isset($trace[
'file'], $trace[
'line'])) {
2717 $msg =
" From {$trace['file']}:{$trace['line']}.";
2745function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2747 global $conf, $user, $debugbar;
2755 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2756 global $website, $websitekey;
2757 if (is_object($website) && !empty($website->ref)) {
2758 $suffixinfilename .=
'_website_' . $website->ref;
2759 } elseif (!empty($websitekey)) {
2760 $suffixinfilename .=
'_website_' . $websitekey;
2765 if (defined(
'USESUFFIXINLOG')) {
2766 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2770 foreach ($conf->loghandlers as $loghandlerinstance) {
2771 $loghandlerinstance->setIdent($ident);
2775 if (!empty($message)) {
2778 $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');
2780 if (!array_key_exists($level, $logLevels)) {
2781 dol_syslog(
'Error Bad Log Level ' . $level, LOG_ERR);
2789 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2793 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2794 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))
2796 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2797 $osuser =
" " . sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2799 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S") .
" " . sprintf(
"%-7s", $logLevels[$level]) .
" " . $ospid .
" " . $osuser .
" " . $message;
2805 print
"\n\n<!-- Log start\n";
2807 print
"Log end -->\n";
2811 'message' => $message,
2812 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
''),
2814 'user' => ((is_object($user) && $user->id) ? $user->login :
''),
2816 'osuser' => function_exists(
'posix_getuid') ? (string) posix_getuid() :
'',
2817 'ospid' => (string) getmypid()
2822 if (!empty($remoteip)) {
2823 $data[
'ip'] = $remoteip;
2827 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
2828 $tmpips = explode(
',', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
2832 foreach ($tmpips as $tmpip) {
2833 $tmpip = trim($tmpip);
2834 if (strtolower($tmpip) == strtolower($remoteip)) {
2837 if (empty($data[
'ip'])) {
2838 $data[
'ip'] = $tmpip;
2841 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2844 if (!$foundremoteip) {
2846 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2848 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2849 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP'])) {
2850 $tmpips = explode(
',', $_SERVER[
'HTTP_CLIENT_IP']);
2854 foreach ($tmpips as $tmpip) {
2855 $tmpip = trim($tmpip);
2856 if (strtolower($tmpip) == strtolower($remoteip)) {
2859 if (empty($data[
'ip'])) {
2860 $data[
'ip'] = $tmpip;
2863 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2866 if (!$foundremoteip) {
2868 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2870 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2872 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2874 $data[
'ip'] = (string) $_SERVER[
'SERVER_ADDR'];
2875 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2877 $data[
'ip'] = (string) $_SERVER[
'COMPUTERNAME'];
2879 $data[
'ip'] =
'???';
2882 if (!empty($_SERVER[
'USERNAME'])) {
2884 $data[
'osuser'] = (string) $_SERVER[
'USERNAME'];
2885 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2887 $data[
'osuser'] = (string) $_SERVER[
'LOGNAME'];
2891 foreach ($conf->loghandlers as $loghandlerinstance) {
2892 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2895 $loghandlerinstance->export($data, $suffixinfilename);
2901 foreach ($conf->loghandlers as $loghandlerinstance) {
2902 $loghandlerinstance->setIdent($ident);
2922 $form =
new Form($db);
2924 $templatenameforexport = $website->name_template;
2925 if (empty($templatenameforexport)) {
2926 $templatenameforexport =
'website_' . $website->ref;
2930 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="' .
dol_escape_htmltag($buttonstring) .
'"/>';
2933 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2934 $out .=
'jQuery(document).ready(function () {';
2935 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2936 $out .=
' var dialogHtml = \'';
2938 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2939 $dialogcontent .=
' <div style="margin-top: 20px;">';
2940 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>' . $langs->trans(
"ExportSiteLabel") .
'...</label><br>';
2941 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2942 $dialogcontent .=
' </div>';
2943 $dialogcontent .=
' <br>';
2944 $dialogcontent .=
' <div style="margin-top: 20px;">';
2945 $dialogcontent .=
' <strong>' . $langs->trans(
"ExportSiteGitLabel") .
' ' . $form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'') .
'</strong><br>';
2946 $dialogcontent .=
' <form action="' .
dol_escape_htmltag($overwriteGitUrl) .
'" method="POST">';
2947 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2948 $dialogcontent .=
' <input type="hidden" name="token" value="' .
newToken() .
'">';
2949 $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>';
2950 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2951 $dialogcontent .=
' </form>';
2952 $dialogcontent .=
' </div>';
2953 $dialogcontent .=
' </div>';
2960 // Add the content of the dialog to the body of the page
2961 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2962 $out .= ' if ($dialog.length > 0) {
2965 jQuery(
"body").append(dialogHtml);
';
2967 // Configuration of popup
2968 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2969 $out .= ' autoOpen:
false,
';
2970 $out .= ' modal:
true,
';
2971 $out .= ' height: 290,
';
2972 $out .= ' width:
"40%",
';
2973 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2976 // Simulate a click on the original "submit" input to export the site.
2977 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2978 $out .= ' console.log(
"Clic on exportsite.");
';
2979 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2980 $out .= ' console.log(
"element founded:", target.length > 0);
';
2981 $out .= ' if (target.length > 0) { target.click(); }
';
2982 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2986 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2987 $out .= ' return false;
';
2990 $out .= '</script>
';
3012function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $jsonclose = '', $accesskey = '')
3016 if (strpos($url, '?
') > 0) {
3017 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3019 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3022 if (preg_match('/^https/i
', $url)) {
3025 $urltoopen = DOL_URL_ROOT . $url;
3030 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
3031 $out .= '<!-- a link
for button to open url into a dialog popup -->
';
3032 $out .= '<a
' . ($accesskey ? ' accesskey=
"' . $accesskey . '"' : '') . ' class=
"cursorpointer reposition button_' . $name . ($morecss ? ' ' . $morecss : '') . '"' . $disabled . ' title=
"' . dol_escape_htmltag($label) . '"';
3033 if (empty($conf->use_javascript_ajax)) {
3034 $out .= ' href=
"' . $urltoopen . '" target=
"_blank"';
3035 } elseif ($jsonopen) {
3036 $out .= ' href=
"#" onclick=
"' . $jsonopen . '"';
3038 $out .= ' href=
"#"';
3040 $out .= '>
' . $buttonstring . '</a>
';
3042 if (!empty($conf->use_javascript_ajax)) {
3043 // Add code to open url using the popup.
3044 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
3045 $out .= '<div
id=
"idfordialog' . $name . '" class=
"hidden">
' . (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '') . '</div>
';
3047 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
3048 $out .= '<script nonce=
"' . getNonce() . '" type=
"text/javascript">
3049 jQuery(document).ready(
function () {
3050 jQuery(
".button_' . $name . '").click(
function () {
3051 console.log(\
'Open popup with jQuery(...).dialog() on URL ' .
dol_escape_js($urltoopen) .
'\');
3052 var $tmpdialog = $(\
'#idfordialog' . $name .
'\');
3053 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog' . $name .
'" style="border: 0px;" src="' . $urltoopen .
'" width="100%" height="98%"></iframe>\');
3057 height: (window.innerHeight - 150),
3060 open: function (event, ui) {
3061 console.log(
"open popup name=' . $name . '");
3063 close:
function (event, ui) {
3064 console.log(
"Popup is closed, run jsonclose = ' . $jsonclose . '");
3065 ' . (empty($jsonclose) ? '' : $jsonclose . ';
') . '
3069 $tmpdialog.dialog(\
'open\');
3094function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
3096 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
3116function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0, $morecssdiv =
'')
3118 global $conf, $langs, $hookmanager;
3122 if (!empty($conf->dol_optimize_smallscreen)) {
3126 $out =
"\n" .
'<!-- dol_fiche_head - dol_get_fiche_head -->';
3128 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3129 $out .=
'<div class="tabs' . ($picto ?
'' :
' nopaddingleft') .
'" data-role="controlgroup" data-type="horizontal">' .
"\n";
3133 if ($morehtmlright) {
3134 $out .=
'<div class="inline-block floatright tabsElem">' . $morehtmlright .
'</div>';
3141 if (is_array($links) && !empty($links)) {
3142 $keys = array_keys($links);
3144 $maxkey = max($keys);
3150 if (empty($limittoshow)) {
3153 if (!empty($conf->dol_optimize_smallscreen)) {
3161 for ($i = 0; $i <= $maxkey; $i++) {
3162 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3164 if ($i >= $limittoshow) {
3170 for ($i = 0; $i <= $maxkey; $i++) {
3171 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3177 if ($i < $limittoshow || $isactive) {
3179 $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])) .
' -->';
3181 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3182 if (!empty($links[$i][0])) {
3183 $out .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3185 $out .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3187 } elseif (!empty($links[$i][1])) {
3189 $out .=
'<div class="tab tab' . ($isactive ?
'active' :
'unactive') .
'" style="margin: 0 !important">';
3191 if (!empty($links[$i][0])) {
3192 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
3193 $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) .
'">';
3196 if ($displaytab == 0 && $picto) {
3197 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
3200 $out .= $links[$i][1];
3201 if (!empty($links[$i][0])) {
3202 $out .=
'</a>' .
"\n";
3204 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
3213 $outmore .=
'<div class="popuptabset wordwrap">';
3215 $outmore_content =
'';
3217 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3218 if (!empty($links[$i][0])) {
3219 $outmore_content .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3221 $outmore_content .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3223 } elseif (!empty($links[$i][1])) {
3224 $outmore_content .=
'<a' . (!empty($links[$i][2]) ?
' id="' . $links[$i][2] .
'"' :
'') .
' class="wordwrap inline-block' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">';
3225 $outmore_content .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
3226 $outmore_content .=
'</a>' .
"\n";
3228 if ($outmore_content !==
'') {
3229 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">' . $outmore_content .
'</div>';
3235 $displaytab = $i + 1;
3238 $outmore .=
'</div>';
3242 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
3243 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
3244 $widthofpopup = 240;
3246 $tabsname = $moretabssuffix;
3247 if (empty($tabsname)) {
3248 $tabsname = str_replace(
"@",
"", $picto);
3250 $out .=
'<div id="moretabs' . $tabsname .
'" class="inline-block tabsElem valignmiddle">';
3252 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">' . $langs->trans(
"More") .
'</span>... (' . $nbintab .
')</a></div>';
3254 $out .=
'<div id="moretabsList' . $tabsname .
'" style="width: ' . $widthofpopup .
'px; position: absolute; ' . $left .
': -999em; text-align: ' . $left .
'; margin:0px; padding:2px; z-index:10;">';
3257 $out .=
'<div></div>';
3260 $out .=
'<script nonce="' .
getNonce() .
'">';
3261 $out .=
"$('#moretabs" . $tabsname .
"').mouseenter( function() {
3262 var x = this.offsetLeft, y = this.offsetTop;
3263 console.log('mouseenter " . $left .
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
3264 if ((window.innerWidth - x) < " . ($widthofpopup + 10) .
") {
3265 $('#moretabsList" . $tabsname .
"').css('" . $right .
"','8px');
3267 $('#moretabsList" . $tabsname .
"').css('" . $left .
"','auto');
3270 $out .=
"$('#moretabs" . $tabsname .
"').mouseleave( function() { console.log('mouseleave " . $left .
"'); $('#moretabsList" . $tabsname .
"').css('" . $left .
"','-999em');});";
3271 $out .=
"</script>";
3274 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3278 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
3279 $out .=
"\n" .
'<div id="dragDropAreaTabBar" class="tabBar' . ($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'') . ($notab == -4 ?
'' :
' tabBarWithBottom'))));
3280 $out .= ($morecssdiv ?
' ' . $morecssdiv :
'');
3281 $out .=
'">' .
"\n";
3283 if (!empty($dragdropfile)) {
3284 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3287 $parameters = array(
'tabname' => $active,
'out' => $out);
3288 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
3290 $out = $hookmanager->resPrint;
3316 if (!$notab || $notab == -1) {
3317 return "\n</div>\n";
3342function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
3344 global $conf, $form, $user, $langs, $hookmanager, $action;
3348 $maxvisiblephotos = 1;
3350 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
3353 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
3356 $modulepart =
'unknown';
3358 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
3359 $modulepart =
$object->element;
3360 } elseif (
$object->element ==
'member') {
3361 $modulepart =
'memberphoto';
3362 } elseif (
$object->element ==
'user') {
3363 $modulepart =
'userphoto';
3366 if (class_exists(
"Imagick")) {
3367 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
3368 $modulepart =
$object->element;
3369 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
3370 $modulepart =
'ficheinter';
3371 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3372 $modulepart =
'contract';
3373 } elseif (
$object->element ==
'order_supplier') {
3374 $modulepart =
'supplier_order';
3375 } elseif (
$object->element ==
'invoice_supplier') {
3376 $modulepart =
'supplier_invoice';
3380 if (
$object->element ==
'product') {
3382 '@phan-var-force Product $object';
3384 $cssclass =
'photowithmargin photoref';
3385 $showimage =
$object->is_photo_available($conf->product->multidir_output[$entity]);
3387 if ($conf->browser->layout ==
'phone') {
3388 $maxvisiblephotos = 1;
3391 $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>';
3395 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3397 $nophoto =
'/public/theme/common/nophoto.png';
3398 $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>';
3401 } elseif (
$object->element ==
'category') {
3403 '@phan-var-force Categorie $object';
3405 $cssclass =
'photowithmargin photoref';
3406 $showimage =
$object->isAnyPhotoAvailable($conf->categorie->multidir_output[$entity]);
3408 if ($conf->browser->layout ==
'phone') {
3409 $maxvisiblephotos = 1;
3412 $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>';
3416 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3418 $nophoto =
'/public/theme/common/nophoto.png';
3419 $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>';
3422 } elseif (
$object->element ==
'bom') {
3424 '@phan-var-force Bom $object';
3426 $cssclass =
'photowithmargin photoref';
3427 $showimage =
$object->is_photo_available($conf->bom->multidir_output[$entity]);
3429 if ($conf->browser->layout ==
'phone') {
3430 $maxvisiblephotos = 1;
3433 $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>';
3437 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3439 $nophoto =
'/public/theme/common/nophoto.png';
3440 $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>';
3443 } elseif (
$object->element ==
'ticket') {
3445 $cssclass =
'photoref';
3447 '@phan-var-force Ticket $object';
3448 $showimage =
$object->is_photo_available($conf->ticket->multidir_output[$entity] .
'/' .
$object->ref);
3450 if ($conf->browser->layout ==
'phone') {
3451 $maxvisiblephotos = 1;
3455 $showphoto =
$object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
3457 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $showphoto .
'</div>';
3465 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3467 $nophoto =
img_picto(
'No photo',
'object_ticket');
3468 $morehtmlleft .=
'<!-- No photo to show -->';
3469 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3470 $morehtmlleft .= $nophoto;
3471 $morehtmlleft .=
'</div></div>';
3475 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3478 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3480 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]) .
"/";
3481 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3483 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'') . $objectref;
3487 if (empty($subdir)) {
3488 $subdir =
'errorgettingsubdirofobject';
3491 $filepath = $dir_output . $subdir .
"/";
3493 $filepdf = $filepath . $objectref .
".pdf";
3494 $relativepath = $subdir .
'/' . $objectref .
'.pdf';
3497 $fileimage = $filepdf .
'_preview.png';
3498 $relativepathimage = $relativepath .
'_preview.png';
3500 $pdfexists = file_exists($filepdf);
3505 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3507 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3516 if ($pdfexists && !$error) {
3517 $heightforphotref = 80;
3518 if (!empty($conf->dol_optimize_smallscreen)) {
3519 $heightforphotref = 60;
3522 if (file_exists($fileimage)) {
3523 $phototoshow =
'<div class="photoref">';
3524 $phototoshow .=
'<img height="' . $heightforphotref .
'" class="photo photowithborder" src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=apercu' . $modulepart .
'&file=' . urlencode($relativepathimage) .
'">';
3525 $phototoshow .=
'</div>';
3528 } elseif (!$phototoshow) {
3529 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0);
3533 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3534 $morehtmlleft .= $phototoshow;
3535 $morehtmlleft .=
'</div>';
3539 if (empty($phototoshow)) {
3540 if (
$object->element ==
'action') {
3542 $cssclass =
'photorefcenter';
3543 $nophoto =
img_picto(
'No photo',
'title_agenda');
3546 $cssclass =
'photorefcenter';
3548 $prefix =
'object_';
3552 if (strpos($picto,
'fontawesome_') !==
false) {
3555 $nophoto =
img_picto(
'No photo', $prefix . $picto);
3557 $morehtmlleft .=
'<!-- No photo to show -->';
3558 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3559 $morehtmlleft .= $nophoto;
3560 $morehtmlleft .=
'</div></div>';
3566 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $form->showbarcode(
$object, 100,
'photoref valignmiddle') .
'</div>';
3569 if (
$object->element ==
'societe') {
3571 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3574 $morehtmlstatus .=
$object->getLibStatut(6);
3576 } elseif (
$object->element ==
'product') {
3579 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3580 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'status',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3582 $morehtmlstatus .=
'<span class="statusrefsell">' .
$object->getLibStatut(6, 0) .
'</span>';
3584 $morehtmlstatus .=
' ';
3586 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3587 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'status_buy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3589 $morehtmlstatus .=
'<span class="statusrefbuy">' .
$object->getLibStatut(6, 1) .
'</span>';
3591 } elseif (in_array(
$object->element, array(
'salary'))) {
3593 '@phan-var-force Salary $object';
3595 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3598 $morehtmlstatus .= $tmptxt;
3599 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3601 '@phan-var-force Facture|FactureFournisseur|CommonInvoice $object';
3602 if (!isset(
$object->alreadypaid)) {
3608 $tmptxt =
$object->getLibStatut(6, (
float)
$object->alreadypaid);
3609 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3610 $tmptxt =
$object->getLibStatut(5, (
float)
$object->alreadypaid);
3612 $morehtmlstatus .= $tmptxt;
3613 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3615 '@phan-var-force ChargeSociales|Loan|Tva $object';
3617 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3620 $morehtmlstatus .= $tmptxt;
3621 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3624 $morehtmlstatus .=
$object->getLibStatut(5);
3626 $morehtmlstatus .=
$object->getLibStatut(4);
3628 } elseif (
$object->element ==
'facturerec') {
3630 '@phan-var-force FactureRec $object';
3631 if (
$object->frequency == 0) {
3632 $morehtmlstatus .=
$object->getLibStatut(2);
3634 $morehtmlstatus .=
$object->getLibStatut(5);
3636 } elseif (
$object->element ==
'project_task') {
3638 $tmptxt =
$object->getLibStatut(4);
3639 $morehtmlstatus .= $tmptxt;
3640 } elseif (method_exists(
$object,
'getLibStatut')) {
3641 $tmptxt =
$object->getLibStatut(6);
3642 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3643 $tmptxt =
$object->getLibStatut(5);
3645 $morehtmlstatus .= $tmptxt;
3649 if (
isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3651 if (method_exists(
$object,
'getVentilExportCompta')) {
3652 $accounted =
$object->getVentilExportCompta(1);
3653 $langs->load(
"accountancy");
3654 $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>';
3659 if (!empty(
$object->name_alias)) {
3661 '@phan-var-force Societe $object';
3666 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3669 $morehtmlref .=
'<div class="refidno banner-object-label">' .
$object->label .
'</div>';
3673 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3676 $morehtmlref .=
'<div class="refidno refaddress">';
3677 $morehtmlref .= $moreaddress;
3678 $morehtmlref .=
'</div>';
3682 $morehtmlref .=
'<div style="clear: both;"></div>';
3683 $morehtmlref .=
'<div class="refidno opacitymedium">';
3684 $morehtmlref .= $langs->trans(
"TechnicalID") .
': ' . ((int)
$object->id);
3685 $morehtmlref .=
'</div>';
3688 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3689 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3692 } elseif (empty($reshook)) {
3693 $morehtmlref .= $hookmanager->resPrint;
3694 } elseif ($reshook > 0) {
3695 $morehtmlref = $hookmanager->resPrint;
3704 print
'<div class="' . ($onlybanner ?
'arearefnobottom ' :
'arearef ') .
'heightref valignmiddle centpercent object-banner-tab-container" data-module-part="'.
dolPrintHTMLForAttribute($modulepart).
'">';
3705 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3707 print
'<div class="underrefbanner clearboth"></div>';
3719function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3723 if ($fieldrequired) {
3724 $ret .=
'<span class="fieldrequired">';
3726 $ret .=
'<label for="' . $fieldkey .
'">';
3727 $ret .= $langs->trans($langkey);
3729 if ($fieldrequired) {
3750 global $langs, $hookmanager;
3753 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3758 $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)));
3761 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3763 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3764 $ret .= (($ret && $town) ? $sep :
'') . $town;
3767 $ret .= ($ret ? ($town ?
", " : $sep) :
'') .
$object->state;
3770 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'') .
$object->zip;
3772 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3774 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3775 $ret .= ($ret ? $sep :
'') . $town;
3777 $ret .= ($ret ?
", " :
'') .
$object->state;
3780 $ret .= ($ret ? $sep :
'') .
$object->zip;
3782 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3784 $ret .= ($ret ? $sep :
'') .
$object->zip;
3785 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3786 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3788 $ret .= $sep .
$object->state;
3790 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3793 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3795 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3797 $ret .= ($ret ? $sep :
'') .
$object->zip;
3798 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3799 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3800 $ret .= (empty(
$object->state_code) ?
'' : (
' ' .
$object->state_code));
3803 $town = (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3804 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'') .
$object->zip) :
'';
3805 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')) . $town) :
'');
3806 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3807 $ret .= ($ret ?
", " :
'') .
$object->state;
3811 if (!is_object($outputlangs)) {
3812 $outputlangs = $langs;
3815 $langs->load(
"dict");
3816 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'') . $outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country" .
$object->country_code)));
3819 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3820 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3824 $ret .= $hookmanager->resPrint;
3841function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3843 if ((abs($ts) <= 0x7FFFFFFF)) {
3846 return 'Error date outside supported range';
3872function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false, $decorate = 0)
3874 global $conf, $langs;
3881 if ($tzoutput ===
'auto') {
3882 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
3887 $offsettz = $offsetdst = 0;
3890 if (is_string($tzoutput)) {
3891 if ($tzoutput ==
'tzserver') {
3893 $offsettzstring = @date_default_timezone_get();
3898 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3901 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
getDolGlobalString(
'MAIN_DOLIBARR_USER_TIMEZONE',
'UTC') : $_SESSION[
'dol_tz_string']);
3903 if (class_exists(
'DateTimeZone')) {
3905 $user_date_tz =
new DateTimeZone($offsettzstring);
3908 dol_syslog(
"DateInvalidTimeZoneException for timezone string '".$offsettzstring.
"'. Falling back to UTC.", LOG_ERR);
3909 $user_date_tz =
new DateTimeZone(
'UTC');
3911 $user_dt =
new DateTime();
3912 $user_dt->setTimezone($user_date_tz);
3913 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3914 $offsettz = $user_dt->getOffset();
3916 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3917 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3922 if (!is_object($outputlangs)) {
3923 $outputlangs = $langs;
3926 $format =
'daytextshort';
3931 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3932 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3933 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3934 if ($formatwithoutreduce != $format) {
3935 $format = $formatwithoutreduce;
3941 if ($format ==
'day') {
3942 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
3943 } elseif ($format ==
'hour') {
3944 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
3945 } elseif ($format ==
'hourduration') {
3946 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
3947 } elseif ($format ==
'daytext') {
3948 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
3949 } elseif ($format ==
'daytextshort') {
3950 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
3951 } elseif ($format ==
'dayhour') {
3952 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
3953 } elseif ($format ==
'dayhoursec') {
3954 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
3955 } elseif ($format ==
'dayhourtext') {
3956 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
3957 } elseif ($format ==
'dayhourtextshort') {
3958 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
3959 } elseif ($format ==
'dayhourlog') {
3961 $format =
'%Y%m%d%H%M%S';
3962 } elseif ($format ==
'dayhourlogsmall') {
3964 $format =
'%y%m%d%H%M';
3965 } elseif ($format ==
'dayhourldap') {
3966 $format =
'%Y%m%d%H%M%SZ';
3967 } elseif ($format ==
'dayhourxcard') {
3968 $format =
'%Y%m%dT%H%M%SZ';
3969 } elseif ($format ==
'dayxcard') {
3971 } elseif ($format ==
'dayrfc') {
3972 $format =
'%Y-%m-%d';
3973 } elseif ($format ==
'dayhourrfc') {
3974 $format =
'%Y-%m-%dT%H:%M:%SZ';
3975 } elseif ($format ==
'standard') {
3976 $format =
'%Y-%m-%d %H:%M:%S';
3979 if ($reduceformat) {
3980 $format = str_replace(
'%Y',
'%y', $format);
3981 $format = str_replace(
'yyyy',
'yy', $format);
3985 if (preg_match(
'/%b/i', $format)) {
3987 $format = str_replace(
'%b',
'__b__', $format);
3988 $format = str_replace(
'%B',
'__B__', $format);
3990 if (preg_match(
'/%a/i', $format)) {
3992 $format = str_replace(
'%a',
'__a__', $format);
3993 $format = str_replace(
'%A',
'__A__', $format);
3998 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)) {
4001 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
4005 $syear = (!empty($reg[1]) ? $reg[1] :
'');
4006 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
4007 $sday = (!empty($reg[3]) ? $reg[3] :
'');
4008 $shour = (!empty($reg[4]) ? $reg[4] :
'');
4009 $smin = (!empty($reg[5]) ? $reg[5] :
'');
4010 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
4012 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
4015 $tzo =
new DateTimeZone(
'UTC');
4017 $tzo =
new DateTimeZone(date_default_timezone_get());
4019 $dtts =
new DateTime();
4020 $dtts->setTimestamp($time);
4021 $dtts->setTimezone($tzo);
4022 $newformat = str_replace(
4023 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4024 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4027 $ret = $dtts->format($newformat);
4029 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4030 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4035 if ($time < 100000000000) {
4036 $dtts =
new DateTime();
4039 $timetouse = (int) $time + $offsettz + $offsetdst;
4041 $tzo =
new DateTimeZone(
'UTC');
4042 $dtts->setTimezone($tzo);
4043 $dtts->setTimestamp($timetouse);
4045 $timetouse = (int) $time + $offsettz + $offsetdst;
4047 $tzo =
new DateTimeZone(date_default_timezone_get());
4048 $dtts->setTimestamp($timetouse);
4049 $dtts->setTimezone($tzo);
4052 $newformat = str_replace(
4053 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4054 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4058 $ret = $dtts->format($newformat);
4061 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4062 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4066 $ret =
'Bad value ' . $time .
' for date';
4070 if (preg_match(
'/__b__/i', $format)) {
4071 $timetouse = $time + $offsettz + $offsetdst;
4074 $tzo =
new DateTimeZone(
'UTC');
4076 $tzo =
new DateTimeZone(date_default_timezone_get());
4078 $dtts =
new DateTime();
4079 $dtts->setTimestamp($timetouse);
4080 $dtts->setTimezone($tzo);
4081 $month = (int) $dtts->format(
"m");
4082 $month = sprintf(
"%02d", $month);
4083 if ($encodetooutput) {
4084 $monthtext = $outputlangs->transnoentities(
'Month' . $month);
4085 $monthtextshort = $outputlangs->transnoentities(
'MonthShort' . $month);
4087 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month' . $month);
4088 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort' . $month);
4091 $ret = str_replace(
'__b__', $monthtextshort, $ret);
4092 $ret = str_replace(
'__B__', $monthtext, $ret);
4096 if (preg_match(
'/__a__/i', $format)) {
4098 $timetouse = $time + $offsettz + $offsetdst;
4101 $tzo =
new DateTimeZone(
'UTC');
4103 $tzo =
new DateTimeZone(date_default_timezone_get());
4105 $dtts =
new DateTime();
4106 $dtts->setTimestamp($timetouse);
4107 $dtts->setTimezone($tzo);
4108 $w = $dtts->format(
"w");
4109 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day' . $w);
4111 $ret = str_replace(
'__A__', $dayweek, $ret);
4112 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
4116 $ret = preg_replace(
'/(\d\d:\d\d [AP]M)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4117 $ret = preg_replace(
'/(\d\d:\d\d)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4144function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
4146 if ($timestamp ===
'') {
4150 $datetimeobj =
new DateTime();
4151 $datetimeobj->setTimestamp($timestamp);
4152 if ($forcetimezone) {
4153 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
4156 'year' => ((
int) date_format($datetimeobj,
'Y')),
4157 'mon' => ((
int) date_format($datetimeobj,
'm')),
4158 'mday' => ((
int) date_format($datetimeobj,
'd')),
4159 'wday' => ((
int) date_format($datetimeobj,
'w')),
4160 'yday' => ((
int) date_format($datetimeobj,
'z')),
4161 'hours' => ((
int) date_format($datetimeobj,
'H')),
4162 'minutes' => ((
int) date_format($datetimeobj,
'i')),
4163 'seconds' => ((
int) date_format($datetimeobj,
's')),
4191function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
4196 if ($gm ===
'auto') {
4197 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
4202 if ($hour == -1 || empty($hour)) {
4205 if ($minute == -1 || empty($minute)) {
4208 if ($second == -1 || empty($second)) {
4214 if (!$month || !$day) {
4223 if ($hour < 0 || $hour > 24) {
4226 if ($minute < 0 || $minute > 60) {
4229 if ($second < 0 || $second > 60) {
4234 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
4235 $default_timezone = @date_default_timezone_get();
4236 $localtz =
new DateTimeZone($default_timezone);
4237 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
4239 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
4241 $localtz =
new DateTimeZone($default_timezone);
4243 dol_syslog(
"Warning dol_tz_string contains an invalid value " . json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
4244 $default_timezone = @date_default_timezone_get();
4246 } elseif (strrpos($gm,
"tz,") !==
false) {
4247 $timezone = str_replace(
"tz,",
"", $gm);
4249 $localtz =
new DateTimeZone($timezone);
4251 dol_syslog(
"Warning passed timezone contains an invalid value " . $timezone, LOG_WARNING);
4255 if (empty($localtz)) {
4256 $localtz =
new DateTimeZone(
'UTC');
4258 $dt =
new DateTime(
'now', $localtz);
4259 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
4260 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
4261 $date = $dt->getTimestamp();
4277function dol_now($mode =
'gmt')
4281 if ($mode ===
'auto') {
4285 if ($mode ==
'gmt') {
4287 } elseif ($mode ==
'tzserver') {
4288 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
4290 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
4295 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
4298 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
4299 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
4300 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
4317 global $conf, $langs;
4320 if (!empty($conf->dol_optimize_smallscreen)) {
4325 if (empty($shortvalue) || $size < ($level * 10)) {
4327 $textunitshort = $langs->trans(
"b");
4328 $textunitlong = $langs->trans(
"Bytes");
4330 $ret = round($size / $level, 0);
4331 $textunitshort = $langs->trans(
"Kb");
4332 $textunitlong = $langs->trans(
"KiloBytes");
4335 if (empty($shortunit)) {
4336 $ret .=
' ' . $textunitlong;
4338 $ret .=
' ' . $textunitshort;
4354function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
4362 $linkstart =
'<a href="';
4363 if (!preg_match(
'/^http/i', $url)) {
4364 $linkstart .=
'http://';
4369 $linkstart .=
' target="' . $target .
'"';
4371 $linkstart .=
' title="' . $langs->trans(
"URL") .
': ' . $url .
'"';
4375 if (!preg_match(
'/^http/i', $url)) {
4382 if ($morecss ==
'float') {
4383 return '<div class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'') . $link .
'</div>';
4385 return $linkstart .
'<span class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'') . $link .
'</span>' . $linkend;
4402function dol_print_email($email, $contactid = 0, $socid = 0, $addlink = 0, $max = 0, $showinvalid = 2, $withpicto = 0, $morecss =
'paddingrightonly')
4404 global $user, $langs, $hookmanager;
4415 if (empty($email)) {
4419 if ($addlink == 1) {
4420 $newemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="';
4421 if (!preg_match(
'/^mailto:/i', $email)) {
4422 $newemail .=
'mailto:';
4424 $newemail .= $email;
4425 $newemail .=
'" target="_blank">';
4427 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4432 $newemail .= $email;
4434 $newemail .=
'</a>';
4437 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4438 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4441 $langs->load(
"errors");
4442 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $emailonly),
'',
'paddingrightonly');
4444 $langs->load(
"errors");
4445 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly),
'',
'paddingrightonly');
4449 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4451 $linktoaddaction =
'';
4453 $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>';
4455 if ($linktoaddaction) {
4456 $newemail =
'<div>' . $newemail .
' ' . $linktoaddaction .
'</div>';
4459 } elseif ($addlink ===
'thirdparty') {
4460 $tmpnewemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="' . DOL_URL_ROOT .
'/societe/card.php?socid=' . $socid .
'&action=presend&mode=init#formmailbeforetitle">';
4461 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4462 if ($withpicto == 1) {
4463 $tmpnewemail .= $newemail;
4465 $tmpnewemail .=
'</a>';
4467 $newemail = $tmpnewemail;
4469 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'') . $newemail;
4472 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4473 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4476 $langs->load(
"errors");
4477 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $email));
4479 $langs->load(
"errors");
4480 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly));
4491 $parameters = array(
'cid' => $contactid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
4493 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
4497 $rep .= $hookmanager->resPrint;
4512 $socialnetworks = array();
4514 require_once DOL_DOCUMENT_ROOT .
'/core/lib/memory.lib.php';
4518 if (!is_null($dataretrieved)) {
4519 $socialnetworks = $dataretrieved;
4521 $sql =
"SELECT rowid, code, label, url, icon, active FROM " . MAIN_DB_PREFIX .
"c_socialnetworks";
4522 $sql .=
" WHERE entity IN (" .
getEntity(
'c_socialnetworks').
")";
4524 $resql = $db->query($sql);
4526 while ($obj = $db->fetch_object($resql)) {
4527 $socialnetworks[$obj->code] = array(
4528 'rowid' => $obj->rowid,
4529 'label' => $obj->label,
4531 'icon' => $obj->icon,
4532 'active' => $obj->active,
4539 return (is_array($socialnetworks) ? $socialnetworks : array());
4554 global $hookmanager, $langs, $user;
4558 if (empty($value)) {
4562 if (!empty($type)) {
4563 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4565 $htmllink .=
'<span class="fab pictofixedwidth ' . ($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link') .
'"></span>';
4566 if ($type ==
'skype') {
4568 $htmllink .=
' <a href="skype:';
4570 $htmllink .=
'?call" alt="' . $langs->trans(
"Call") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Call") .
' ' . $value) .
'">';
4571 $htmllink .=
'<img src="' . DOL_URL_ROOT .
'/theme/common/skype_callbutton.png" border="0">';
4572 $htmllink .=
'</a><a href="skype:';
4574 $htmllink .=
'?chat" alt="' . $langs->trans(
"Chat") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Chat") .
' ' . $value) .
'">';
4575 $htmllink .=
'<img class="paddingleft" src="' . DOL_URL_ROOT .
'/theme/common/skype_chatbutton.png" border="0">';
4576 $htmllink .=
'</a>';
4577 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4578 $addlink =
'AC_SKYPE';
4581 $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>';
4583 $htmllink .= ($link ?
' ' . $link :
'');
4586 if (!empty($dictsocialnetworks[$type][
'url'])) {
4587 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4588 if ($tmpvirginurl) {
4589 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4590 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4592 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4593 if ($tmpvirginurl3) {
4594 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4595 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4598 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4599 if ($tmpvirginurl2) {
4600 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4601 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4604 if (preg_match(
'/^https?:\/\//i', $value)) {
4607 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4609 $valuetoshow = $value;
4610 $valuetoshow = preg_replace(
'/https:\/\/www\.(twitter|x|linkedin)\.com\/?/',
'', $valuetoshow);
4611 if (preg_match(
'/^https?:\/\//i', $link)) {
4620 $htmllink .=
'</div>';
4622 $langs->load(
"errors");
4623 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4627 $parameters = array(
4629 'cid' => $contactid,
4632 'dictsocialnetworks' => $dictsocialnetworks,
4635 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4639 $htmllink .= $hookmanager->resPrint;
4654function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4658 if (empty($profID) || empty($profIDtype)) {
4661 if (empty($countrycode)) {
4662 $countrycode =
$mysoc->country_code;
4664 $newProfID = $profID;
4665 $id = substr($profIDtype, -1);
4667 if (strtoupper($countrycode) ==
'FR') {
4673 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3);
4677 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3) .
' ' . substr($newProfID, 9, 5);
4681 $newProfID = substr($newProfID, 0, 2) .
'.' . substr($newProfID, 2, 3);
4683 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4685 $newProfID = substr($newProfID, 0, 4) .
' ' . substr($newProfID, 4, 3) .
' ' . substr($newProfID, 7, 3) .
' ' . substr($newProfID, 10, 3);
4688 if (!empty($addcpButton)) {
4711function dol_print_phone($phone, $countrycode =
'', $contactid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4713 global $conf, $user, $langs,
$mysoc, $hookmanager;
4716 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4717 if (empty($phone)) {
4723 if (empty($countrycode) && is_object(
$mysoc)) {
4724 $countrycode =
$mysoc->country_code;
4728 if (!empty($conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4733 $newphonewa = $phone;
4734 if (strtoupper($countrycode) ==
"FR") {
4737 $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);
4739 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 2);
4741 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 2) . $separ . substr($newphone, 7, 2);
4743 $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);
4745 $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);
4747 $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);
4749 } elseif (strtoupper($countrycode) ==
"CA") {
4751 $newphone = ($separ !=
'' ?
'(' :
'') . substr($newphone, 0, 3) . ($separ !=
'' ?
')' :
'') . $separ . substr($newphone, 3, 3) . ($separ !=
'' ?
'-' :
'') . substr($newphone, 6, 4);
4753 } elseif (strtoupper($countrycode) ==
"PT") {
4755 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4757 } elseif (strtoupper($countrycode) ==
"SR") {
4759 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3);
4761 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
4763 } elseif (strtoupper($countrycode) ==
"DE") {
4765 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 4) . $separ . substr($newphone, 11, 3);
4767 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 4) . $separ . substr($newphone, 10, 3);
4769 } elseif (strtoupper($countrycode) ==
"ES") {
4771 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4773 } elseif (strtoupper($countrycode) ==
"BF") {
4775 $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);
4777 } elseif (strtoupper($countrycode) ==
"RO") {
4779 $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);
4781 } elseif (strtoupper($countrycode) ==
"TR") {
4783 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4785 } elseif (strtoupper($countrycode) ==
"US") {
4787 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4789 } elseif (strtoupper($countrycode) ==
"MX") {
4791 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4793 $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);
4795 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4797 } elseif (strtoupper($countrycode) ==
"ML") {
4799 $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);
4801 } elseif (strtoupper($countrycode) ==
"TH") {
4803 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4805 $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);
4807 } elseif (strtoupper($countrycode) ==
"MU") {
4810 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2);
4812 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
4814 } elseif (strtoupper($countrycode) ==
"ZA") {
4816 $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);
4818 } elseif (strtoupper($countrycode) ==
"SY") {
4820 $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);
4822 $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);
4824 } elseif (strtoupper($countrycode) ==
"AE") {
4826 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4828 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4830 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 4);
4832 } elseif (strtoupper($countrycode) ==
"DZ") {
4834 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4836 } elseif (strtoupper($countrycode) ==
"BE") {
4838 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4840 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4842 } elseif (strtoupper($countrycode) ==
"PF") {
4844 $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);
4846 } elseif (strtoupper($countrycode) ==
"CO") {
4848 $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);
4850 } elseif (strtoupper($countrycode) ==
"JO") {
4852 $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);
4854 } elseif (strtoupper($countrycode) ==
"JM") {
4856 $newphone = substr($newphone, 0, 5) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4858 } elseif (strtoupper($countrycode) ==
"MG") {
4860 $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);
4862 } elseif (strtoupper($countrycode) ==
"GB") {
4864 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4866 } elseif (strtoupper($countrycode) ==
"CH") {
4868 $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);
4870 $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);
4872 } elseif (strtoupper($countrycode) ==
"TN") {
4874 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4876 } elseif (strtoupper($countrycode) ==
"GF") {
4878 $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);
4880 } elseif (strtoupper($countrycode) ==
"GP") {
4882 $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);
4884 } elseif (strtoupper($countrycode) ==
"MQ") {
4886 $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);
4888 } elseif (strtoupper($countrycode) ==
"IT") {
4890 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4892 $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);
4894 } elseif (strtoupper($countrycode) ==
"AU") {
4898 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 1) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 4);
4900 } elseif (strtoupper($countrycode) ==
"LU") {
4903 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2);
4905 $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);
4907 $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);
4909 $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);
4911 } elseif (strtoupper($countrycode) ==
"PE") {
4914 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4);
4916 $newphonewa =
'+51' . $newphone;
4917 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 10, 3);
4919 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 8, 4);
4921 $newphonewa = $newphone;
4922 $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);
4924 } elseif (strtoupper($countrycode) ==
"IN") {
4926 if ($withpicto ==
'phone') {
4927 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 4) . $separ . substr($newphone, 9, 4);
4929 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 5) . $separ . substr($newphone, 8, 5);
4934 $newphoneastart = $newphoneaend =
'';
4935 if (!empty($addlink)) {
4936 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (
isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4937 $newphoneastart =
'<a href="tel:' . urlencode($phone) .
'">';
4938 $newphoneaend .=
'</a>';
4939 } elseif (
isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4940 if (empty($user->clicktodial_loaded)) {
4941 $user->fetch_clicktodial();
4945 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4946 if (!empty($user->clicktodial_url)) {
4947 $urlmask = $user->clicktodial_url;
4950 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4951 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4952 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4954 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4956 $substitarray = array(
4957 '__PHONEFROM__' => $clicktodial_poste,
4958 '__PHONETO__' => urlencode($phone),
4959 '__LOGIN__' => $clicktodial_login,
4960 '__PASS__' => $clicktodial_password
4965 $newphoneastart =
'<a href="' . $url .
'" class="cssforclicktodial">';
4966 $newphoneaend =
'</a>';
4969 $newphoneastart =
'<a href="' . $url .
'"';
4971 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4973 $newphoneastart .=
'>';
4974 $newphoneaend .=
'</a>';
4979 if (
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4981 $addlinktoagenda =
'';
4982 if ($addlink ==
'AC_FAX') {
4986 $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>';
4988 if ($addlinktoagenda) {
4989 $newphone =
'<span>' . $newphone .
' ' . $addlinktoagenda .
'</span>';
4994 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4996 $newphone .=
' <a href="https://wa.me/' . $newphonewa .
'" target="_blank"';
4997 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
5000 if (empty($titlealt)) {
5001 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
5006 $parameters = array(
'countrycode' => $countrycode,
'cid' => $contactid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
5007 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
5008 $rep .= $hookmanager->resPrint;
5010 if (empty($reshook)) {
5013 if ($withpicto ==
'fax') {
5014 $picto =
'phoning_fax';
5015 } elseif ($withpicto ==
'phone') {
5017 } elseif ($withpicto ==
'mobile') {
5018 $picto =
'phoning_mobile';
5023 if ($adddivfloat == 1) {
5024 $rep .=
'<div class="nospan float' . ($morecss ?
' ' . $morecss :
'') .
'">';
5025 } elseif (empty($adddivfloat)) {
5026 $rep .=
'<span' . ($morecss ?
' class="' . $morecss .
'"' :
'') .
'>';
5029 $rep .= $newphoneastart;
5030 $rep .= ($withpicto ?
img_picto($titlealt, $picto) :
'');
5031 if ($separ !=
'hidenum') {
5032 $rep .= ($withpicto ?
' ' :
'') . $newphone;
5034 $rep .= $newphoneaend;
5036 if ($adddivfloat == 1) {
5038 } elseif (empty($adddivfloat)) {
5059 if (!isset($conf->cache[
'resolveips'])) {
5060 $conf->cache[
'resolveips'] = array();
5066 if (file_exists(DOL_DOCUMENT_ROOT .
'/theme/common/flags/' . $countrycode .
'.png')) {
5069 $ret .=
'(' . $countrycode .
')';
5077 if (in_array($mode, [0, 2])) {
5080 if (!array_key_exists($ip, $conf->cache[
'resolveips'])) {
5081 $domain = gethostbyaddr($ip);
5082 $conf->cache[
'resolveips'][$ip] = $domain;
5084 $domain = $conf->cache[
'resolveips'][$ip];
5112 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5119 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
5120 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
5121 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
5122 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5124 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
5127 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_CLIENT_IP']);
5130 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
5146 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
5148 } elseif (!empty($_SERVER[
'HTTP_X_FORWARDED_PROTO']) && $_SERVER[
'HTTP_X_FORWARDED_PROTO'] ==
'https' || !empty($_SERVER[
'HTTP_X_FORWARDED_SSL']) && $_SERVER[
'HTTP_X_FORWARDED_SSL'] ==
'on') {
5169 $datafile = $diroffile .
'/' .
getDolGlobalString(
'GEOIPMAXMIND_COUNTRY_DATAFILE_EMBEDDED');
5175 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5176 $geoip =
new DolGeoIP(
'country', $datafile);
5178 $countrycode = $geoip->getCountryCodeFromIP($ip);
5185 return $countrycode;
5197 global $conf, $langs, $user;
5206 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5207 $geoip =
new DolGeoIP(
'country', $datafile);
5208 $countrycode = $geoip->getCountryCodeFromIP($ip);
5209 $ret = $countrycode;
5228 global $hookmanager;
5234 $parameters = array(
'element' => $element,
'id' =>
$id);
5235 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
5236 $out .= $hookmanager->resPrint;
5238 if (empty($reshook)) {
5239 if (empty($charfornl)) {
5240 $out .= nl2br((
string) $address);
5242 $out .= preg_replace(
'/[\r\n]+/', $charfornl, (
string) $address);
5246 $showgmap = $showomap = 0;
5272 $url =
dol_buildpath(
'/google/gmaps.php?mode=' . $element .
'&id=' .
$id, 1);
5273 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5276 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode=' . $element .
'&id=' .
$id, 1);
5277 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'_openstreetmap" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5299function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
5301 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
5304 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
5307 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
5325 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
5326 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
5329 if (function_exists(
'getmxrr')) {
5332 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
5333 if (count($mxhosts) > 1) {
5336 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
5373 $tmparray = explode(
' ', $s);
5374 foreach ($tmparray as $tmps) {
5389function dol_strlen($string, $stringencoding =
'UTF-8')
5391 if (is_null($string)) {
5395 if (function_exists(
'mb_strlen')) {
5396 return mb_strlen($string, $stringencoding);
5398 return strlen($string);
5412function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
5416 if (empty($stringencoding)) {
5417 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
5421 if (empty($trunconbytes)) {
5422 if (function_exists(
'mb_substr')) {
5423 $ret = mb_substr($string, $start, $length, $stringencoding);
5425 $ret = substr($string, $start, $length);
5428 if (function_exists(
'mb_strcut')) {
5429 $ret = mb_strcut($string, $start, $length, $stringencoding);
5431 $ret = substr($string, $start, $length);
5451function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
5459 if (empty($stringencoding)) {
5460 $stringencoding =
'UTF-8';
5463 if (!empty($conf->dol_optimize_smallscreen) && $conf->dol_optimize_smallscreen == 1 && $display == 1) {
5464 $size = round($size / 3);
5468 if ($trunc ==
'right') {
5470 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5472 return dol_substr($newstring, 0, $size, $stringencoding) . ($nodot ?
'' :
'…');
5477 } elseif ($trunc ==
'middle') {
5479 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5480 $size1 = (int) round($size / 2);
5481 $size2 = (int) round($size / 2);
5482 return dol_substr($newstring, 0, $size1, $stringencoding) .
'…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
5486 } elseif ($trunc ==
'left') {
5488 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5490 return '…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
5494 } elseif ($trunc ==
'wrap') {
5496 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5502 return 'BadParam3CallingDolTrunc';
5516 $type2picto = array(
5517 'varchar' =>
'font',
5520 'int' =>
'sort-numeric-down',
5521 'double' =>
'sort-numeric-down',
5522 'price' =>
'currency',
5523 'pricecy' =>
'multicurrency',
5524 'password' =>
'key',
5525 'boolean' =>
'check-square',
5526 'date' =>
'calendar',
5527 'datetime' =>
'calendar',
5528 'duration' =>
'hourglass',
5534 'sellist' =>
'list',
5535 'stars' =>
'fontawesome_star_fas',
5536 'radio' =>
'check-circle',
5537 'checkbox' =>
'list',
5538 'chkbxlst' =>
'list',
5540 'icon' =>
"question",
5541 'point' =>
"country",
5542 'multipts' =>
'country',
5543 'linestrg' =>
"country",
5544 'polygon' =>
"country",
5545 'separate' =>
'minus'
5548 if (!empty($type2picto[$key])) {
5549 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5552 return img_picto(
'',
'generic',
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5579function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2, $allowothertags = array())
5584 $url = DOL_URL_ROOT;
5585 $theme = isset($conf->theme) ? $conf->theme :
null;
5586 $path =
'theme/' . $theme;
5587 if (empty($picto)) {
5592 if ($pictoisfullpath) {
5594 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5597 $fullpathpicto = $picto;
5599 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5600 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5601 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5606 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5607 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5608 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5611 $pictoconvertkey = array(
5612 'facture' =>
'bill',
5613 'shipping' =>
'shipment',
5614 'fichinter' =>
'intervention',
5615 'agenda' =>
'calendar',
5616 'invoice_supplier' =>
'supplier_invoice',
5617 'order_supplier' =>
'supplier_order');
5618 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5619 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5622 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5624 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5625 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5628 if ($pictowithouttext ==
'file-o') {
5629 $pictowithouttext =
'file';
5632 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5633 $marginleftonlyshort = 0;
5635 if (!empty($pictowithouttextarray[1])) {
5637 $fakey =
'fa-' . $pictowithouttextarray[0];
5638 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5639 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5640 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5642 $fakey =
'fa-' . $pictowithouttext;
5652 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5653 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5654 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5656 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5657 $morestyle = $reg[1];
5658 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5660 $moreatt = trim($moreatt);
5662 $enabledisablehtml =
'<span class="' . $faprefix .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5663 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5664 $enabledisablehtml .=
'</span>';
5666 return $enabledisablehtml;
5669 if (empty($srconly) && !preg_match(
'/[\.\/@]/', $picto)) {
5670 $fakey = $pictowithouttext;
5674 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'))) {
5677 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'))) {
5683 if ($pictowithouttext ==
'off') {
5684 $fakey =
'fa-square';
5686 } elseif ($pictowithouttext ==
'on') {
5687 $fakey =
'fa-check-square';
5689 } elseif ($pictowithouttext ==
'listlight') {
5690 $fakey =
'fa-download';
5691 $marginleftonlyshort = 1;
5692 } elseif ($pictowithouttext ==
'printer') {
5693 $fakey =
'fa-print';
5695 } elseif ($pictowithouttext ==
'note') {
5696 $fakey =
'fa-sticky-note';
5697 $marginleftonlyshort = 1;
5698 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5699 $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');
5700 $fakey =
'fa-' . $convertarray[$pictowithouttext];
5701 if (preg_match(
'/selected/', $pictowithouttext)) {
5704 $marginleftonlyshort = 1;
5705 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5706 $fakey =
'fa-' . $arrayconvpictotofa[$pictowithouttext];
5708 $fakey =
'fa-' . $pictowithouttext;
5711 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5712 $morecss .=
' em092';
5714 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'eventorganization',
'holiday',
'info',
'info_black',
'project',
'workstation'))) {
5715 $morecss .=
' em088';
5717 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5718 $morecss .=
' em080';
5722 $arrayconvpictotomarginleftonly = array(
5752 '1uparrow_selected',
5753 '1downarrow_selected',
5754 '1leftarrow_selected',
5755 '1rightarrow_selected'
5757 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5758 $marginleftonlyshort = 0;
5762 $arrayconvpictotomorcess = array(
5763 'action' =>
'infobox-action',
5764 'account' =>
'infobox-bank_account',
5765 'accounting_account' =>
'infobox-bank_account',
5766 'accountline' =>
'infobox-bank_account',
5767 'accountancy' =>
'infobox-bank_account',
5768 'admin' =>
'opacitymedium',
5769 'asset' =>
'infobox-bank_account',
5770 'bank_account' =>
'infobox-bank_account',
5771 'bill' =>
'infobox-commande',
5772 'billa' =>
'infobox-commande',
5773 'billr' =>
'infobox-commande',
5774 'billd' =>
'infobox-commande',
5775 'bookcal' =>
'infobox-portal',
5776 'margin' =>
'infobox-bank_account',
5777 'conferenceorbooth' =>
'infobox-project',
5778 'cash-register' =>
'infobox-portal',
5779 'contract' =>
'infobox-contrat',
5780 'check' =>
'font-status4',
5781 'conversation' =>
'infobox-contrat',
5782 'donation' =>
'infobox-commande',
5783 'dolly' =>
'infobox-commande',
5784 'dollyrevert' =>
'flip infobox-order_supplier',
5785 'ecm' =>
'infobox-action',
5786 'eventorganization' =>
'infobox-project',
5787 'hrm' =>
'infobox-adherent',
5788 'group' =>
'infobox-adherent',
5789 'intervention' =>
'infobox-contrat',
5790 'incoterm' =>
'infobox-supplier_proposal',
5791 'intracommreport' =>
'infobox-bank_account',
5792 'currency' =>
'infobox-bank_account',
5793 'multicurrency' =>
'infobox-bank_account',
5794 'members' =>
'infobox-adherent',
5795 'member' =>
'infobox-adherent',
5796 'money-bill-alt' =>
'infobox-bank_account',
5797 'order' =>
'infobox-commande',
5798 'user' =>
'infobox-adherent',
5799 'users' =>
'infobox-adherent',
5800 'error' =>
'pictoerror',
5801 'warning' =>
'pictowarning',
5802 'switch_on' =>
'font-status4',
5803 'switch_on_warning' =>
'font-status4 warning',
5804 'switch_on_red' =>
'font-status8',
5805 'switch_off_warning' =>
'font-status4 warning',
5806 'switch_off_red' =>
'font-status8',
5807 'holiday' =>
'infobox-holiday',
5808 'info' =>
'opacityhigh',
5809 'info_black' =>
'purple',
5810 'invoice' =>
'infobox-commande',
5811 'knowledgemanagement' =>
'infobox-contrat rotate90',
5812 'loan' =>
'infobox-commande',
5813 'payment' =>
'infobox-bank_account',
5814 'payment_vat' =>
'infobox-bank_account',
5815 'poll' =>
'infobox-portal',
5816 'pos' =>
'infobox-bank_account',
5817 'project' =>
'infobox-project',
5818 'projecttask' =>
'infobox-project',
5819 'propal' =>
'infobox-propal',
5820 'proposal' =>
'infobox-propal',
5821 'private' =>
'infobox-project',
5822 'reception' =>
'flip infobox-order_supplier',
5823 'recruitmentjobposition' =>
'infobox-adherent',
5824 'recruitmentcandidature' =>
'infobox-adherent',
5825 'resource' =>
'infobox-action',
5826 'salary' =>
'infobox-commande',
5827 'shapes' =>
'infobox-adherent',
5828 'shipment' =>
'infobox-commande',
5829 'store' =>
'infobox-portal',
5830 'stripe' =>
'infobox-bank_account',
5831 'supplier_invoice' =>
'infobox-order_supplier',
5832 'supplier_invoicea' =>
'infobox-order_supplier',
5833 'supplier_invoiced' =>
'infobox-order_supplier',
5834 'supplier' =>
'infobox-order_supplier',
5835 'supplier_order' =>
'infobox-order_supplier',
5836 'supplier_proposal' =>
'infobox-supplier_proposal',
5837 'ticket' =>
'infobox-contrat',
5838 'title_accountancy' =>
'infobox-bank_account',
5839 'title_hrm' =>
'infobox-holiday',
5840 'expensereport' =>
'infobox-expensereport',
5841 'trip' =>
'infobox-expensereport',
5842 'title_agenda' =>
'infobox-action',
5843 'vat' =>
'infobox-bank_account',
5844 'webportal' =>
'infobox-portal',
5846 'list-alt' =>
'imgforviewmode',
5847 'calendar' =>
'imgforviewmode',
5848 'calendarweek' =>
'imgforviewmode',
5849 'calendarmonth' =>
'imgforviewmode',
5850 'calendarday' =>
'imgforviewmode',
5851 'calendarperuser' =>
'imgforviewmode',
5852 'calendarpertype' =>
'imgforviewmode'
5854 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5855 $morecss .= ($morecss ?
' ' :
'') . $arrayconvpictotomorcess[$pictowithouttext];
5859 $arrayconvpictotocolor = array(
5860 'address' =>
'#6c6aa8',
5861 'building' =>
'#6c6aa8',
5865 'companies' =>
'#6c6aa8',
5866 'company' =>
'#6c6aa8',
5867 'contact' =>
'#6c6aa8',
5869 'dynamicprice' =>
'#a69944',
5874 'listlight' =>
'#999',
5875 'language' =>
'#555',
5879 'map-marker-alt' =>
'#aaa',
5881 'product' =>
'#a69944',
5882 'service' =>
'#a69944',
5883 'inventory' =>
'#a69944',
5884 'stock' =>
'#a69944',
5885 'movement' =>
'#a69944',
5887 'world' =>
'#986c6a',
5888 'partnership' =>
'#6c6aa8',
5889 'playdisabled' =>
'#ccc',
5890 'printer' =>
'#444',
5891 'projectpub' =>
'#986c6a',
5895 'search-plus' =>
'#808080',
5896 'security' =>
'#999',
5898 'stop-circle' =>
'#888',
5900 'superadmin' =>
'#600',
5901 'switch_off' =>
'#999',
5902 'technic' =>
'#999',
5904 'timespent' =>
'#555',
5905 'uncheck' =>
'#800',
5906 'uparrow' =>
'#555',
5907 'user-cog' =>
'#999',
5908 'country' =>
'#aaa',
5909 'globe-americas' =>
'#aaa',
5912 'website' =>
'#304',
5913 'workstation' =>
'#a69944'
5915 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5916 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5923 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5924 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5925 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5927 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5928 $morestyle = $reg[1];
5929 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5931 $moreatt = trim($moreatt);
5933 $enabledisablehtml =
'<span class="' . $fa .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5934 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5935 $enabledisablehtml .=
'</span>';
5937 return $enabledisablehtml;
5944 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
5945 $path = $theme .
'/theme/' . $theme;
5950 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5956 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5961 foreach ($conf->file->dol_document_root as $type => $dirroot) {
5962 if ($type ==
'main') {
5966 if (file_exists($dirroot .
'/' . $path .
'/img/' . $picto) && !empty($conf->file->dol_url_root)) {
5967 $url = DOL_URL_ROOT . $conf->file->dol_url_root[$type];
5973 $fullpathpicto = $url .
'/' . $path .
'/img/' . $picto;
5977 return $fullpathpicto;
5981 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 :
'') .
'"') .
'>';
5995 if (empty($mode) || $mode ==
'fa') {
5997 $arrayconvpictotofa = array(
5998 'account' =>
'university',
5999 'accounting_account' =>
'clipboard-list',
6000 'accountline' =>
'receipt',
6001 'accountancy' =>
'search-dollar',
6002 'action' =>
'calendar-alt',
6003 'add' =>
'plus-circle',
6004 'address' =>
'address-book',
6007 'asset' =>
'money-check-alt',
6008 'autofill' =>
'fill',
6009 'back' =>
'arrow-left',
6010 'bank_account' =>
'university',
6011 'bill' =>
'file-invoice-dollar',
6012 'billa' =>
'file-excel',
6013 'billr' =>
'file-invoice-dollar',
6014 'billd' =>
'file-medical',
6015 'blockedlog' =>
'file-archive',
6016 'bookcal' =>
'calendar-check',
6017 'supplier_invoice' =>
'file-invoice-dollar',
6018 'supplier_invoicea' =>
'file-excel',
6019 'supplier_invoicer' =>
'file-invoice-dollar',
6020 'supplier_invoiced' =>
'file-medical',
6022 'card' =>
'address-card',
6023 'chart' =>
'chart-line',
6024 'company' =>
'building',
6025 'contact' =>
'address-book',
6026 'contract' =>
'suitcase',
6027 'collab' =>
'people-arrows',
6028 'conversation' =>
'comments',
6029 'country' =>
'globe-americas',
6030 'cron' =>
'business-time',
6032 'chevron-double-left' =>
'angle-double-left',
6033 'chevron-double-right' =>
'angle-double-right',
6034 'chevron-double-down' =>
'angle-double-down',
6035 'chevron-double-top' =>
'angle-double-up',
6036 'donation' =>
'gift',
6037 'dynamicprice' =>
'hand-holding-usd',
6039 'companies' =>
'building',
6040 'products' =>
'cube',
6041 'commercial' =>
'suitcase',
6042 'invoicing' =>
'coins',
6043 'accounting' =>
'search-dollar',
6044 'category' =>
'tag',
6045 'dollyrevert' =>
'dolly',
6047 'generate' =>
'plus-square',
6048 'hrm' =>
'user-tie',
6049 'incoterm' =>
'truck-loading',
6050 'margin' =>
'calculator',
6051 'members' =>
'user-friends',
6052 'ticket' =>
'ticket-alt',
6053 'globe' =>
'external-link-alt',
6056 'establishment' =>
'building',
6057 'edit' =>
'pencil-alt',
6058 'entity' =>
'globe',
6059 'graph' =>
'chart-line',
6060 'grip_title' =>
'arrows-alt',
6061 'grip' =>
'arrows-alt',
6062 'help' =>
'question-circle',
6063 'generic' =>
'file',
6064 'holiday' =>
'umbrella-beach',
6065 'info' =>
'info-circle',
6066 'info_black' =>
'info-circle',
6067 'inventory' =>
'boxes',
6068 'intracommreport' =>
'globe-europe',
6069 'jobprofile' =>
'cogs',
6070 'knowledgemanagement' =>
'ticket-alt',
6071 'label' =>
'layer-group',
6072 'layout' =>
'columns',
6074 'loan' =>
'money-bill-alt',
6075 'member' =>
'user-alt',
6076 'meeting' =>
'chalkboard-teacher',
6078 'next' =>
'arrow-alt-circle-right',
6080 'expensereport' =>
'wallet',
6082 'movement' =>
'people-carry',
6083 'sign-out' =>
'sign-out-alt',
6084 'superadmin' =>
'star',
6085 'switch_off' =>
'toggle-off',
6086 'switch_off_grey' =>
'toggle-off',
6087 'switch_off_warning' =>
'toggle-off',
6088 'switch_off_red' =>
'toggle-off',
6089 'switch_on' =>
'toggle-on',
6090 'switch_on_grey' =>
'toggle-on',
6091 'switch_on_warning' =>
'toggle-on',
6092 'switch_on_red' =>
'toggle-on',
6094 'bookmark' =>
'star',
6095 'bank' =>
'university',
6096 'close_title' =>
'times',
6097 'delete' =>
'trash',
6098 'filter' =>
'filter',
6099 'list-alt' =>
'list-alt',
6100 'calendarlist' =>
'bars',
6101 'calendar' =>
'calendar-alt',
6102 'calendarmonth' =>
'calendar-alt',
6103 'calendarweek' =>
'calendar-week',
6104 'calendarday' =>
'calendar-day',
6105 'calendarperuser' =>
'table',
6106 'calendarpertype' =>
'table',
6107 'intervention' =>
'ambulance',
6108 'invoice' =>
'file-invoice-dollar',
6109 'order' =>
'file-invoice',
6110 'error' =>
'exclamation-triangle',
6111 'warning' =>
'exclamation-triangle',
6112 'other' =>
'square',
6113 'playdisabled' =>
'play',
6114 'pdf' =>
'file-pdf',
6115 'poll' =>
'check-double',
6116 'pos' =>
'cash-register',
6117 'preview' =>
'binoculars',
6118 'project' =>
'project-diagram',
6119 'projectpub' =>
'project-diagram',
6120 'projecttask' =>
'tasks',
6121 'propal' =>
'file-signature',
6122 'proposal' =>
'file-signature',
6123 'partnership' =>
'handshake',
6124 'payment' =>
'money-check-alt',
6125 'payment_vat' =>
'money-check-alt',
6126 'pictoconfirm' =>
'check-square',
6127 'phoning' =>
'phone',
6128 'phoning_mobile' =>
'mobile-alt',
6129 'phoning_fax' =>
'fax',
6130 'previous' =>
'arrow-alt-circle-left',
6131 'printer' =>
'print',
6132 'product' =>
'cube',
6133 'puce' =>
'angle-right',
6134 'recent' =>
'check-square',
6135 'reception' =>
'dolly',
6136 'recruitmentjobposition' =>
'id-card-alt',
6137 'recruitmentcandidature' =>
'id-badge',
6139 'supplier_order' =>
'dol-order_supplier',
6140 'supplier_proposal' =>
'file-signature',
6141 'refresh' =>
'redo',
6142 'region' =>
'map-marked',
6143 'replacement' =>
'exchange-alt',
6144 'resource' =>
'laptop-house',
6145 'recurring' =>
'history',
6146 'service' =>
'concierge-bell',
6147 'skill' =>
'shapes',
6148 'state' =>
'map-marked-alt',
6149 'security' =>
'key',
6150 'salary' =>
'wallet',
6151 'shipment' =>
'dolly',
6152 'stock' =>
'box-open',
6153 'stats' =>
'chart-bar',
6154 'split' =>
'code-branch',
6155 'status' =>
'stop-circle',
6156 'stripe' =>
'stripe-s',
6157 'supplier' =>
'building',
6158 'technic' =>
'cogs',
6160 'timespent' =>
'clock',
6161 'title_setup' =>
'tools',
6162 'title_accountancy' =>
'money-check-alt',
6163 'title_bank' =>
'university',
6164 'title_hrm' =>
'umbrella-beach',
6165 'title_agenda' =>
'calendar-alt',
6166 'uncheck' =>
'times',
6167 'uparrow' =>
'share',
6168 'url' =>
'external-link-alt',
6169 'vat' =>
'money-check-alt',
6170 'vcard' =>
'arrow-alt-circle-down',
6171 'jabber' =>
'comment',
6172 'website' =>
'globe-americas',
6173 'workstation' =>
'pallet',
6174 'webhook' =>
'bullseye',
6176 'private' =>
'user-lock',
6177 'conferenceorbooth' =>
'chalkboard-teacher',
6178 'eventorganization' =>
'project-diagram',
6179 'webportal' =>
'door-open'
6182 if ($conf->currency ==
'EUR') {
6183 $arrayconvpictotofa[
'currency'] =
'euro-sign';
6184 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
6186 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
6187 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
6190 $arrayconvpictotofa = array();
6193 return $arrayconvpictotofa;
6211function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $allowothertags = array())
6213 if (strpos($picto,
'^') === 0) {
6214 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6216 return img_picto($titlealt,
'object_' . $picto, $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6231function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
6235 if (is_numeric($picto)) {
6238 return '<i class="fa fa-weather-level' . $picto .
'"></i>';
6239 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6243 $path = DOL_URL_ROOT .
'/theme/' . $conf->theme .
'/img/weather/' . $picto;
6245 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
6259function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
6263 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6267 if ($pictoisfullpath) {
6270 $path = DOL_URL_ROOT .
'/theme/common/' . $picto;
6273 $themepath = DOL_DOCUMENT_ROOT .
'/theme/' . $conf->theme .
'/img/' . $picto;
6275 if (file_exists($themepath)) {
6281 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
6297function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
6301 if (empty($titlealt) || $titlealt ==
'default') {
6302 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
6304 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
6305 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
6307 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
6308 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
6310 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
6311 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
6313 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
6314 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
6316 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
6318 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus ' . $numaction);
6322 if (!is_numeric($numaction)) {
6326 return img_picto($titlealt, (empty($picto) ?
'stcomm' . $numaction .
'.png' : $picto), $moreatt);
6336function img_edit_add($titlealt =
'default', $other =
'')
6340 if ($titlealt ==
'default') {
6341 $titlealt = $langs->trans(
'Add');
6344 return img_picto($titlealt,
'edit_add.png', $other);
6357 if ($titlealt ==
'default') {
6358 $titlealt = $langs->trans(
'Remove');
6361 return img_picto($titlealt,
'edit_remove.png', $other);
6372function img_edit($titlealt =
'default', $float = 0, $other =
'')
6376 if ($titlealt ==
'default') {
6377 $titlealt = $langs->trans(
'Modify');
6380 return img_picto($titlealt,
'edit', ($float ?
'style="float: ' . ($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right') .
'"' :
"") . ($other ?
' ' . $other :
''));
6391function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
6395 if ($titlealt ==
'default') {
6396 $titlealt = $langs->trans(
'View');
6399 $moreatt = ($float ?
'style="float: right" ' :
'') . $other;
6401 return img_picto($titlealt,
'eye', $moreatt);
6412function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
6416 if ($titlealt ==
'default') {
6417 $titlealt = $langs->trans(
'Delete');
6420 return img_picto($titlealt,
'delete', $other, 0, 0, 0,
'', $morecss);
6430function img_printer($titlealt =
"default", $other =
'')
6433 if ($titlealt ==
"default") {
6434 $titlealt = $langs->trans(
"Print");
6436 return img_picto($titlealt,
'printer', $other);
6446function img_split($titlealt =
'default', $other =
'class="pictosplit"')
6450 if ($titlealt ==
'default') {
6451 $titlealt = $langs->trans(
'Split');
6454 return img_picto($titlealt,
'split', $other);
6464function img_help($usehelpcursor = 1, $usealttitle = 1)
6469 if (is_string($usealttitle)) {
6472 $usealttitle = $langs->trans(
'Info');
6476 return img_picto($usealttitle,
'info',
'style="vertical-align: middle;' . ($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')) .
'"');
6485function img_info($titlealt =
'default')
6489 if ($titlealt ==
'default') {
6490 $titlealt = $langs->trans(
'Informations');
6493 return img_picto($titlealt,
'info',
'style="vertical-align: middle;"');
6504function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
6508 if ($titlealt ==
'default') {
6509 $titlealt = $langs->trans(
'Warning');
6513 return img_picto($titlealt,
'warning',
'class="' . $morecss .
'"' . ($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' ' . $moreatt) :
''));
6522function img_error($titlealt =
'default')
6526 if ($titlealt ==
'default') {
6527 $titlealt = $langs->trans(
'Error');
6540function img_next($titlealt =
'default', $moreatt =
'')
6544 if ($titlealt ==
'default') {
6545 $titlealt = $langs->trans(
'Next');
6549 return '<span class="fa fa-chevron-right paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6559function img_previous($titlealt =
'default', $moreatt =
'')
6563 if ($titlealt ==
'default') {
6564 $titlealt = $langs->trans(
'Previous');
6568 return '<span class="fa fa-chevron-left paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6579function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
6583 if ($titlealt ==
'default') {
6584 $titlealt = $langs->trans(
'Down');
6587 return img_picto($titlealt, ($selected ?
'1downarrow_selected' :
'1downarrow'),
'class="imgdown' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6598function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
6602 if ($titlealt ==
'default') {
6603 $titlealt = $langs->trans(
'Up');
6606 return img_picto($titlealt, ($selected ?
'1uparrow_selected' :
'1uparrow'),
'class="imgup' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6617function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
6621 if ($titlealt ==
'default') {
6622 $titlealt = $langs->trans(
'Left');
6625 return img_picto($titlealt, ($selected ?
'1leftarrow_selected' :
'1leftarrow'), $moreatt);
6636function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
6640 if ($titlealt ==
'default') {
6641 $titlealt = $langs->trans(
'Right');
6644 return img_picto($titlealt, ($selected ?
'1rightarrow_selected' :
'1rightarrow'), $moreatt);
6654function img_allow($allow, $titlealt =
'default')
6658 if ($titlealt ==
'default') {
6659 $titlealt = $langs->trans(
'Active');
6676function img_credit_card($brand, $morecss =
'fa-2x inline-block valignmiddle')
6678 if (is_null($morecss)) {
6682 if ($brand ==
'visa' || $brand ==
'Visa') {
6684 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
6685 $brand =
'cc-mastercard';
6686 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
6688 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
6689 $brand =
'cc-discover';
6690 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
6692 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
6693 $brand =
'cc-diners-club';
6694 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
6695 $brand =
'credit-card';
6698 return '<span class="fa fa-' . $brand .
' fa-fw' . ($morecss ?
' ' . $morecss :
'') .
'"></span>';
6709function img_mime($file, $titlealt =
'', $morecss =
'')
6711 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
6717 if (empty($titlealt)) {
6718 $titlealt =
'Mime type: ' . $mimetype;
6722 return '<i class="fa fa-' . $mimefa .
' ' . (preg_match(
'/pictofixedwidth/', $morecss) ?
'' :
'paddingright ') . ($morecss ?
' ' . $morecss :
'') .
'"' . ($titlealt ?
' title="' .
dolPrintHTMLForAttribute($titlealt) .
'"' :
'') .
'></i>';
6733function img_search($titlealt =
'default', $other =
'')
6737 if ($titlealt ==
'default') {
6738 $titlealt = $langs->trans(
'Search');
6741 $img =
img_picto($titlealt,
'search', $other, 0, 1);
6743 $input =
'<input type="image" class="liste_titre" name="button_search" src="' . $img .
'" ';
6760 if ($titlealt ==
'default') {
6761 $titlealt = $langs->trans(
'Search');
6764 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
6766 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="' . $img .
'" ';
6784function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
6786 global $conf, $langs;
6788 if ($infoonimgalt) {
6789 $result =
img_picto($text,
'info',
'class="' . ($morecss ?
' ' . $morecss :
'') .
'"');
6791 if (empty($conf->use_javascript_ajax)) {
6792 $textfordropdown =
'';
6795 $class = (empty($admin) ?
'undefined' : ((string) $admin ==
'1' ?
'info' : $admin));
6796 $fa =
'info-circle';
6797 if ($picto ==
'warning') {
6798 $fa =
'exclamation-triangle';
6800 $result = ($nodiv ?
'' :
'<div class="wordbreak ' . $class . ($morecss ?
' ' . $morecss :
'') . ($textfordropdown ?
' hidden' :
'') .
'">');
6801 $result .=
img_picto((
string) $admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note'), $fa);
6804 $result .= ($nodiv ?
'' :
'</div>');
6806 if ($textfordropdown) {
6807 $tmpresult =
'<span class="' . $class .
'text opacitymedium cursorpointer">' . $langs->trans($textfordropdown) .
' ' .
img_picto($langs->trans($textfordropdown),
'1downarrow') .
'</span>';
6808 $tmpresult .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">
6809 jQuery(document).ready(function() {
6810 jQuery(".' . $class .
'text").click(function() {
6811 console.log("toggle text");
6812 jQuery(".' . $class .
'").toggle();
6817 $result = $tmpresult . $result;
6838 global $conf, $langs, $user, $argv;
6839 global $dolibarr_main_prod;
6846 require_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
6848 $langs->load(
"main");
6852 $langs->loadLangs(array(
'main',
'errors'));
6854 if ($_SERVER[
'DOCUMENT_ROOT']) {
6855 $out .= $langs->trans(
"DolibarrHasDetectedError") .
".<br>\n";
6857 $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";
6859 $out .= $langs->trans(
"InformationToHelpDiagnose") .
":<br>\n";
6861 $out .=
"<b>" . $langs->trans(
"Date") .
":</b> " .
dol_print_date(time(),
'dayhourlog') .
"<br>\n";
6862 $out .=
"<b>" . $langs->trans(
"Dolibarr") .
":</b> " . DOL_VERSION .
" - https://www.dolibarr.org<br>\n";
6863 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
6864 $out .=
"<b>" . $langs->trans(
"LevelOfFeature") .
":</b> " .
getDolGlobalInt(
'MAIN_FEATURES_LEVEL') .
"<br>\n";
6866 if ($user instanceof
User) {
6867 $out .=
"<b>" . $langs->trans(
"Login") .
":</b> " . $user->login .
"<br>\n";
6869 if (function_exists(
"phpversion")) {
6870 $out .=
"<b>" . $langs->trans(
"PHP") .
":</b> " . phpversion() .
"<br>\n";
6872 $out .=
"<b>" . $langs->trans(
"Server") .
":</b> " . (isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'') .
"<br>\n";
6873 if (function_exists(
"php_uname")) {
6874 $out .=
"<b>" . $langs->trans(
"OS") .
":</b> " . php_uname() .
"<br>\n";
6876 $out .=
"<b>" . $langs->trans(
"UserAgent") .
":</b> " . (isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'') .
"<br>\n";
6878 $out .=
"<b>" . $langs->trans(
"RequestedUrl") .
":</b> " . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT) :
'') .
"<br>\n";
6879 $out .=
"<b>" . $langs->trans(
"Referer") .
":</b> " . (isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'') .
"<br>\n";
6880 $out .=
"<b>" . $langs->trans(
"MenuManager") .
":</b> " . (isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'') .
"<br>\n";
6882 $syslog .=
"url=" . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_escape_htmltag($_SERVER[
"REQUEST_URI"]) :
'');
6883 $syslog .=
", query_string=" . (isset($_SERVER[
"QUERY_STRING"]) ?
dol_escape_htmltag($_SERVER[
"QUERY_STRING"]) :
'');
6885 $out .=
'> ' . $langs->transnoentities(
"ErrorInternalErrorDetected") .
":\n" . $argv[0] .
"\n";
6889 if (!empty($conf->modules)) {
6890 $out .=
"<b>" . $langs->trans(
"Modules") .
":</b> " . implode(
', ', $conf->modules) .
"<br>\n";
6893 if (is_object($db)) {
6894 if ($_SERVER[
'DOCUMENT_ROOT']) {
6895 $out .=
"<b>" . $langs->trans(
"DatabaseTypeManager") .
":</b> " . $db->type .
"<br>\n";
6896 $lastqueryerror = $db->lastqueryerror();
6898 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6900 $out .=
"<b>" . $langs->trans(
"RequestLastAccessInError") .
":</b> " . ($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6901 $out .=
"<b>" . $langs->trans(
"ReturnCodeLastAccessInError") .
":</b> " . ($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6902 $out .=
"<b>" . $langs->trans(
"InformationLastAccessInError") .
":</b> " . ($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6906 $out .=
'> ' . $langs->transnoentities(
"DatabaseTypeManager") .
":\n" . $db->type .
"\n";
6907 $out .=
'> ' . $langs->transnoentities(
"RequestLastAccessInError") .
":\n" . ($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6908 $out .=
'> ' . $langs->transnoentities(
"ReturnCodeLastAccessInError") .
":\n" . ($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6909 $out .=
'> ' . $langs->transnoentities(
"InformationLastAccessInError") .
":\n" . ($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6911 $syslog .=
", sql=" . $db->lastquery();
6912 $syslog .=
", db_error=" . $db->lasterror();
6915 if ($error || $errors) {
6917 if (is_array($error) && is_array($errors)) {
6918 $errors = array_merge($error, $errors);
6919 } elseif (is_array($error)) {
6921 } elseif (is_array($errors) && !empty($error)) {
6922 $errors = array_merge(array($error), $errors);
6923 } elseif (!empty($error)) {
6924 $errors = array_merge(array($error), array($errors));
6927 $langs->load(
"errors");
6929 foreach ($errors as $msg) {
6933 if ($_SERVER[
'DOCUMENT_ROOT']) {
6934 $out .=
"<b>" . $langs->trans(
"Message") .
":</b> " .
dol_escape_htmltag($msg) .
"<br>\n";
6936 $out .=
'> ' . $langs->transnoentities(
"Message") .
":\n" . $msg .
"\n";
6938 $syslog .=
", msg=" . $msg;
6941 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
6942 xdebug_print_function_stack();
6943 $out .=
'<b>XDebug information:</b>' .
"<br>\n";
6944 $out .=
'File: ' . xdebug_call_file() .
"<br>\n";
6945 $out .=
'Line: ' . xdebug_call_line() .
"<br>\n";
6946 $out .=
'Function: ' . xdebug_call_function() .
"<br>\n";
6951 if (!headers_sent()) {
6952 if (function_exists(
'top_httphead')) {
6956 http_response_code(202);
6959 if (empty($dolibarr_main_prod)) {
6962 if (empty($langs->defaultlang)) {
6963 $langs->setDefaultLang();
6965 $langs->loadLangs(array(
"main",
"errors"));
6967 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";
6968 print $langs->trans(
"DolibarrHasDetectedError") .
'. ';
6969 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6970 if (!defined(
"MAIN_CORE_ERROR")) {
6971 define(
"MAIN_CORE_ERROR", 1);
6988function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6992 if (empty($email)) {
6996 $langs->load(
"errors");
6999 print
'<br><div class="center login_main_message"><div class="' . $morecss .
'">';
7000 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode .
'-' .
dol_print_date($now,
'%Y%m%d%H%M%S'));
7001 if ($errormessage) {
7002 print
'<br><br>' . $errormessage;
7004 if (is_array($errormessages) && count($errormessages)) {
7005 foreach ($errormessages as $mesgtoshow) {
7006 print
'<br><br>' . $mesgtoshow;
7009 print
'</div></div>';
7028function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $param =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
7030 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $param, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
7051function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
7053 global $langs, $form;
7056 if ($moreattrib ==
'class="right"') {
7057 $prefix .=
'right ';
7060 $tooltip = (string) $tooltip;
7062 $sortorder = strtoupper((
string) $sortorder);
7071 $tmpsortfield = explode(
',', (
string) $sortfield);
7072 $sortfield1 = trim($tmpsortfield[0]);
7073 $tmpfield = explode(
',', $field);
7074 $field1 = trim($tmpfield[0]);
7076 if (strpos((
string) $tooltip,
':') !==
false) {
7077 $tmptooltip = explode(
':', (
string) $tooltip);
7079 $tmptooltip = array($tooltip);
7082 $wrapcolumntitle = (empty($forcenowrapcolumntitle) || (!empty($tmptooltip[2]) && $tmptooltip[2] ==
'-1'));
7084 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && $wrapcolumntitle) {
7085 $prefix =
'wrapcolumntitle ' . $prefix;
7091 $liste_titre =
'liste_titre';
7092 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
7093 $liste_titre =
'liste_titre_sel';
7096 $tagstart =
'<' . $tag .
' class="' . $prefix . $liste_titre .
'" ' . $moreattrib;
7101 if (empty($thead) && $field && empty($disablesortlink)) {
7102 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7103 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7104 $options = preg_replace(
'/&+/i',
'&', $options);
7105 if (!preg_match(
'/^&/', $options)) {
7106 $options =
'&' . $options;
7109 $sortordertouseinlink =
'';
7110 if ($field1 != $sortfield1) {
7111 if (preg_match(
'/^DESC/i', $sortorder)) {
7112 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7114 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7117 if (preg_match(
'/^ASC/i', $sortorder)) {
7118 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7120 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7123 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
7124 $out .=
'<a class="reposition" href="' .
dolBuildUrl($file, [
'sortfield' => $field,
'sortorder' => $sortordertouseinlink,
'begin' => $begin]) . $options .
'"';
7128 if ($tooltip && $tmptooltip[0]) {
7130 $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]));
7132 $out .= $langs->trans((
string) $name);
7135 if (empty($thead) && $field && empty($disablesortlink)) {
7139 if (empty($thead) && $field) {
7140 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7141 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7142 $options = preg_replace(
'/&+/i',
'&', $options);
7143 if (!preg_match(
'/^&/', $options)) {
7144 $options =
'&' . $options;
7147 if (!$sortorder || ($field1 != $sortfield1)) {
7150 if (preg_match(
'/^DESC/', $sortorder)) {
7151 $sortimg .=
'<span class="nowrap">' .
img_up(
"Z-A", 0,
'paddingright') .
'</span>';
7153 if (preg_match(
'/^ASC/', $sortorder)) {
7154 $sortimg .=
'<span class="nowrap">' .
img_down(
"A-Z", 0,
'paddingright') .
'</span>';
7159 $tagend =
'</' . $tag .
'>';
7161 $out = $tagstart . $sortimg . $out . $tagend;
7176 dol_syslog(__FUNCTION__ .
" is deprecated", LOG_WARNING);
7178 print
'<div class="titre">' . $title .
'</div>';
7192function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
7211function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'', $morecssonpicto =
'widthpictotitle')
7215 if ($picto ==
'setup') {
7220 $return .=
'<table ' . (
$id ?
'id="' .
$id .
'" ' :
'') .
'class="centpercent notopnoleftnoright table-fiche-title' . ($morecssontable ?
' ' . $morecssontable :
'') .
'">';
7221 $return .=
'<tr class="toptitle">';
7223 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">' .
img_picto(
'', $picto,
'class="valignmiddle pictotitle'.($morecssonpicto ?
' '.$morecssonpicto :
'').
'"', $pictoisfullpath) .
'</td>';
7225 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
7226 $return .=
'<div class="titre inline-block">';
7227 $return .=
'<span class="inline-block valignmiddle">' . $title .
'</span>';
7228 $return .=
'</div>';
7231 $return .=
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7234 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">' . $morehtmlright .
'</td>';
7236 $return .=
'</tr></table>' .
"\n";
7264function 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 =
'')
7266 global $conf, $langs;
7269 $savtotalnboflines = $totalnboflines;
7270 if (is_numeric($totalnboflines)) {
7271 $totalnboflines = abs($totalnboflines);
7276 $tmparray = preg_split(
'/<br>/i', $title, 2);
7277 if (!empty($tmparray[1])) {
7278 $title = $tmparray[0];
7279 $subtitle = $tmparray[1];
7282 $page = (int) $page;
7284 if ($picto ==
'setup') {
7285 $picto =
'title_setup';
7287 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
7288 $picto =
'title.gif';
7291 $limit = $conf->liste_limit;
7294 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
7302 print
"<!-- Begin print_barre_liste -->\n";
7303 print
'<table class="centpercent notopnoleftnoright table-fiche-title' . ($morecss ?
' ' . $morecss :
'') .
'">';
7304 print
'<tr class="toptitle">';
7308 if ($picto && $title) {
7309 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
7310 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
7314 print
'<td class="nobordernopadding valignmiddle col-title">';
7315 print
'<div class="titre inline-block">';
7316 print
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7317 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'' && $totalnboflines > 0) {
7318 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="' . $langs->trans(
"NbRecordQualified") .
'">(' . $totalnboflines .
')</span>';
7321 if (!empty($subtitle)) {
7322 print
'<br><div class="subtitle inline-block hideonsmartphone">' . $subtitle .
'</div>';
7327 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
7328 print
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7332 print
'<td class="nobordernopadding valignmiddle right col-right">';
7333 print
'<input type="hidden" name="pageplusoneold" value="' . ((int) $page + 1) .
'">';
7335 parse_str($options, $query);
7337 $query += [
'sortfield' => $sortfield];
7340 $query += [
'sortorder' => $sortorder];
7343 $options =
'&' . http_build_query($query);
7345 $query = array_merge($query, [
'page' => $page]);
7349 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
7350 if ($totalnboflines) {
7352 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
7355 $nbpages = ceil($totalnboflines / $limit);
7359 $cpt = ($page - $maxnbofpage);
7365 if (empty($pagenavastextinput)) {
7367 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">1</a></li>';
7369 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7370 } elseif ($cpt == 2) {
7372 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">2</a></li>';
7378 if ($pagenavastextinput) {
7379 if ($cpt == $page) {
7380 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="' . ($totalnboflines > 100 ?
'width40' :
'width25') .
' center pageplusone heightofcombo" name="pageplusone" value="' . ($page + 1) .
'"></li>';
7384 if ($cpt == $page) {
7385 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
'</span></li>';
7387 $query[
'page'] = $cpt;
7388 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($cpt + 1) .
'</a></li>';
7392 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
7394 if (empty($pagenavastextinput)) {
7395 if ($cpt < $nbpages) {
7396 if ($cpt < $nbpages - 2) {
7397 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7398 } elseif ($cpt == $nbpages - 2) {
7399 $query[
'page'] = ($nbpages - 2);
7400 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($nbpages - 1) .
'</a></li>';
7402 $query[
'page'] = ($nbpages - 1);
7403 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7406 $query[
'page'] = ($nbpages - 1);
7407 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7410 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
"</li>";
7414 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
7415 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
7419 if ($pagenavastextinput) {
7429 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
7430 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">' . $morehtmlcenter .
'</div>';
7433 print
"<!-- End title -->\n\n";
7452function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
7454 global $conf, $langs;
7456 print
'<div class="pagination"><ul>';
7457 if ($beforearrows) {
7458 print
'<li class="paginationbeforearrows">';
7459 print $beforearrows;
7463 if (empty($hidenavigation)) {
7464 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
7465 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
7466 $pagesizechoices .=
',5000:5000';
7476 print
'<li class="pagination">';
7477 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 .
'">';
7478 print
'<datalist id="limitlist">';
7480 print
'<li class="paginationcombolimit valignmiddle">';
7481 print
'<select id="limit' . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix) .
'" name="limit" class="flat selectlimit nopadding maxwidth75 center' . (is_numeric($selectlimitsuffix) ?
'' :
' ' . $selectlimitsuffix) .
'" title="' .
dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")) .
'">';
7483 $tmpchoice = explode(
',', $pagesizechoices);
7484 $tmpkey = $limit .
':' . $limit;
7485 if (!in_array($tmpkey, $tmpchoice)) {
7486 $tmpchoice[$tmpkey] = $tmpkey;
7488 $tmpkey = $conf->liste_limit .
':' . $conf->liste_limit;
7489 if (!in_array($tmpkey, $tmpchoice)) {
7490 $tmpchoice[$tmpkey] = $tmpkey;
7492 asort($tmpchoice, SORT_NUMERIC);
7493 foreach ($tmpchoice as $val) {
7495 $tmp = explode(
':', $val);
7498 if ($key !=
'' && $val !=
'') {
7499 if ((
int) $key == (
int) $limit) {
7500 $selected =
' selected="selected"';
7502 print
'<option name="' . $key .
'"' . $selected .
'>' .
dol_escape_htmltag($val) .
'</option>' .
"\n";
7506 print
'</datalist>';
7509 print
ajax_combobox(
"limit" . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
7513 if ($conf->use_javascript_ajax) {
7514 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
7516 jQuery(document).ready(function () {
7517 jQuery(".selectlimit").change(function() {
7518 console.log("We change limit so we submit the form");
7519 $(this).parents(\'form:first\').submit();
7528 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>';
7530 if ($betweenarrows) {
7531 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
7532 print $betweenarrows;
7533 print
'<!--</div>-->';
7535 if ($nextpage > 0) {
7536 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>';
7539 print
'<li class="paginationafterarrows">';
7544 print
'</ul></div>' .
"\n";
7559function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
7563 if (preg_match(
'/%/', $rate)) {
7564 $rate = str_replace(
'%',
'', $rate);
7568 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
7569 $morelabel =
' (' . $reg[1] .
')';
7570 $rate = preg_replace(
'/\s*' . preg_quote($morelabel,
'/') .
'/',
'', $rate);
7571 $morelabel =
' ' . ($html ?
'<span class="opacitymedium">' :
'') .
'(' . $reg[1] .
')' . ($html ?
'</span>' :
'');
7573 if (preg_match(
'/\*/', $rate)) {
7574 $rate = str_replace(
'*',
'', $rate);
7579 if (!preg_match(
'/\//', $rate)) {
7580 $ret =
price($rate, 0,
'', 0, 0) . ($addpercent ?
'%' :
'');
7583 $ret = $rate . ($addpercent ?
'%' :
'');
7585 if (($info_bits & 1) && $usestarfornpr >= 0) {
7608function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
7610 global $langs, $conf;
7613 if (empty($amount)) {
7616 $amount = (is_numeric($amount) ? $amount : 0);
7617 if ($rounding == -1) {
7620 $nbdecimal = $rounding;
7622 if ($outlangs ===
'none') {
7632 if (!($outlangs instanceof
Translate)) {
7636 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7637 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
7639 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7640 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
7642 if ($thousand ==
'None') {
7644 } elseif ($thousand ==
'Space') {
7651 $amount = str_replace(
',',
'.', $amount);
7653 $data = explode(
'.', $amount);
7654 $decpart = isset($data[1]) ? $data[1] :
'';
7655 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
7665 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
7666 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
7667 $nbdecimal = $nbdecimalmaxshown;
7675 if ((
string) $forcerounding !=
'-1' && (string) $forcerounding !=
'') {
7676 if ($forcerounding ===
'MU') {
7678 } elseif ($forcerounding ===
'MT') {
7680 } elseif ($forcerounding >= 0) {
7681 $nbdecimal = (int) $forcerounding;
7686 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
7688 $cursymbolbefore = $cursymbolafter =
'';
7689 if ($currency_code && is_object($outlangs)) {
7690 if ($currency_code ==
'auto') {
7691 $currency_code = $conf->currency;
7694 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
7695 $listoflanguagesbefore = array(
'nl_NL');
7696 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
7697 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
7699 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
7700 $cursymbolafter .= ($tmpcur == $currency_code ?
' ' . $tmpcur : $tmpcur);
7703 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' ' :
'') . $cursymbolafter;
7705 $output = preg_replace(
'/\s/',
' ', $output);
7706 $output = preg_replace(
'/\'/',
''', $output);
7737function price2num($amount, $rounding =
'', $option = 0)
7742 if (is_null($amount)) {
7751 if (is_null($langs)) {
7755 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7756 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
7758 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7759 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
7762 if ($thousand ==
'None') {
7764 } elseif ($thousand ==
'Space') {
7772 if (!is_numeric($amount)) {
7773 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
7776 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
7777 $amount = str_replace($thousand,
'', $amount);
7783 if (is_numeric($amount)) {
7785 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7786 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7788 $amount = number_format($amount, $nbofdec, $dec, $thousand);
7794 if ($thousand !=
',' && $thousand !=
'.') {
7807 if (preg_match(
'/^(?<int>[^,]*,|[^.]*\.)(?<dec>[^.,]*)$/u', $amount, $matches)) {
7808 $intPart = $matches[
'int'];
7809 $decPart = $matches[
'dec'];
7812 $intPart = str_replace([
'.',
','],
'', $intPart);
7815 $amount = $intPart . $dec . $decPart;
7819 $amount = str_replace(
' ',
'', $amount);
7820 $amount = str_replace($thousand,
'', $amount);
7821 $amount = str_replace($dec,
'.', $amount);
7823 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7829 $nbofdectoround =
'';
7830 if ($rounding ==
'MU') {
7832 } elseif ($rounding ==
'MT') {
7834 } elseif ($rounding ==
'MS') {
7836 } elseif ($rounding ==
'CU') {
7838 } elseif ($rounding ==
'CT') {
7840 } elseif (is_numeric($rounding)) {
7841 $nbofdectoround = (int) $rounding;
7846 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7848 return 'ErrorBadParameterProvidedToFunction';
7854 if (is_numeric($amount)) {
7856 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7857 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7859 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7865 if ($thousand !=
',' && $thousand !=
'.') {
7866 $amount = str_replace(
',',
'.', $amount);
7869 $amount = str_replace(
' ',
'', $amount);
7870 $amount = str_replace($thousand,
'', $amount);
7871 $amount = str_replace($dec,
'.', $amount);
7873 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7891function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7893 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
7895 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7896 $dimension *= 1000000;
7898 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7901 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7902 $dimension /= 1000000;
7904 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
7921 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
7941function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
7943 global $db, $conf,
$mysoc;
7945 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
7946 $thirdparty_seller =
$mysoc;
7949 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);
7951 $vatratecleaned = $vatrate;
7953 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
7954 $vatratecleaned = trim($reg[1]);
7955 $vatratecode = $reg[2];
7964 if (
$mysoc->country_code ==
'ES') {
7966 if (!
$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
7969 if ($thirdparty_seller->id ==
$mysoc->id) {
7970 if (!$thirdparty_buyer->localtax1_assuj) {
7974 if (!$thirdparty_seller->localtax1_assuj) {
7982 if (!
$mysoc->localtax2_assuj) {
7985 if ($thirdparty_seller->id ==
$mysoc->id) {
7986 if (!$thirdparty_buyer->localtax2_assuj) {
7990 if (!$thirdparty_seller->localtax2_assuj) {
7996 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
7999 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
8005 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8006 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
8012 if ($thirdparty_seller !=
$mysoc) {
8014 return $thirdparty_seller->localtax1_value;
8023 if ($thirdparty_seller !=
$mysoc) {
8026 return $thirdparty_seller->localtax2_value;
8029 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8030 return $thirdparty_buyer->localtax2_value;
8039 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
8040 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8041 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($thirdparty_seller->country_code) .
"'";
8042 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8043 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8044 if (!empty($vatratecode)) {
8045 $sql .=
" AND t.code ='" . $db->escape($vatratecode) .
"'";
8047 $sql .=
" AND t.recuperableonly = '" . $db->escape((
string) $vatnpr) .
"'";
8050 $resql = $db->query($sql);
8053 $obj = $db->fetch_object($resql);
8056 return $obj->localtax1;
8057 } elseif ($local == 2) {
8058 return $obj->localtax2;
8079 $valors = explode(
":", $tax);
8081 if (count($valors) > 1) {
8098 $sql =
" SELECT t.localtax" . $local .
" as localtax";
8099 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t INNER JOIN " . MAIN_DB_PREFIX .
"c_country as c ON c.rowid = t.fk_pays";
8100 $sql .=
" WHERE c.code = '" . $db->escape(
$mysoc->country_code) .
"' AND t.active = 1 AND t.entity IN (" .
getEntity(
'c_tva') .
") AND t.taux = (";
8101 $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";
8102 $sql .=
" WHERE c.code = '" . $db->escape(
$mysoc->country_code) .
"' AND t.entity IN (" .
getEntity(
'c_tva') .
") AND tt.active = 1)";
8103 $sql .=
" AND t.localtax" . $local .
"_type <> '0'";
8104 $sql .=
" ORDER BY t.rowid DESC";
8106 $resql = $db->query($sql);
8108 $obj = $db->fetch_object($resql);
8110 return $obj->localtax;
8131function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
8135 dol_syslog(
"getTaxesFromId vat id or rate = " . $vatrate);
8138 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
8139 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
8140 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8141 if ($firstparamisid) {
8142 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8144 $vatratecleaned = $vatrate;
8147 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8148 $vatratecleaned = $reg[1];
8149 $vatratecode = $reg[2];
8152 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8155 $sql .=
" WHERE t.fk_pays = c.rowid";
8157 $sql .=
" AND c.code = '" . $db->escape($buyer->country_code) .
"'";
8159 $sql .=
" AND c.code = '" . $db->escape($seller->country_code) .
"'";
8161 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8162 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8164 $sql .=
" AND t.code = '" . $db->escape($vatratecode) .
"'";
8168 $resql = $db->query($sql);
8170 $obj = $db->fetch_object($resql);
8173 'rowid' => $obj->rowid,
8174 'code' => $obj->code,
8175 'rate' => $obj->rate,
8176 'localtax1' => $obj->localtax1,
8177 'localtax1_type' => $obj->localtax1_type,
8178 'localtax2' => $obj->localtax2,
8179 'localtax2_type' => $obj->localtax2_type,
8181 'accountancy_code_sell' => $obj->accountancy_code_sell,
8182 'accountancy_code_buy' => $obj->accountancy_code_buy
8214 dol_syslog(
"getLocalTaxesFromRate vatrate=" . $vatrate .
" local=" . $local);
8217 $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";
8218 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8219 if ($firstparamisid) {
8220 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8222 $vatratecleaned = $vatrate;
8225 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8226 $vatratecleaned = $reg[1];
8227 $vatratecode = $reg[2];
8230 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8232 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ?
$mysoc->country_code : $buyer->country_code);
8233 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($countrycodetouse) .
"'";
8235 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ?
$mysoc->country_code : $seller->country_code);
8236 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($countrycodetouse) .
"'";
8238 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8240 $sql .=
" AND t.code = '" . $db->escape($vatratecode) .
"'";
8244 $resql = $db->query($sql);
8246 $obj = $db->fetch_object($resql);
8249 $vateratestring = $obj->rate . ($obj->code ?
' (' . $obj->code .
')' :
'');
8252 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8253 } elseif ($local == 2) {
8254 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8256 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);
8278 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8286 $product->fetch($idprod);
8288 if ((
$mysoc->country_code == $thirdpartytouseforcountry->country_code)
8289 || (in_array(
$mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouseforcountry->country_code, array(
'FR',
'MC')))
8290 || (in_array(
$mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouseforcountry->country_code, array(
'MQ',
'GP')))
8293 if ($idprodfournprice > 0) {
8294 $result = $product->get_buyprice($idprodfournprice, 0, 0,
'');
8296 $ret = $product->vatrate_supplier;
8297 if ($product->default_vat_code_supplier) {
8298 $ret .=
' (' . $product->default_vat_code_supplier .
')';
8304 $ret = $product->tva_tx;
8305 if ($product->default_vat_code) {
8306 $ret .=
' (' . $product->default_vat_code .
')';
8319 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
8320 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8321 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '" . $db->escape($thirdpartytouseforcountry->country_code) .
"'";
8322 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8323 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8324 $sql .= $db->plimit(1);
8326 $resql = $db->query($sql);
8328 $obj = $db->fetch_object($resql);
8330 $ret = $obj->vat_rate;
8331 if ($obj->default_vat_code) {
8332 $ret .=
' (' . $obj->default_vat_code .
')';
8356 dol_syslog(
"get_product_vat_for_country: ret=" . $ret);
8374 if (!class_exists(
'Product')) {
8375 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8384 $result = $product->fetch($idprod);
8386 if (
$mysoc->country_code == $thirdpartytouseforcountry->country_code) {
8400 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
8401 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8402 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='" . $db->escape($thirdpartytouseforcountry->country_code) .
"'";
8403 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8404 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
8405 $sql .= $db->plimit(1);
8407 $resql = $db->query($sql);
8409 $obj = $db->fetch_object($resql);
8412 $ret = $obj->localtax1;
8413 } elseif ($local == 2) {
8414 $ret = $obj->localtax2;
8422 dol_syslog(
"get_product_localtax_for_country: ret=" . $ret);
8446 global
$mysoc, $db, $hookmanager;
8448 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
8451 $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;
8453 if (empty($thirdparty_seller->country_code)) {
8454 $thirdparty_seller->country_code =
$mysoc->country_code;
8456 $seller_country_code = $thirdparty_seller->country_code;
8457 $seller_in_cee =
isInEEC($thirdparty_seller);
8459 if (empty($thirdparty_buyer->country_code)) {
8460 $thirdparty_buyer->country_code =
$mysoc->country_code;
8462 $buyer_country_code = $thirdparty_buyer->country_code;
8463 $buyer_in_cee =
isInEEC($thirdparty_buyer);
8465 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'));
8473 if ($seller_in_cee && $buyer_in_cee) {
8474 $isacompany = $thirdparty_buyer->
isACompany();
8475 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8476 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8484 $vatrule =
'VATRULE 0';
8490 if (empty($vatrule) && !$seller_use_vat) {
8498 $vatrule =
'VATRULE 1';
8502 if (empty($vatrule) && !empty($thirdparty_buyer->state_id)) {
8503 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
8504 $sql .=
" FROM " . $db->prefix() .
"c_tva as t";
8505 $sql .=
" INNER JOIN " . $db->prefix() .
"c_departements as d ON t.fk_department_buyer = d.rowid";
8506 $sql .=
" WHERE d.rowid = " . ((int) $thirdparty_buyer->state_id);
8507 $sql .=
" AND t.active > 0";
8508 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
8509 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8511 $res = $db->query($sql);
8513 if ($db->num_rows($res)) {
8514 $obj = $db->fetch_object($res);
8516 $vatvalue = $obj->vat_default_rate .
' (' . $obj->vat_default_code .
')';
8517 $vatrule =
'VATRULE 2';
8524 if (empty($vatrule) && (
8525 ($seller_country_code == $buyer_country_code)
8526 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
8527 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
8532 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
8536 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
8538 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
8539 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
8541 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
8545 $vatvalue = $tmpvat;
8546 $vatrule =
'VATRULE 3b';
8554 if (empty($vatrule) && ($seller_in_cee && $buyer_in_cee)) {
8555 $isacompany = $thirdparty_buyer->
isACompany();
8556 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8557 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8566 $vatrule =
'VATRULE 5';
8573 $vatrule =
'VATRULE 6';
8579 if (empty($vatrule) &&
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
8580 $isacompany = $thirdparty_buyer->
isACompany();
8583 $vatrule =
'VATRULE extra';
8596 $parameters = array(
'vatvalue' => $vatvalue,
'vatrule' => $vatrule);
8600 $reshook = $hookmanager->executeHooks(
'get_default_tva', $parameters, $tmpobject, $tmpaction);
8601 if ($reshook > 0 && !empty($hookmanager->resArray[
'vatvalue'])) {
8602 $vatvalue = $hookmanager->resArray[
'vatvalue'];
8603 $vatrule = $hookmanager->resArray[
'vatrule'];
8624 if ($idprodfournprice > 0) {
8625 if (!class_exists(
'ProductFournisseur')) {
8626 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
8629 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
8630 return $prodprice->fourn_tva_npr;
8631 } elseif ($idprod > 0) {
8632 if (!class_exists(
'Product')) {
8633 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8636 $prod->fetch($idprod);
8637 return $prod->tva_npr;
8660 if (!is_object($thirdparty_seller)) {
8663 if (!is_object($thirdparty_buyer)) {
8667 if (empty($thirdparty_seller->country_code)) {
8668 $thirdparty_seller->country_code =
$mysoc->country_code;
8670 $seller_country_code = $thirdparty_seller->country_code;
8673 if (empty($thirdparty_buyer->country_code)) {
8674 $thirdparty_buyer->country_code =
$mysoc->country_code;
8676 $buyer_country_code = $thirdparty_buyer->country_code;
8680 if (
$mysoc->country_code ==
'ES') {
8681 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
8686 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
8689 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
8693 } elseif ($local == 2) {
8695 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
8698 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
8703 if ($seller_country_code == $buyer_country_code) {
8718function yn($yesno, $format = 1, $color = 0)
8722 $result =
'unknown';
8724 if ($yesno ===
true || (
int) $yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
8725 $result = $langs->trans(
'yes');
8726 if ($format == 1 || $format == 3) {
8727 $result = $langs->trans(
"Yes");
8730 $result =
'<input type="checkbox" value="1" checked disabled>';
8733 $result =
'<input type="checkbox" value="1" checked disabled> ' . $result;
8735 if ($format == 4 || !is_numeric($format)) {
8736 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
8741 $result = $langs->trans(
"no");
8742 if ($format == 1 || $format == 3) {
8743 $result = $langs->trans(
"No");
8746 $result =
'<input type="checkbox" value="0" disabled>';
8749 $result =
'<input type="checkbox" value="0" disabled> ' . $result;
8751 if ($format == 4 || !is_numeric($format)) {
8752 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
8758 $classname =
'error';
8762 return '<span class="' . $classname .
'">' . $result .
'</span>';
8785function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
8787 if (empty($modulepart) && is_object(
$object)) {
8788 if (!empty(
$object->module)) {
8789 $modulepart =
$object->module;
8790 } elseif (!empty(
$object->element)) {
8791 $modulepart =
$object->element;
8798 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
8800 $arrayforoldpath[
'product'] = 2;
8803 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8804 $level = $arrayforoldpath[$modulepart];
8806 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8808 if (empty($num) && is_object(
$object)) {
8811 if (empty($alpha)) {
8812 $num = preg_replace(
'/([^0-9])/i',
'', $num);
8814 $num = preg_replace(
'/^.*\-/i',
'', $num);
8816 $num = substr(
"000" . $num, -$level);
8818 $path = substr($num, 0, 1);
8821 $path = substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8824 $path = substr($num, 2, 1) .
'/' . substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8830 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceof
Societe) {
8838 if (empty($withoutslash) && !empty($path)) {
8853function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
8855 dol_syslog(
"functions.lib::dol_mkdir: dir=" . $dir, LOG_INFO);
8860 if (@is_dir($dir_osencoded)) {
8868 if (!empty($dataroot)) {
8870 $dir = str_replace($dataroot .
'/',
'', $dir);
8871 $ccdir = $dataroot .
'/';
8874 $cdir = explode(
"/", $dir);
8875 $num = count($cdir);
8876 for ($i = 0; $i < $num; $i++) {
8878 $ccdir .=
'/' . $cdir[$i];
8880 $ccdir .= $cdir[$i];
8883 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
8891 if (!@is_dir($ccdir_osencoded)) {
8892 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' is not found (does not exists or is outside open_basedir PHP setting).", LOG_DEBUG);
8895 $dirmaskdec = octdec((
string) $newmask);
8896 if (empty($newmask)) {
8899 $dirmaskdec |= octdec(
'0111');
8900 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
8902 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '" . $ccdir .
"' (no permission to write into parent or directory already exists).", LOG_WARNING);
8905 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' created", LOG_DEBUG);
8914 return ($nberr ? -$nberr : $nbcreated);
8925function dolChmod($filepath, $newmask =
'')
8927 if (!empty($newmask)) {
8928 @chmod($filepath, octdec($newmask));
8942 return '<span class="fieldrequired">*</span>';
8962function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
8964 if (is_null($stringtoclean)) {
8968 if ($removelinefeed == 2) {
8969 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
8971 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
8976 $temp = str_replace(
'< ',
'__ltspace__', $temp);
8977 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
8980 $temp = strip_tags($temp);
8983 $pattern =
"/<[^<>]+>/";
8990 $tempbis = str_replace(
'<>',
'', $temp);
8991 $tempbis = preg_replace($pattern,
'', $tempbis);
8993 }
while ($tempbis != $temp);
8998 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
9004 if ($removelinefeed == 1) {
9005 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
9009 if ($removedoublespaces) {
9010 while (strpos($temp,
" ") !==
false) {
9011 $temp = str_replace(
" ",
" ", $temp);
9015 $temp = str_replace(
'__ltspace__',
'< ', $temp);
9016 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
9040function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
9042 if (empty($allowed_tags)) {
9043 $allowed_tags = array(
9100 $allowed_tags[] =
"comment";
9102 if (!in_array(
'iframe', $allowed_tags)) {
9103 $allowed_tags[] =
"iframe";
9107 if (!in_array(
'link', $allowed_tags)) {
9108 $allowed_tags[] =
"link";
9110 if (!in_array(
'meta', $allowed_tags)) {
9111 $allowed_tags[] =
"meta";
9115 if (!in_array(
'script', $allowed_tags)) {
9116 $allowed_tags[] =
"script";
9120 if (!in_array(
'style', $allowed_tags)) {
9121 $allowed_tags[] =
"style";
9125 $allowed_tags_string = implode(
"><", $allowed_tags);
9126 $allowed_tags_string =
'<' . $allowed_tags_string .
'>';
9128 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
9133 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
9136 $allowed_tags[] =
"commentphp";
9137 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
9138 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
9141 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
9142 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
9145 $temp = strip_tags($stringtoclean, $allowed_tags_string);
9147 if ($cleanalsosomestyles) {
9148 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
9150 if ($removeclassattribute) {
9151 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
9156 if ($cleanalsojavascript) {
9157 $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);
9160 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
9163 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
9166 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
9187 if (is_null($allowed_attributes)) {
9188 $allowed_attributes = array(
9222 if (!in_array(
"content", $allowed_attributes)) {
9223 $allowed_attributes[] =
"content";
9225 if (!in_array(
"http-equiv", $allowed_attributes)) {
9226 $allowed_attributes[] =
"http-equiv";
9229 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
9231 $stringtoclean =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $stringtoclean .
'</body></html>';
9234 $dom =
new DOMDocument(
'',
'UTF-8');
9236 $savwarning = error_reporting();
9237 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
9238 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
9239 error_reporting($savwarning);
9241 if ($dom instanceof DOMDocument) {
9242 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
9243 $el = $els->item($i);
9244 if (!$el instanceof DOMElement) {
9247 $attrs = $el->attributes;
9248 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
9250 if (!empty($attrs->item($ii)->name)) {
9251 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
9253 $els->item($i)->removeAttribute($attrs->item($ii)->name);
9254 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
9256 $valuetoclean = $attrs->item($ii)->value;
9258 if (isset($valuetoclean)) {
9260 $oldvaluetoclean = $valuetoclean;
9261 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
9262 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
9263 if ($els->item($i)->tagName ==
'a') {
9264 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
9265 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
9266 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
9270 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
9271 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
9272 }
while ($oldvaluetoclean != $valuetoclean);
9275 $attrs->item($ii)->value = $valuetoclean;
9282 $dom->encoding =
'UTF-8';
9284 $return = $dom->saveHTML();
9288 $return = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]*' . preg_quote(
'></head><body>',
'/') .
'/',
'', $return);
9289 $return = preg_replace(
'/' . preg_quote(
'</body></html>',
'/') .
'$/',
'', trim($return));
9291 return trim($return);
9293 return $stringtoclean;
9310 $temp = $stringtoclean;
9311 foreach ($disallowed_tags as $tagtoremove) {
9312 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'>/',
'', $temp);
9313 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'\s+[^>]*>/',
'', $temp);
9316 if ($cleanalsosomestyles) {
9317 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
9335 if ($nboflines == 1) {
9337 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
9338 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
9341 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
9346 return $firstline . (isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
9350 $text = preg_replace(
'/\n/',
'', $text);
9352 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9354 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9357 $text = strtr($text, $repTable);
9358 if ($charset ==
'UTF-8') {
9359 $pattern =
'/(<br[^>]*>)/Uu';
9362 $pattern =
'/(<br[^>]*>)/U';
9364 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9369 $lastaddediscontent = 1;
9370 while ($countline < $nboflines && isset($a[$i])) {
9371 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
9372 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
9373 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
9375 if (!$lastaddediscontent) {
9378 $lastaddediscontent = 0;
9381 $firstline .= $a[$i];
9382 $lastaddediscontent = 1;
9388 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
9390 $ret = $firstline . ($adddots ?
'...' :
'');
9408function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
9410 if (is_null($stringtoencode)) {
9415 return nl2br($stringtoencode, $forxml);
9417 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
9431function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
9433 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
9438 return $stringtoencode;
9440 $out = $stringtoencode;
9444 $oldstringtoclean = $out;
9452 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
9454 libxml_use_internal_errors(
false);
9455 if (LIBXML_VERSION < 20900) {
9459 libxml_disable_entity_loader(
true);
9462 $dom =
new DOMDocument();
9470 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">' . $out .
'</div></body></html>';
9474 $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>';
9480 $out = preg_replace_callback(
9481 '/__\[([0-9a-zA-Z_]+)\]__/',
9487 return '__BRACKETSTART' . $m[1] .
'BRACKETEND__';
9492 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
9494 $dom->encoding =
'UTF-8';
9496 $out = trim($dom->saveHTML());
9499 $out = preg_replace_callback(
9500 '/__BRACKETSTART([0-9a-zA-Z_]+)BRACKETEND__/',
9506 return '__[' . $m[1] .
']__';
9513 $out = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]+' . preg_quote(
'></head><body><div class="tricktoremove">',
'/') .
'/',
'', $out);
9514 $out = preg_replace(
'/' . preg_quote(
'</div></body></html>',
'/') .
'$/',
'', trim($out));
9519 $out = str_replace(
'<br>',
'', $out);
9524 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9531 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript')) && $outishtml) {
9537 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
9544 'quote-marks' =>
false,
9545 'doctype' =>
'strict',
9546 'show-body-only' =>
true,
9547 "indent-attributes" =>
false,
9548 "vertical-space" =>
false,
9551 'preserve-entities' =>
true
9561 $out = $tidy->repairString($out, $config,
'utf8');
9570 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9576 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
9579 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
9583 $out = preg_replace(
'/'/i',
''', $out);
9588 if (function_exists(
'realCharForNumericEntities')) {
9589 $out = preg_replace_callback(
9590 '/&#(x?[0-9][0-9a-f]+;?)/i',
9595 static function ($m) {
9603 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
9606 if ($check ==
'restricthtmlallowlinkscript') {
9608 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
9610 } elseif ($check ==
'restricthtmlallowiframe') {
9623 $out = preg_replace(
'/'/i',
"'", $out);
9627 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
9628 $out = preg_replace(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i',
'', $out);
9629 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
9630 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
9631 $out = preg_replace(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i',
'', $out);
9632 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
9634 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
9635 }
while ($oldstringtoclean != $out);
9642 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
9643 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
9644 $nblinks = count($reg[0]);
9645 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
9646 $out =
'ErrorTooManyLinksIntoHTMLString';
9649 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
9651 $out =
'ErrorHTMLLinksNotAllowed';
9653 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
9658 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
9663 if (preg_match_all($pattern, $out, $matches)) {
9666 foreach ($matches[1] as $tmpval) {
9667 if (!empty($tmpval)) {
9671 foreach ($matches[2] as $tmpval) {
9672 if (!empty($tmpval)) {
9680 foreach ($urls as $url) {
9682 $parsedurl = parse_url($url);
9683 if (!empty($parsedurl)) {
9692 if (empty($firstexturl)) {
9693 $firstexturl = $url;
9694 } elseif (empty($secondexturl)) {
9695 $secondexturl = $url;
9701 $out =
'ErrorHTMLExternalLinksNotAllowed (Example: '.$firstexturl.($secondexturl ?
' '.$secondexturl :
'').
')';
9730function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
9732 if (is_null($stringtoencode)) {
9736 $newstring = $stringtoencode;
9738 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
9739 if ($removelasteolbr) {
9740 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
9742 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
9743 $newstring = strtr($newstring, array(
'&' =>
'__PROTECTand__',
'<' =>
'__PROTECTlt__',
'>' =>
'__PROTECTgt__',
'"' =>
'__PROTECTdquot__'));
9745 $newstring = strtr($newstring, array(
'__PROTECTand__' =>
'&',
'__PROTECTlt__' =>
'<',
'__PROTECTgt__' =>
'>',
'__PROTECTdquot__' =>
'"'));
9747 if ($removelasteolbr) {
9748 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
9767 $ret = preg_replace(
'/' .
"\r\n" .
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
9768 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\r\n" .
'/i',
"\r\n", $ret);
9769 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\n" .
'/i',
"\n", $ret);
9770 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
9782 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
9783 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|' .
"\n" .
'|' .
"\r" .
')+$/i',
"", $ret);
9799 if ($keepsomeentities) {
9800 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
9802 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string)
$c);
9803 if ($keepsomeentities) {
9804 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
9820function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
9822 return htmlentities($string, $flags, $encoding, $double_encode);
9841 for ($scursor = 0; $scursor < $len; $scursor++) {
9842 $ordchar = ord($s[$scursor]);
9844 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
9847 } elseif ($ordchar > 126 && $ordchar < 160) {
9851 $out .= $s[$scursor];
9873 $arraystring = explode(
"\n", $s);
9874 $nb = count($arraystring);
9891 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9893 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9896 $text = strtr($text, $repTable);
9897 if ($charset ==
'UTF-8') {
9898 $pattern =
'/(<br[^>]*>)/Uu';
9901 $pattern =
'/(<br[^>]*>)/U';
9903 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9905 $nblines = (int) floor((count($a) + 1) / 2);
9908 foreach ($a as $line) {
9911 $line_dec = html_entity_decode($line);
9913 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
9914 $nblines += substr_count($line_dec,
'\n');
9934 if (is_null($msg)) {
9939 if (preg_match(
'/<(html|link|script)/i', $msg)) {
9941 } elseif (preg_match(
'/<body/i', $msg)) {
9943 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9945 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9947 } elseif (preg_match(
'/<br/i', $msg)) {
9953 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
9954 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
9956 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9958 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9960 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
9962 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
9964 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
9966 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
9968 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
9970 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
9972 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
9975 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
9977 } elseif (preg_match(
'/&#x[a-f0-9][a-f0-9];/i', $msg)) {
9999function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
10001 if (!empty($invert)) {
10009 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
10024 return $text1.$text2;
10040function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude =
null,
$object =
null, $include =
null)
10042 global $db, $conf,
$mysoc, $user, $extrafields;
10044 $substitutionarray = array();
10046 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
10050 $emailsendersignature = $user->signature;
10051 $usersignature = $user->signature;
10052 $substitutionarray = array_merge($substitutionarray, array(
10053 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
10057 if (is_object($user) && ($user instanceof
User)) {
10058 $substitutionarray = array_merge($substitutionarray, array(
10059 '__USER_ID__' => (
string) $user->id,
10060 '__USER_LOGIN__' => (
string) $user->login,
10061 '__USER_EMAIL__' => (
string) $user->email,
10062 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
10063 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10064 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10065 '__USER_FAX__' => (
string) $user->office_fax,
10066 '__USER_LASTNAME__' => (
string) $user->lastname,
10067 '__USER_FIRSTNAME__' => (
string) $user->firstname,
10068 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
10069 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
10070 '__USER_JOB__' => (string) $user->job,
10072 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
10076 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object(
$mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
10077 $substitutionarray = array_merge($substitutionarray, array(
10078 '__MYCOMPANY_NAME__' =>
$mysoc->name,
10079 '__MYCOMPANY_EMAIL__' =>
$mysoc->email,
10080 '__MYCOMPANY_URL__' =>
$mysoc->url,
10082 '__MYCOMPANY_PHONEMOBILE__' =>
dol_print_phone(
$mysoc->phone_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10084 '__MYCOMPANY_PROFID1__' =>
$mysoc->idprof1,
10085 '__MYCOMPANY_PROFID2__' =>
$mysoc->idprof2,
10086 '__MYCOMPANY_PROFID3__' =>
$mysoc->idprof3,
10087 '__MYCOMPANY_PROFID4__' =>
$mysoc->idprof4,
10088 '__MYCOMPANY_PROFID5__' =>
$mysoc->idprof5,
10089 '__MYCOMPANY_PROFID6__' =>
$mysoc->idprof6,
10090 '__MYCOMPANY_PROFID7__' =>
$mysoc->idprof7,
10091 '__MYCOMPANY_PROFID8__' =>
$mysoc->idprof8,
10092 '__MYCOMPANY_PROFID9__' =>
$mysoc->idprof9,
10093 '__MYCOMPANY_PROFID10__' =>
$mysoc->idprof10,
10094 '__MYCOMPANY_CAPITAL__' =>
$mysoc->capital,
10095 '__MYCOMPANY_FULLADDRESS__' => (method_exists(
$mysoc,
'getFullAddress') ?
$mysoc->getFullAddress(1,
', ') :
''),
10097 '__MYCOMPANY_VATNUMBER__' =>
$mysoc->tva_intra,
10098 '__MYCOMPANY_ZIP__' =>
$mysoc->zip,
10099 '__MYCOMPANY_TOWN__' =>
$mysoc->town,
10100 '__MYCOMPANY_STATE__' =>
$mysoc->state,
10101 '__MYCOMPANY_COUNTRY__' =>
$mysoc->country,
10102 '__MYCOMPANY_COUNTRY_ID__' =>
$mysoc->country_id,
10103 '__MYCOMPANY_COUNTRY_CODE__' =>
$mysoc->country_code,
10104 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
10108 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
10110 $substitutionarray[
'__ID__'] =
'__ID__';
10111 $substitutionarray[
'__REF__'] =
'__REF__';
10112 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
10113 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
10114 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
10115 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
10116 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
10117 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
10118 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
10121 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
10122 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
10123 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
10124 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
10125 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
10126 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
10128 $substitutionarray[
'__THIRDPARTY_URL__'] =
'__THIRDPARTY_URL__';
10130 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
10131 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
10132 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
10133 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
10134 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
10135 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
10136 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
10137 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
10138 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
10139 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
10140 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
10141 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
10142 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
10143 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
10144 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
10145 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
10146 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
10147 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
10148 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
10150 if (
isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
10151 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
10152 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
10153 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
10154 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
10155 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
10160 if (
isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
10161 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
10162 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
10163 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
10164 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
10165 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
10166 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
10167 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
10168 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
10169 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
10172 if (
isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
10173 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
10174 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
10175 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
10177 if (
isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
10178 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
10179 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
10180 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
10184 if (
isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
10185 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
10186 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
10187 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
10188 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
10190 if (
isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
10191 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
10193 if (
isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
10194 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
10196 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
10197 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
10198 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
10199 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
10200 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
10201 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
10202 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
10204 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
10205 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
10206 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
10207 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
10208 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
10211 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
10212 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
10213 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
10216 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
10217 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
10220 '@phan-var-force Adherent|Delivery $object';
10222 $substitutionarray[
'__ID__'] =
$object->id;
10223 $substitutionarray[
'__REF__'] =
$object->ref;
10224 $substitutionarray[
'__NEWREF__'] =
$object->newref;
10226 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10227 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10228 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
10229 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
10231 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
10232 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
10233 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
10236 $date_delivery =
null;
10237 if (property_exists(
$object,
'date_delivery')) {
10238 $date_delivery =
$object->date_delivery;
10239 } elseif (property_exists(
$object,
'delivery_date')) {
10240 $date_delivery =
$object->delivery_date;
10242 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10243 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
10244 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
10245 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
10246 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
10247 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
10248 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
10249 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
10250 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
10253 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10254 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10256 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10257 $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 :
'')) :
'');
10261 '@phan-var-force Adherent $object';
10265 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
10266 if (method_exists(
$object,
'getCivilityLabel')) {
10267 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
10269 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
10270 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
10271 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
10272 if (method_exists(
$object,
'getFullName')) {
10273 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
10275 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
10276 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
10277 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
10278 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
10279 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
10280 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
10281 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
10282 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
10283 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
10284 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
10285 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
10289 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
10290 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
10292 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
10293 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
10294 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
10295 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
10296 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
10297 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
10298 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
10299 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
10300 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
10301 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
10302 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
10307 '@phan-var-force Societe $object';
10308 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->id ??
'';
10309 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->name ??
'';
10310 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->name_alias ??
'';
10311 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->code_client ??
'';
10312 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->code_fournisseur ??
'';
10313 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->email ??
'';
10314 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->email ??
'');
10315 $substitutionarray[
'__THIRDPARTY_URL__'] =
$object->url ??
'';
10316 $substitutionarray[
'__THIRDPARTY_URL_URLENCODED__'] = urlencode(
$object->url ??
'');
10319 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->address ??
'';
10320 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->zip ??
'';
10321 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->town ??
'';
10322 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->state ??
'';
10323 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->country_id > 0 ?:
'');
10324 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->country_code ??
'';
10325 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->idprof1 ??
'';
10326 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->idprof2 ??
'';
10327 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->idprof3 ??
'';
10328 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->idprof4 ??
'';
10329 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->idprof5 ??
'';
10330 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->idprof6 ??
'';
10331 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->tva_intra ??
'';
10334 } elseif (is_object(
$object) && is_object(
$object->thirdparty)) {
10335 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->thirdparty->id ??
'';
10336 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->thirdparty->name ??
'';
10337 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->thirdparty->name_alias ??
'';
10338 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->thirdparty->code_client ??
'';
10339 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->thirdparty->code_fournisseur ??
'';
10340 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->thirdparty->email ??
'';
10341 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->thirdparty->email ??
'');
10344 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->thirdparty->address ??
'';
10345 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->thirdparty->zip ??
'';
10346 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->thirdparty->town ??
'';
10347 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->thirdparty->state ??
'';
10348 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->thirdparty->country_id > 0 ?:
'');
10349 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->thirdparty->country_code ??
'';
10350 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->thirdparty->idprof1 ??
'';
10351 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->thirdparty->idprof2 ??
'';
10352 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->thirdparty->idprof3 ??
'';
10353 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->thirdparty->idprof4 ??
'';
10354 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->thirdparty->idprof5 ??
'';
10355 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->thirdparty->idprof6 ??
'';
10356 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->thirdparty->tva_intra ??
'';
10361 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
10362 '@phan-var-force RecruitmentCandidature $object';
10364 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
10365 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10366 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10368 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
10369 '@phan-var-force ConferenceOrBoothAttendee $object';
10371 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
10372 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10373 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10377 '@phan-var-force Project $object';
10379 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
10380 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
10381 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
10382 } elseif (is_object(
$object)) {
10384 if (!empty(
$object->project)) {
10387 if (!is_null($project) && is_object($project)) {
10388 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
10389 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
10390 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
10395 $project_id =
$object->fk_project;
10396 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
10397 $project_id =
$object->fk_project;
10399 if ($project_id > 0) {
10401 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10402 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10403 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10409 '@phan-var-force Facture $object';
10411 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
10414 '@phan-var-force Expedition $object';
10416 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
10417 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
10418 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
10421 '@phan-var-force Reception $object';
10423 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
10424 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
10428 '@phan-var-force Contrat $object';
10430 $dateplannedstart =
'';
10431 $datenextexpiration =
'';
10432 foreach (
$object->lines as $line) {
10433 if ($line->date_start > $dateplannedstart) {
10434 $dateplannedstart = $line->date_start;
10436 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
10437 $datenextexpiration = $line->date_end;
10440 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
10441 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
10442 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
10444 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
10445 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
10446 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
10450 '@phan-var-force Ticket $object';
10452 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
10453 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
10454 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
10455 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
10456 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
10457 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
10458 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
10459 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
10460 $userstat =
new User($db);
10461 if (
$object->fk_user_assign > 0) {
10462 $userstat->fetch(
$object->fk_user_assign);
10463 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10466 if (
$object->fk_user_create > 0) {
10467 $userstat->fetch(
$object->fk_user_create);
10468 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10474 if (!is_object($extrafields)) {
10477 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
10479 if (
$object->fetch_optionals() > 0) {
10480 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
10481 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
10482 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
10483 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day');
10484 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day',
'tzserver', $outputlangs);
10485 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'dayrfc');
10486 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
10487 $datetime =
$object->array_options[
'options_' . $key];
10488 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
10489 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
10490 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
10491 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
10492 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
10493 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_phone(
$object->array_options[
'options_' . $key]);
10494 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
10495 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
$object->array_options[
'options_' . $key];
10496 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATED__'] =
price(
$object->array_options[
'options_' . $key]);
10497 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATTED__'] =
price(
$object->array_options[
'options_' . $key]);
10498 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
10499 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10507 if (empty($substitutionarray[
'__REF__'])) {
10511 require_once DOL_DOCUMENT_ROOT .
'/core/lib/payments.lib.php';
10512 $outputlangs->loadLangs(array(
'paypal',
'other'));
10515 $typeforonlinepayment =
'free';
10517 $typeforonlinepayment =
'order';
10520 $typeforonlinepayment =
'invoice';
10523 $typeforonlinepayment =
'member';
10524 if (!empty(
$object->last_subscription_amount)) {
10525 $amounttouse =
$object->last_subscription_amount;
10529 $typeforonlinepayment =
'contract';
10532 $typeforonlinepayment =
'ficheinter';
10535 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], (
float) $amounttouse);
10536 $paymenturl = $url;
10540 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
10541 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
10545 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
10550 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10552 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
10555 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10557 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
10560 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10562 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
10565 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
10567 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
10570 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
10572 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
10575 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10577 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
10581 '@phan-var-force Propal $object';
10583 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/comm/propal/card.php?id=" .
$object->id;
10584 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10585 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
10588 '@phan-var-force Commande $object';
10590 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT .
"/commande/card.php?id=" .
$object->id;
10593 '@phan-var-force Facture $object';
10595 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/compta/facture/card.php?id=" .
$object->id;
10598 '@phan-var-force Contrat $object';
10600 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT .
"/contrat/card.php?id=" .
$object->id;
10601 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10602 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
10605 '@phan-var-force Fichinter $object';
10607 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT .
"/fichinter/card.php?id=" .
$object->id;
10608 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10609 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
10611 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
10612 '@phan-var-force SupplierProposal $object';
10614 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/supplier_proposal/card.php?id=" .
$object->id;
10616 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
10617 '@phan-var-force FactureFournisseur $object';
10619 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/fourn/facture/card.php?id=" .
$object->id;
10621 if (is_object(
$object) &&
$object->element ==
'payment_supplier') {
10622 '@phan-var-force PaiementFourn $object';
10625 $liste_factures = [];
10628 $sql =
'SELECT f.ref,f.multicurrency_code as f_mccode, pf.*
10629 FROM '.MAIN_DB_PREFIX.
'paiementfourn_facturefourn as pf
10630 JOIN '.MAIN_DB_PREFIX.
'facture_fourn as f ON pf.fk_facturefourn = f.rowid
10631 WHERE pf.fk_paiementfourn = '.((int)
$object->id);
10633 $resql = $db->query($sql);
10635 while ($objp = $db->fetch_object($resql)) {
10636 $liste_factures[] =
' - '.$outputlangs->trans(
'Invoice').
' '. $objp->ref.
' '.$outputlangs->trans(
'AmountPayed').
' '.
price($objp->multicurrency_amount, 0, $outputlangs, 0, -1, -1, $objp->multicurrency_code);
10639 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_LIST__'] = implode(
"\n", $liste_factures);
10641 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_TOTAL__'] =
price(
$object->multicurrency_amount, 0, $outputlangs, 0, -1, -1,
$object->multicurrency_code ?
$object->multicurrency_code : $conf->currency);
10644 '@phan-var-force Expedition $object';
10646 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT .
"/expedition/card.php?id=" .
$object->id;
10651 '@phan-var-force ActionComm $object';
10653 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
10654 $substitutionarray[
'__EVENT_DESCRIPTION__'] =
$object->note;
10655 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action" .
$object->type_code);
10656 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date(
$object->datep,
'day',
'auto', $outputlangs);
10657 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
10658 $substitutionarray[
'__EVENT_DATE_TZUSER__'] =
dol_print_date(
$object->datep,
'day',
'tzuserrel', $outputlangs);
10659 $substitutionarray[
'__EVENT_TIME_TZUSER__'] =
dol_print_date(
$object->datep,
'hour',
'tzuserrel', $outputlangs);
10664 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
10665 '@phan-var-force Facture|FactureRec $object';
10667 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functionsnumtoword.lib.php';
10670 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
10672 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
10674 $already_payed_all = 0;
10679 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
10681 $substitutionarray[
'__AMOUNT_EXCL_TAX_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ht, $outputlangs, $conf->currency,
true) :
'';
10683 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
10685 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
10687 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
10689 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10693 $mysocuselocaltax1 =
false;
10694 $mysocuselocaltax2 =
false;
10696 $tmparray =
$mysoc->useLocalTax(-1);
10697 $mysocuselocaltax1 = $tmparray[1];
10698 $mysocuselocaltax2 = $tmparray[2];
10702 if ($onlykey != 2 || $mysocuselocaltax1) {
10703 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
10705 if ($onlykey != 2 || $mysocuselocaltax2) {
10706 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
10710 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10711 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10712 $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) :
'';
10713 $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)) :
'';
10714 if ($onlykey != 2 || $mysocuselocaltax1) {
10715 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10717 if ($onlykey != 2 || $mysocuselocaltax2) {
10718 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10721 if ($onlykey != 2) {
10722 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
10723 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
10724 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
10725 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
10726 if ($mysocuselocaltax1) {
10727 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
10729 if (
$mysoc->useLocalTax2) {
10730 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
10734 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
10735 $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) :
'';
10736 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
10737 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
10738 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
10742 if ($onlykey != 2) {
10743 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
10744 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
10745 $substitutionarray[
'__TOTAL_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10750 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
10751 include_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
10761 $daytext = $outputlangs->trans(
'Day' . $tmp[
'wday']);
10763 $substitutionarray = array_merge($substitutionarray, array(
10764 '__NOW_TMS__' => (
string) $now,
10765 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
10766 '__DAY__' => (
string) $tmp[
'mday'],
10767 '__DAY_TEXT__' => $daytext,
10768 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
10769 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
10770 '__MONTH__' => (
string) $tmp[
'mon'],
10771 '__MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp[
'mon'])),
10772 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp[
'mon'])),
10773 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp[
'mon'])),
10774 '__YEAR__' => (
string) $tmp[
'year'],
10775 '__YEAR_PREVIOUS_MONTH__' => (
string) $tmp3[
'year'],
10776 '__YEAR_NEXT_MONTH__' => (
string) $tmp5[
'year'],
10777 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
10778 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
10779 '__PREVIOUS_MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp3[
'month'])),
10780 '__PREVIOUS_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp3[
'month'])),
10781 '__PREVIOUS_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp3[
'month'])),
10782 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
10783 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
10784 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
10785 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp5[
'month'])),
10786 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp5[
'month'])),
10787 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp5[
'month'])),
10788 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
10793 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
10795 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
10796 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
10797 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
10798 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey') .
' (load also language file before)';
10799 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
10804 return $substitutionarray;
10823function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
10825 global $db, $langs;
10827 if (!is_array($substitutionarray)) {
10828 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
10831 if (empty($outputlangs)) {
10832 $outputlangs = $langs;
10842 if (is_object($outputlangs)) {
10844 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
10846 $tmp = explode(
'|', $reg[1]);
10847 if (!empty($tmp[1])) {
10848 $outputlangs->load($tmp[1]);
10851 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
10853 if (empty($converttextinhtmlifnecessary)) {
10855 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10857 if (! $msgishtml) {
10861 if ($valueishtml) {
10869 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $value, $text);
10877 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
10878 $originalkeyfound = $reg[1];
10879 $keyfound = preg_replace(
'/\|urlencode$/',
'', $originalkeyfound);
10882 $value =
'*****forbidden*****';
10886 if (preg_match(
'/\|urlencode$/', $originalkeyfound)) {
10887 $value = urlencode($value);
10891 if (empty($converttextinhtmlifnecessary)) {
10893 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10895 if (! $msgishtml) {
10898 if ($valueishtml) {
10906 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $value, $text);
10911 foreach ($substitutionarray as $key => $value) {
10912 if (!isset($value)) {
10916 if (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN') && ($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__')) {
10920 if (empty($converttextinhtmlifnecessary)) {
10921 $text = str_replace((
string) $key, (
string) $value, $text);
10923 if (! $msgishtml) {
10926 if ($valueishtml) {
10933 $text = str_replace((
string) $key, (
string) $value, $text);
10949 $memory_object_list = array();
10950 foreach ($substitutionarray as $key => $value) {
10951 $lazy_load_arr = array();
10952 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
10953 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
10954 $key_to_substitute = $lazy_load_arr[1];
10955 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
10956 $param_arr = explode(
':', (
string) $value);
10958 if (count($param_arr) == 4) {
10959 $path = $param_arr[0];
10960 $class = $param_arr[1];
10961 $method = $param_arr[2];
10962 $id = (int) $param_arr[3];
10965 if (!isset($memory_object_list[$class])) {
10967 require_once DOL_DOCUMENT_ROOT . $path;
10968 if (class_exists($class)) {
10969 $memory_object_list[$class] = array(
10977 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
10978 if (method_exists($class, $method)) {
10979 if (!isset($memory_object_list[$class][
'list'][
$id])) {
10980 $tmpobj =
new $class($db);
10982 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
10983 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
10986 $tmpobj = $memory_object_list[$class][
'list'][
$id];
10988 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
10991 $text = str_replace((
string) $key_to_substitute, (
string) $valuetouseforsubstitution, $text);
11017 global $conf, $user;
11019 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
11024 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
11026 foreach ($dirsubstitutions as $reldir) {
11034 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
11035 foreach ($substitfiles as $substitfile) {
11037 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
11040 dol_syslog(
"Library " . $substitfile[
'name'] .
" found into " . $dir);
11042 require_once $dir . $substitfile[
'name'];
11044 $function_name = $module .
"_" . $callfunc;
11045 if (function_exists($function_name)) {
11046 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
11054 foreach ($substitutionarray as $key => $value) {
11055 $tags .=
'{' . $key .
'} => ' . $value .
"\n";
11057 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
11070function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
11072 print
get_date_range($date_start, $date_end, $format, $outputlangs);
11085function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
11091 if (!is_object($outputlangs)) {
11092 $outputlangs = $langs;
11095 if ($date_start && $date_end) {
11096 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format, false, $outputlangs),
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11098 if ($date_start && !$date_end) {
11099 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11101 if (!$date_start && $date_end) {
11102 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11120 if ($nameorder < 0) {
11123 if ($nameorder == 1) {
11124 $ret .= $firstname;
11125 if ($firstname && $lastname) {
11129 } elseif ($nameorder == 2 || $nameorder == 3) {
11130 $ret .= $firstname;
11131 if (empty($ret) && $nameorder == 3) {
11136 if (empty($ret) && $nameorder == 5) {
11137 $ret .= $firstname;
11139 if ($nameorder == 0) {
11140 if ($firstname && $lastname) {
11143 $ret .= $firstname;
11162function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
11165 if (!is_array($mesgs)) {
11166 $mesgs = trim((
string) $mesgs);
11169 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
11173 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11175 $_SESSION[
'dol_events'][$style][] = $mesgs;
11180 foreach ($mesgs as $mesg) {
11181 $mesg = trim((
string) $mesg);
11183 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
11187 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11189 $_SESSION[
'dol_events'][$style][] = $mesg;
11209function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
11211 if (empty($mesg) && empty($mesgs)) {
11219 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE" . $messagekey])) {
11220 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
11221 dol_print_error(
null,
'Bad parameter style=' . $style .
' for setEventMessages');
11223 if (empty($mesgs)) {
11226 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
11247 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
11248 if (empty($disabledoutputofmessages)) {
11251 unset($_SESSION[
'dol_events'][
'mesgs']);
11254 if (isset($_SESSION[
'dol_events'][
'errors'])) {
11255 if (empty($disabledoutputofmessages)) {
11258 unset($_SESSION[
'dol_events'][
'errors']);
11262 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
11263 if (empty($disabledoutputofmessages)) {
11266 unset($_SESSION[
'dol_events'][
'warnings']);
11284function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
11286 global $conf, $langs;
11291 $divstart = $divend =
'';
11294 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
11295 $divstart =
'<div class="' . $style .
' clearboth">';
11296 $divend =
'</div>';
11299 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
11300 $langs->load(
"errors");
11302 if (is_array($mesgarray) && count($mesgarray)) {
11303 foreach ($mesgarray as $message) {
11305 $out .= $langs->trans($message);
11306 if ($ret < count($mesgarray)) {
11313 $out .= $langs->trans($mesgstring);
11319 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
11320 $return =
'<script nonce="' .
getNonce() .
'">
11321 $(document).ready(function() {
11322 /* jnotify(message, preset of message type, keepmessage) */
11323 $.jnotify("' .
dol_escape_js($out) .
'", "' . ($style ==
"ok" ? 3000 : $style) .
'", ' . ($style ==
"ok" ?
"false" :
"true") .
',{ remove: function (){} } );
11363function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
11365 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
11371 if (is_array($mesgarray)) {
11372 foreach ($mesgarray as $val) {
11373 if ($val && preg_match(
'/class="error"/i', $val)) {
11377 if ($val && preg_match(
'/class="warning"/i', $val)) {
11382 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
11384 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
11387 if ($style ==
'error' || $style ==
'errors') {
11390 if ($style ==
'warning' || $style ==
'warnings') {
11394 if ($iserror || $iswarning) {
11396 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
11397 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
11398 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
11400 if (is_array($mesgarray)) {
11401 $newmesgarray = array();
11402 foreach ($mesgarray as $val) {
11403 if (is_string($val)) {
11404 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
11405 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
11406 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
11407 $newmesgarray[] = $tmpmesgstring;
11409 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
11412 $mesgarray = $newmesgarray;
11414 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
11456function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
11459 $order = strtolower($order);
11461 if (is_array($array)) {
11462 $sizearray = count($array);
11463 if ($sizearray > 0) {
11466 foreach (array_keys($array) as $key) {
11467 $tmpmultikey = explode(
',', $index);
11468 $newindex = $tmpmultikey[0];
11469 if (is_object($array[$key])) {
11470 $temp[$key] = empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex;
11472 if (!empty($tmpmultikey[1])) {
11473 $newindex = $tmpmultikey[1];
11474 $temp[$key] .=
'__' . (empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex);
11478 $temp[$key] = empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex];
11480 if (!empty($tmpmultikey[1])) {
11481 $newindex = $tmpmultikey[1];
11483 $temp[$key] .=
'__' . (empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex]);
11486 if ($natsort == -1) {
11487 $temp[$key] =
'___' . $temp[$key];
11490 if (empty($natsort) || $natsort == -1) {
11491 if ($order ==
'asc') {
11497 if ($case_sensitive) {
11500 natcasesort($temp);
11502 if ($order !=
'asc') {
11503 $temp = array_reverse($temp,
true);
11509 foreach (array_keys($temp) as $key) {
11510 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
11529 $str = (string) $str;
11532 $strLength = strlen($str);
11533 for ($i = 0; $i < $strLength; $i++) {
11534 if (ord($str[$i]) < 0x80) {
11536 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
11538 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
11540 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
11542 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
11544 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
11549 for ($j = 0; $j < $n; $j++) {
11550 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
11571 return preg_match(
'//u', $str) ? true :
false;
11583 if (function_exists(
'mb_check_encoding')) {
11585 if (!mb_check_encoding($str,
'ASCII')) {
11589 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
11607 $tmp = ini_get(
"unicode.filesystem_encoding");
11608 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
11609 $tmp =
'iso-8859-1';
11618 if ($tmp ==
'iso-8859-1') {
11619 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
11640function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
11650 if ($useCache && isset($conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
11651 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
11654 dol_syslog(
'dol_getIdFromCode (value for field ' . $fieldid .
' from key ' . $key .
' not found into cache)', LOG_DEBUG);
11656 $sql =
"SELECT " . $fieldid .
" as valuetoget";
11657 $sql .=
" FROM " . MAIN_DB_PREFIX . $tablename;
11658 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
11659 $sql .=
" WHERE " . $fieldkey .
" = " . ((int) $key);
11661 $sql .=
" WHERE " . $fieldkey .
" = '" . $db->escape($key) .
"'";
11663 if (!empty($entityfilter)) {
11664 $sql .=
" AND entity IN (" .
getEntity($tablename) .
")";
11670 $resql = $db->query($sql);
11672 $obj = $db->fetch_object($resql);
11675 $valuetoget = $obj->valuetoget;
11676 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
11678 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
11682 return $valuetoget;
11702 $regextext = preg_replace(
'#^/\^?#',
'', (
string) $regextext);
11703 $regextext = preg_replace(
'#\$?/[imsxuADSUXJ]*$#',
'', $regextext);
11705 if ($matchrule == 1) {
11706 if ($var ==
'mainmenu') {
11708 return (preg_match(
'/^' . $regextext .
'/', $mainmenu));
11709 } elseif ($var ==
'leftmenu') {
11711 return (preg_match(
'/^' . $regextext .
'/', $leftmenu));
11713 return 'This variable is not accessible with dol_eval';
11716 return 'This value '.$matchrule.
' for param $matchrule is not yet implemented';
11730function verifCond($strToEvaluate, $onlysimplestring =
'1')
11734 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
11737 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
11739 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
11759function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
11761 if ($returnvalue != 1) {
11762 dol_syslog(
"Use of dol_eval with parameter returnvalue = 0 is now forbidden. Please fix this", LOG_ERR);
11785 $db, $langs, $user, $website, $websitepage,
11786 $action, $mainmenu, $leftmenu,
11795 defined(
'T_COALESCE_EQUAL') || define(
'T_COALESCE_EQUAL', PHP_INT_MAX);
11796 defined(
'T_FN') || define(
'T_FN', PHP_INT_MAX);
11799 defined(
'T_ATTRIBUTE') || define(
'T_ATTRIBUTE', PHP_INT_MAX);
11800 defined(
'T_MATCH') || define(
'T_MATCH', PHP_INT_MAX);
11801 defined(
'T_NAME_FULLY_QUALIFIED') || define(
'T_NAME_FULLY_QUALIFIED', PHP_INT_MAX);
11802 defined(
'T_NAME_QUALIFIED') || define(
'T_NAME_QUALIFIED', PHP_INT_MAX);
11803 defined(
'T_NAME_RELATIVE') || define(
'T_NAME_RELATIVE', PHP_INT_MAX);
11806 defined(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11807 defined(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11808 defined(
'T_ENUM') || define(
'T_ENUM', PHP_INT_MAX);
11809 defined(
'T_READONLY') || define(
'T_READONLY', PHP_INT_MAX);
11812 defined(
'T_PRIVATE_SET') || define(
'T_PRIVATE_SET', PHP_INT_MAX);
11813 defined(
'T_PROTECTED_SET') || define(
'T_PROTECTED_SET', PHP_INT_MAX);
11814 defined(
'T_PUBLIC_SET') || define(
'T_PUBLIC_SET', PHP_INT_MAX);
11816 $prohibited_token_ids = [
11823 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
11824 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
11874 'T_OPEN_TAG_WITH_ECHO',
11908 $prohibited_variables = [
11920 $prohibited_functions = [
11923 'override_function',
11925 'session_create_id',
11926 'session_regenerate_id',
11928 'call_user_func_array',
11937 'dol_eval_standard',
11945 'mb_eregi_replace',
11946 'dol_compress_dir',
11950 'dol_delete_dir_recursive',
11952 'archiveOrBackupFile',
11954 'file_put_contents',
11968 'filter_input_array',
11972 $prohibited_token_arrangements = [
11977 ' T_CONSTANT_ENCAPSED_STRING ( ',
11981 $tokens = token_get_all(
"<?php return {$s};", TOKEN_PARSE);
11983 $tokens_arrangement =
' ';
11985 for ($i = 2,
$c = count($tokens) - 1; $i <
$c; ++$i) {
11986 if (is_array($tokens[$i])) {
11987 $token_id = $tokens[$i][0];
11988 $token_value = $tokens[$i][1];
11989 $token_name = token_name($tokens[$i][0]);
11991 $token_id = $tokens[$i];
11992 $token_value = $tokens[$i];
11993 $token_name = $tokens[$i];
11997 if (T_WHITESPACE === $token_id) {
12002 $tokens_arrangement .=
"{$token_name} ";
12006 T_VARIABLE === $token_id
12007 && in_array($token_value, $prohibited_variables,
true)
12009 return "« {$token_value} » is prohibited in « {$s} »";
12014 T_STRING === $token_id
12015 && in_array($token_value, $prohibited_functions,
true)
12017 return "« {$token_value} » is prohibited in « {$s} »";
12022 $maxi = count($prohibited_token_ids);
12023 for ($i = 0; $i < $maxi; ++$i) {
12024 if (
false !== strpos($tokens_arrangement,
" {$prohibited_token_ids[$i]} ")) {
12025 return "« {$prohibited_token_ids[$i]} » is prohibited in « {$s} »";
12030 $maxi = count($prohibited_token_arrangements);
12031 for ($i = 0; $i < $maxi; ++$i) {
12032 if (
false !== strpos($tokens_arrangement, $prohibited_token_arrangements[$i])) {
12033 return "« {$prohibited_token_arrangements[$i]} » is prohibited in « {$s} »";
12039 return @eval(
"return {$s};") ??
'';
12040 }
catch (Throwable $ex) {
12041 return "Exception during evaluation: " . $s .
" - " . $ex->getMessage();
12064 global $db, $langs, $user, $website, $websitepage;
12065 global $action, $mainmenu, $leftmenu;
12067 global $objectoffield;
12075 $isObBufferActive =
false;
12076 if ($onlysimplestring ==
'0') {
12077 $onlysimplestring =
'1';
12079 if (!in_array($onlysimplestring, array(
'1',
'2'))) {
12080 return "Bad call of dol_eval. Parameter onlysimplestring must be '1' or '2'.";
12082 if (!is_scalar($s)) {
12083 return "Bad call of dol_eval. First parameter must be a string, found ".var_export($s,
true);
12087 global $dolibarr_main_restrict_eval_methods;
12090 if (!isset($dolibarr_main_restrict_eval_methods)) {
12091 $dolibarr_main_restrict_eval_methods =
'getDolGlobalString, getDolGlobalInt, getDolCurrency, getDolEntity, getDolDBType, fetchNoCompute, hasRight, isAdmin, isModEnabled, isStringVarMatching, abs, min, max, round, dol_now, preg_match';
12094 $dolibarr_main_restrict_eval_methods_array = explode(
',', str_replace(
" ",
"", $dolibarr_main_restrict_eval_methods));
12102 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
12103 if ($onlysimplestring ==
'2') {
12104 $specialcharsallowed .=
'<[]';
12106 global $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12107 if (!empty($dolibarr_main_allow_unsecured_special_chars_in_dol_eval)) {
12108 $specialcharsallowed .= (string) $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12110 if (preg_match(
'/[^a-z0-9\s' . preg_quote($specialcharsallowed,
'/') .
']/i', $s)) {
12111 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): ' . $s;
12123 if (strpos($s,
'/*') !==
false || strpos($s,
'//') !==
false) {
12124 return 'Bad string syntax to evaluate (The comment string /* and // are not allowed): ' . $s;
12128 $tmps = str_replace(
' ? ',
'__XXX__', $s);
12129 if (strpos($tmps,
'?') !==
false) {
12130 return 'Bad string syntax to evaluate (The char ? can be used only with a space before and after): ' . $s;
12134 if (preg_match(
'/<=?[^\s]/', $s)) {
12135 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found a < or <= without space after): ' . $s;
12139 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
12140 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;
12143 if (empty($dolibarr_main_restrict_eval_methods)) {
12149 while ($scheck && $savescheck != $scheck) {
12150 $savescheck = $scheck;
12151 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12152 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12153 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
12154 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
12155 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
12156 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12157 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12158 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
12159 $scheck = preg_replace(
'/\s!\(/',
' __NOTANDPARENTHESIS__', $scheck);
12160 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
12165 if (strpos($scheck,
'(') !==
false) {
12166 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found call of a function or method without using the direct name of the function): ' . $s;
12170 if (strpos($s,
'`') !==
false) {
12171 return 'Bad string syntax to evaluate (backtick char is forbidden): ' . $s;
12176 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
12177 return 'Bad string syntax to evaluate (dot char is forbidden if not strictly between 2 numbers): ' . $s;
12185 while ($scheck && $savescheck != $scheck) {
12186 $savescheck = $scheck;
12187 $scheck = preg_replace(
'/\$conf->[a-z\_]+->enabled/',
'__VARCONFENABLED__', $scheck);
12188 $scheck = preg_replace(
'/\$user->id/',
'__VARUSERID__', $scheck);
12189 $scheck = preg_replace(
'/\$user->hasRight/',
'__VARUSERHASRIGHT__', $scheck);
12190 $scheck = preg_replace(
'/\$user->rights/',
'__VARUSERHASRIGHT__', $scheck);
12191 $scheck = preg_replace(
'/\$user->admin/',
'__VARUSERISADMIN__', $scheck);
12192 $scheck = preg_replace(
'/\(\$db\)/',
'__VARDB__', $scheck);
12193 $scheck = preg_replace(
'/\$langs/',
'__VARLANGSTRANS__', $scheck);
12194 $scheck = preg_replace(
'/\$mysoc/',
'__VARMYSOC__', $scheck);
12195 $scheck = preg_replace(
'/\$action/',
'__VARACTION__', $scheck);
12196 $scheck = preg_replace(
'/\$mainmenu/',
'__VARMAINMENU__', $scheck);
12197 $scheck = preg_replace(
'/\$leftmenu/',
'__VARLEFTMENU__', $scheck);
12198 $scheck = preg_replace(
'/\$websitepage/',
'__VARWEBSITEPAGE__', $scheck);
12199 $scheck = preg_replace(
'/\$website/',
'__VARWEBSITE__', $scheck);
12200 $scheck = preg_replace(
'/\$objectoffield/',
'__VAROBJECTOFFIELD__', $scheck);
12201 $scheck = preg_replace(
'/\$object/',
'__VAROBJECT__', $scheck);
12202 $scheck = preg_replace(
'/\$var/',
'__VARVAR__', $scheck);
12205 $scheck = preg_replace(
'/\$soc->canvas/',
'__VARSOCCANVAS__', $scheck);
12206 $scheck = preg_replace(
'/\$obj->canvas/',
'__VAROBJCANVAS__', $scheck);
12209 if (strpos($scheck,
'$') !==
false) {
12210 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);
12211 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;
12216 $forbiddenphpstrings = array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_GLOBAL',
'_POST',
'_REQUEST',
'ReflectionFunction',
'SplFileObject',
'SplTempFileObject');
12218 if (empty($dolibarr_main_restrict_eval_methods)) {
12222 $forbiddenphpfunctions = array();
12223 $forbiddenphpmethods = array();
12225 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
12226 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
12227 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
12229 $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"));
12230 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
12231 $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"));
12232 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
12233 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
12235 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
12237 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
12238 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
12239 $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"));
12240 $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", ));
12241 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"putenv",
"dl",
"apache_child_terminate",
"apache_setenv"));
12242 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"posix_kill",
"posix_setuid",
"posix_setgid"));
12243 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"executeCLI",
"verifCond",
"GETPOST",
"dolEncrypt",
"dolDecrypt"));
12244 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
12245 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
12246 $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"));
12247 $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"));
12248 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
12251 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64" .
"_" .
"decode",
"rawurl" .
"decode",
"url" .
"decode",
"str" .
"_rot13",
"hex" .
"2bin",
"printf",
"sprintf"));
12252 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concat",
"dol_concatdesc"));
12261 $forbiddenphpmethods = array_merge($forbiddenphpmethods, array(
'invoke',
'invokeArgs'));
12269 $forbiddenphpregex =
'global\s*\$';
12270 $forbiddenphpregex .=
'|';
12271 $forbiddenphpregex .=
'\b(' . implode(
'|', $forbiddenphpfunctions) .
')\b';
12273 $forbiddenphpmethodsregex =
'->(' . implode(
'|', $forbiddenphpmethods) .
')';
12277 $oldstringtoclean = $s;
12278 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12279 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12280 $s = preg_replace(
'/' . $forbiddenphpmethodsregex .
'/i',
'__forbiddenstring__', $s);
12282 }
while ($oldstringtoclean != $s);
12284 if (strpos($s,
'__forbiddenstring__') !==
false) {
12285 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12286 return 'Bad string syntax to evaluate: ' . $s;
12290 if (!empty($dolibarr_main_restrict_eval_methods)) {
12293 $pattern =
'/([\s\w\'\]\"]+)\(/';
12295 $matches = array();
12296 preg_match_all($pattern, $s, $matches);
12298 if (count($matches)) {
12299 foreach ($matches[1] as $m) {
12305 if (!preg_match(
'/new ([A-Z][\w]+)/i', $m, $reg)) {
12306 if (!in_array($m, $dolibarr_main_restrict_eval_methods_array)) {
12307 if ($m !=
"'" && $m !=
'"') {
12308 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12309 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;
12313 if (!class_exists($reg[1])) {
12314 dol_syslog(
'Bad string syntax to evaluate: Class "'.$reg[1].
'" does not exist. ' . $s, LOG_WARNING);
12315 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" does not exist. ' . $s;
12317 $parents = class_parents($reg[1]);
12318 if (!in_array(
'CommonObject', $parents)) {
12319 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);
12320 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" is not allowed because only classes extended CommonObject can be used in dynamic evaluation. ' . $s;
12326 $forbiddenphpregex =
'global\s*\$';
12327 $forbiddenphpregex .=
'|';
12328 $forbiddenphpregex .=
'}\s*\[';
12329 $forbiddenphpregex .=
'|';
12330 $forbiddenphpregex .=
'\)\s*\(';
12334 $oldstringtoclean = $s;
12335 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12336 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12339 }
while ($oldstringtoclean != $s);
12341 if (strpos($s,
'__forbiddenstring__') !==
false) {
12342 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12343 return 'Bad string syntax to evaluate: ' . $s;
12349 $isObBufferActive =
true;
12350 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
12351 $tmpo = ob_get_clean();
12352 $isObBufferActive =
false;
12354 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
12357 }
catch (Error $e) {
12358 if ($isObBufferActive) {
12360 $tmpo = ob_get_clean();
12361 $isObBufferActive =
false;
12363 $error =
'dol_eval try/catch error : ';
12364 $error .= $e->getMessage();
12366 return 'Exception during evaluation: ' . $s;
12379 return (trim($element) !=
'');
12392 if (empty($codelang)) {
12396 if ($codelang ==
'auto') {
12397 return '<span class="fa fa-language"></span>';
12400 $langtocountryflag = array(
12402 'ca_ES' =>
'catalonia',
12406 'sw_SW' =>
'unknown',
12416 if (isset($langtocountryflag[$codelang])) {
12417 $flagImage = $langtocountryflag[$codelang];
12419 $tmparray = explode(
'_', $codelang);
12420 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
12425 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
12426 $morecss = $reg[1];
12431 return '<span class="flag-sprite ' . strtolower($flagImage) . ($morecss ?
' ' . $morecss :
'') .
'"' . ($moreatt ?
' ' . $moreatt :
'') . (!$notitlealt ?
' title="' . $codelang .
'"' :
'') .
'></span>';
12445 if (empty($countrycode)) {
12449 if (strtoupper($countrycode) ==
'MQ') {
12452 if (strtoupper($countrycode) ==
'SE') {
12455 if (strtoupper($countrycode) ==
'CH') {
12456 if (
$mysoc->country_code ==
'FR') {
12459 if (
$mysoc->country_code ==
'DE') {
12462 if (
$mysoc->country_code ==
'IT') {
12644 $buildprimarykeytotest = strtolower($countrycode) .
'-' . strtoupper($countrycode);
12645 if (in_array($buildprimarykeytotest, $locales)) {
12646 return strtolower($countrycode) .
'_' . strtoupper($countrycode);
12649 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
12650 foreach ($locales as $locale) {
12651 $locale_language = locale_get_primary_language($locale);
12652 $locale_region = locale_get_region($locale);
12653 if (strtoupper($countrycode) == $locale_region) {
12655 return strtolower($locale_language) .
'_' . strtoupper($locale_region);
12659 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
12697 global $hookmanager, $db;
12699 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
12700 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
12701 $values = explode(
':', $value);
12704 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
12705 if (count($values) !== 6) {
12706 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);
12713 if ($values[0] != $type) {
12721 $posstart = strpos($str,
'(');
12722 if ($posstart > 0) {
12723 $posend = strpos($str,
')');
12724 if ($posstart > 0) {
12725 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
12726 if (is_numeric($res1)) {
12727 $postab = (int) $res1;
12728 $values[1] =
'+' . substr($str, $posend + 1);
12733 global $objectoffield;
12741 if ($filterorigmodule) {
12742 if (strpos($values[3],
'@')) {
12743 if ($filterorigmodule !=
'external') {
12747 if ($filterorigmodule !=
'core') {
12752 $langs->load($values[3]);
12755 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
12757 $substitutionarray = array();
12762 $labeltemp = explode(
',', $values[2]);
12763 $label = $langs->trans($labeltemp[0]);
12765 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
12767 $classtoload = $labeltemp[1];
12768 if (class_exists($classtoload)) {
12769 $obj =
new $classtoload($db);
12770 $function = $labeltemp[3];
12771 if ($obj && $function && method_exists($obj, $function)) {
12773 $nbrec = $obj->$function(
$object->id, $obj);
12774 if (!empty($nbrec)) {
12775 $label .=
'<span class="badge marginleftonlyshort">' . $nbrec .
'</span>';
12781 $url = preg_replace(
'/__ID__/i', ((is_object(
$object) && !empty(
$object->id)) ?
$object->id :
''), $values[5]);
12782 $link = parse_url($url);
12784 if (isset($link[
'query'])) {
12785 parse_str($link[
'query'], $query);
12788 $newtab[1] = $label;
12789 $newtab[2] = str_replace(
'+',
'', $values[1]);
12793 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
12794 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
12795 if ($values[0] != $type) {
12798 $tabname = str_replace(
'-',
'', $values[1]);
12799 foreach ($head as $key => $val) {
12800 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
12802 if ($head[$key][2] == $tabname && $condition) {
12803 unset($head[$key]);
12812 if (!empty($hookmanager)) {
12813 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
12815 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
12816 if ($reshook > 0) {
12817 $head = $hookmanager->resArray;
12819 $head = array_merge($head, $hookmanager->resArray);
12838 global $conf, $hookmanager, $user, $langs;
12840 global $micro_start_time;
12842 if ($zone ==
'private') {
12843 print
"\n" .
'<!-- Common footer for private page -->' .
"\n";
12845 print
"\n" .
'<!-- Common footer for public page -->' .
"\n";
12849 print
"\n<!-- A div to store page_y POST parameter -->\n";
12850 print
'<div id="page_y" style="display: none;">' . (
GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'') .
'</div>' .
"\n";
12852 $parameters = array(
'zone' => $zone);
12855 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters, $tmpobject, $action);
12856 if (empty($reshook)) {
12862 if (!empty($conf->use_javascript_ajax)) {
12863 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
12864 print
'<script>' .
"\n";
12865 print
'jQuery(document).ready(function() {' .
"\n";
12867 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
12869 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */' .
"\n";
12870 print
'jQuery("li.menuhider").click(function(event) {';
12871 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }' .
"\n";
12872 print
' console.log("We click on .menuhider");' .
"\n";
12873 print
' $("body").toggleClass("sidebar-collapse")' .
"\n";
12874 print
'});' .
"\n";
12878 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"])))) {
12879 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */' .
"\n";
12880 $relativepathstring = $_SERVER[
"PHP_SELF"];
12882 if (constant(
'DOL_URL_ROOT')) {
12883 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
12885 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
12886 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
12889 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
12890 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
12892 if ($defkey !=
'_noquery_') {
12893 $tmpqueryarraytohave = explode(
'&', $defkey);
12895 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
12896 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
12898 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
12902 if (!$foundintru) {
12911 print
'console.log("set the focus by executing jQuery(...).focus();")' .
"\n";
12912 foreach ($defval as $paramkey => $paramval) {
12914 print
'jQuery("input[name=\'' . $paramkey .
'\']
").focus();' . "\n
";
12915 print 'jQuery("textarea[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // TODO KO with ckeditor
12916 print 'jQuery("select[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // Not really useful, but we keep it in case of.
12921 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
12922 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
12924 if ($defkey != '_noquery_') {
12925 $tmpqueryarraytohave = explode('&', $defkey);
12927 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
12928 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
12929 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
12930 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
12934 if (!$foundintru) {
12937 //var_dump($defkey.'-'.$qualified);
12943 print 'console.log("set the js code to manage fields that are
set as mandatory
");' . "\n
";
12945 foreach ($defval as $paramkey => $paramval) {
12946 // Solution 1: Add handler on submit to check if mandatory fields are empty
12947 print 'var form = $(\'[name="'.dol_escape_js($paramkey).'"]\').closest("form
");'."\n
";
12948 print "form.on(
'submit',
function(event) {
12949 var submitter = \$(
this).find(
':submit:focus').get(0);
12950 var buttonName = submitter ? \$(submitter).attr(
'name') :
'save';
12952 if (buttonName ==
'cancel') {
12953 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
12957 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');
12959 var tmpvalue = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').val();
12960 let tmptypefield = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').prop(
'nodeName').toLowerCase();
12962 if (tmptypefield ==
'textarea') {
12964 var tmpeditor = CKEDITOR.instances[
'" . dol_escape_js($paramkey) . "'];
12966 tmpvalue = tmpeditor.getData();
12967 console.log(
'For textarea tmpvalue is '+tmpvalue);
12971 let tmpvalueisempty =
false;
12972 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1) {
12973 tmpvalueisempty =
true;
12975 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
12976 tmpvalueisempty =
true;
12978 if (tmpvalueisempty && buttonName !==
'cancel') {
12979 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
12980 event.preventDefault();
12981 event.stopPropagation();
12983 alert(
'".dol_escape_js($langs->transnoentitiesnoconv("ErrorFieldRequired", $paramkey).' (
'.$langs->transnoentitiesnoconv("CustomMandatoryFieldRule").')
')."');
12987 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
12992 // Solution 2: Add property 'required' on input
12993 // so browser will check value and try to focus on it when submitting the form.
12994 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
12995 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
12996 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
12997 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
12998 //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
";
12999 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
13005 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");' .
"\n";
13009 print
'jQuery("input[name=\'cancel\']").click(function() {
13010 console.log("We click on cancel button so removed all required attribute");
13011 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
13018 print
'});' .
"\n";
13021 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
13023 print
"/* JS CODE TO ENABLE to add memory info */\n";
13024 print
'window.console && console.log("';
13029 if (!empty($micro_start_time)) {
13030 $micro_end_time = microtime(
true);
13031 print
' - Build time: ' . ceil(1000 * ($micro_end_time - $micro_start_time)) .
' ms';
13034 if (function_exists(
"memory_get_usage")) {
13035 print
' - Mem: ' . memory_get_usage();
13037 if (function_exists(
"memory_get_peak_usage")) {
13038 print
' - Real mem peak: ' . memory_get_peak_usage(
true);
13040 if (function_exists(
"zend_loader_file_encoded")) {
13041 print
' - Zend encoded file: ' . (zend_loader_file_encoded() ?
'yes' :
'no');
13043 print
'");' .
"\n";
13046 print
"\n" .
'</script>' .
"\n";
13052 foreach ($tmptagarray as $tmptag) {
13054 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
13056 <!-- Global site tag (gtag.js) - Google Analytics -->
13057 <script nonce="' .
getNonce() .
'" async src="https://www.googletagmanager.com/gtag/js?id=' . trim($tmptag) .
'"></script>
13059 window.dataLayer = window.dataLayer || [];
13060 function gtag(){dataLayer.push(arguments);}
13061 gtag(\'js\', new Date());
13063 gtag(\'config\', \'' . trim($tmptag) .
'\');
13070 // Add Xdebug coverage of code
13071 if (defined('XDEBUGCOVERAGE
')) {
13072 print_r(xdebug_get_code_coverage());
13075 // Output string from hooks
13076 if (!empty($hookmanager->resPrint)) {
13077 print $hookmanager->resPrint;
13080 // Add DebugBar data
13081 if ($user->hasRight('debugbar
', 'read
')) {
13083 if ($debugbar instanceof DebugBar\DebugBar) {
13084 if (isset($debugbar['time
'])) {
13085 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
13086 $debugbar['time
']->stopMeasure('pageaftermaster
');
13088 print '<!-- Output debugbar data -->
' . "\n";
13089 $renderer = $debugbar->getJavascriptRenderer();
13090 print $renderer->render();
13092 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
13094 print "<!-- Start of log output\n";
13095 //print '<div
class=
"hidden">
'."\n";
13096 foreach ($conf->logbuffer as $logline) {
13097 print $logline . "<br>\n";
13099 //print '</div>
'."\n";
13100 print "End of log output -->\n";
13114function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
13116 if (is_null($string)) {
13120 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
13121 // This is a regex string
13122 $newdelimiter = $delimiter;
13124 // This is a simple string
13125 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
13126 $newdelimiter = preg_quote($delimiter, '/
');
13129 if ($a = preg_split('/
' . $newdelimiter . '/
', $string)) {
13131 foreach ($a as $s) { // each part
13133 if ($pos = strpos($s, $kv)) { // key/value delimiter
13134 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
13135 } else { // key delimiter not found
13153function dolExplodeKeepIfQuotes($input)
13155 // Use regexp to capture words and section in quotes
13156 $matches = array();
13157 preg_match_all('/
"([^"]*)
"|\'([^\']*)\'|(\S+)/', $input, $matches);
13159 // Merge result and delete empty values
13161 $result = array_map(
13168 static function ($a, $b, $c) {
13184 return array_values(array_filter(
13192 static function ($val) {
13193 return $val !== '';
13205function dol_set_focus($selector)
13207 print "\n
" . '<!-- Set focus onto a specific field -->' . "\n
";
13208 print '<script nonce="' . getNonce() . '">jQuery(document).ready(function() { console.log("Force focus by
dol_set_focus"); jQuery("' . dol_escape_js($selector) . '").focus(); });</script>' . "\n
";
13219function dol_getmypid()
13221 if (!function_exists('getmypid')) {
13222 return mt_rand(99900000, 99965535);
13224 return getmypid(); // May be a number on 64 bits (depending on OS)
13250function natural_search($fields, $value, $mode = 0, $nofirstand = 0, $sqltoadd = '')
13252 global $db, $langs;
13254 $value = trim($value);
13257 $value = preg_replace('/\*/', '%', $value); // Replace * with %
13260 $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
13263 $value = preg_replace('/\s*\|\s*/', '|', $value);
13265 // Split criteria on ' ' but not if we are inside quotes.
13266 // For mode 3, the split is done later on the , only and not on the ' '.
13267 if ($mode != -3 && $mode != 3) {
13268 $crits = dolExplodeKeepIfQuotes($value);
13270 $crits = array($value);
13274 if (!is_array($fields)) {
13275 $fields = array($fields);
13277 $i1 = 0; // count the nb of "and
" criteria added (all fields / criteria)
13278 foreach ($crits as $crit) { // Loop on each AND criteria
13279 $crit = trim($crit);
13280 $i2 = 0; // count the nb of valid criteria added for this this first criteria
13283 foreach ($fields as $field) {
13285 $tmpcrits = explode('|', $crit);
13286 $i3 = 0; // count the nb of valid criteria added for this current field
13287 foreach ($tmpcrits as $tmpcrit) {
13288 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13291 $tmpcrit = trim($tmpcrit);
13293 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13296 $newcrit = preg_replace('/([!<>=]+)/', '', $tmpcrit);
13299 preg_match('/([!<>=]+)/', $tmpcrit, $reg);
13300 if (!empty($reg[1])) {
13301 $operator = $reg[1];
13303 if ($newcrit != '') {
13304 $numnewcrit = price2num($newcrit);
13305 if (is_numeric($numnewcrit)) {
13306 $newres .= $db->sanitize($field) . ' ' . $operator . ' ' . ((float) $numnewcrit); // should be a numeric
13308 $newres .= '1 = 2'; // force false, we received a corrupted data
13310 $i3++; // a criteria was added to string
13313 $i2++; // a criteria for 1 more field was added to string
13314 } elseif ($mode == 2 || $mode == -2) {
13315 $crit = preg_replace('/[^\-0-9,]/', '', $crit); // ID are always integer
13316 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -2 ? 'NOT ' : '');
13317 $newres .= $crit ? "IN (
" . $db->sanitize($db->escape($crit)) . ")
" : "IN (0)
";
13319 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13321 $i2++; // a criteria for 1 more field was added to string
13322 } elseif ($mode == 3 || $mode == -3) {
13323 $tmparray = explode(',', $crit);
13324 if (count($tmparray)) {
13326 foreach ($tmparray as $val) {
13328 if ($val) { // TODO Test with if ($val !== '') {
13329 $listofcodes .= ($listofcodes ? ',' : '');
13330 $listofcodes .= "'" . $db->escape($val) . "'";
13333 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -3 ? 'NOT ' : '') . "IN (
" . $db->sanitize($listofcodes, 1, 0, 1) . ")
";
13334 $i2++; // a criteria for 1 more field was added to string
13337 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13339 } elseif ($mode == 4) {
13340 $tmparray = explode(',', $crit);
13341 if (count($tmparray)) {
13343 foreach ($tmparray as $val) {
13346 $newres .= ($i2 > 0 ? " OR (
" : "(
") . $db->sanitize($field) . " LIKE
'" . $db->escape($val) . ",%'";
13347 $newres .= ' OR ' . $db->sanitize($field) . " =
'" . $db->escape($val) . "'";
13348 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . "'";
13349 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . ",%'";
13351 $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)
13355 } else { // $mode=0
13356 $tmpcrits = explode('|', $crit);
13357 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
13358 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
13359 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13362 $tmpcrit = trim($tmpcrit);
13364 if ($tmpcrit == '^$' || strpos($crit, '!') === 0) { // If we search empty, we must combined different OR fields with AND
13365 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND ' : '');
13367 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13370 $isSellist = false;
13371 $table = $label = $key = null;
13373 if (strpos($field, 'ef.') === 0) {
13374 $extrafieldName = substr($field, 3);
13375 $extrafields = new ExtraFields($db);
13376 $extrafields->fetch_name_optionals_label('product');
13378 if (isset($extrafields->attributes['product']['type'][$extrafieldName]) && $extrafields->attributes['product']['type'][$extrafieldName] === 'sellist') {
13380 $paramArray = $extrafields->attributes['product']['param'][$extrafieldName]['options'] ?? [];
13381 $param = array_key_first($paramArray);
13382 list($table, $label, $key) = explode(':', $param);
13386 if (preg_match('/\.(id|rowid)$/', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
13387 $newres .= $db->sanitize($field) . " =
" . (is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0');
13389 $tmpcrit2 = $tmpcrit;
13395 $newres .= $field . " IN (SELECT t.
" . $key . " FROM
" . $db->prefix() . $table . " AS t WHERE t.
" . $label . " LIKE
'%" . $db->escape($tmpcrit2) . "%')
";
13397 if (preg_match('/^!/', $tmpcrit)) {
13398 $tmps .= $db->sanitize($field) . " NOT LIKE
"; // ! as exclude character
13399 $tmpcrit2 = preg_replace('/^!/', '', $tmpcrit2);
13401 $tmps .= $db->sanitize($field) . " LIKE
";
13405 if (preg_match('/^[\^\$]/
', $tmpcrit)) {
13407 $tmpcrit2 = preg_replace('/^[\^\$]/
', '', $tmpcrit2);
13409 if (preg_match('/[\^\$]$/
', $tmpcrit)) {
13411 $tmpcrit2 = preg_replace('/[\^\$]$/
', '', $tmpcrit2);
13414 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
13415 $tmps = "(" . $tmps;
13418 $newres .= $tmpbefore;
13419 $newres .= $db->escape($tmpcrit2);
13420 $newres .= $tmpafter;
13422 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
13423 $newres .= " OR
" . $field . " IS NULL)
";
13431 $i2++; // a criteria for 1 more field was added to string
13436 $newres .= ($newres ? '' : ' OR ').str_replace('__KEYTOSEARCH__', $crit, $sqltoadd);
13440 $res = $res . ($res ? ' AND ' : '') . ($i2 > 1 ? '(' : '') . $newres . ($i2 > 1 ? ')' : '');
13444 $res = ($nofirstand ? "" : " AND
") . "(
" . $res . ")
";
13455function showDirectDownloadLink($object)
13460 $url = $object->getLastMainDocLink($object->element);
13462 $out .= img_picto($langs->trans("PublicDownloadLinkDesc
"), 'globe') . ' <span class="opacitymedium
">' . $langs->trans("DirectDownloadLink
") . '</span><br>';
13464 $out .= '<div class="urllink
"><input type="text
" id="directdownloadlink
" class="quatrevingtpercent
" value="' . $url . '"></div>';
13465 $out .= ajax_autoselect("directdownloadlink
", '');
13467 $out .= '<div class="urllink
">' . $langs->trans("FileNotShared
") . '</div>';
13481function getImageFileNameForSize($file, $extName, $extImgTarget = '')
13483 $dirName = dirname($file);
13484 if ($dirName == '.') {
13488 if (!in_array($extName, array('', '_small', '_mini'))) {
13489 return 'Bad parameter extName';
13492 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i', '', $file); // We remove image extension, whatever is its case
13493 $fileName = basename($fileName);
13495 if (empty($extImgTarget)) {
13496 $extImgTarget = (preg_match('/\.jpg$/i', $file) ? '.jpg' : '');
13498 if (empty($extImgTarget)) {
13499 $extImgTarget = (preg_match('/\.jpeg$/i', $file) ? '.jpeg' : '');
13501 if (empty($extImgTarget)) {
13502 $extImgTarget = (preg_match('/\.gif$/i', $file) ? '.gif' : '');
13504 if (empty($extImgTarget)) {
13505 $extImgTarget = (preg_match('/\.png$/i', $file) ? '.png' : '');
13507 if (empty($extImgTarget)) {
13508 $extImgTarget = (preg_match('/\.bmp$/i', $file) ? '.bmp' : '');
13510 if (empty($extImgTarget)) {
13511 $extImgTarget = (preg_match('/\.webp$/i', $file) ? '.webp' : '');
13514 if (!$extImgTarget) {
13520 $subdir = 'thumbs/';
13523 return ($dirName ? $dirName . '/' : '') . $subdir . $fileName . $extName . $extImgTarget; // New filename for thumb
13536function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '')
13538 global $conf, $langs;
13540 if (empty($conf->use_javascript_ajax)) {
13544 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
13546 if ($alldata == 1) {
13547 if ($isAllowedForPreview) {
13548 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));
13554 // old behavior, return a string
13555 if ($isAllowedForPreview) {
13556 $tmpurl = DOL_URL_ROOT . '/document.php?modulepart=' . urlencode($modulepart) . '&attachment=0&file=' . urlencode($relativepath) . ($param ? '&' . $param : '');
13557 $title = $langs->transnoentities("Preview
");
13558 //$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().
13559 //$tmpurl = 'file='.urlencode("'-alert(document.domain)-'_small.jpg
"); // An example of tmpurl that should be blocked by the dol_escape_uri()
13561 // 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,
13562 // 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.
13563 // Using the dol_escape_uri guarantee that we encode for URI so decode retrieve original expected value.
13564 return 'javascript:' . dol_escape_uri('document_preview(\'' . dol_escape_js($tmpurl) . '\', \'' . dol_escape_js(dol_mimetype($relativepath)) . '\', \'' . dol_escape_js($title) . '\')');
13576function getLabelSpecialCode($idcode)
13580 $arrayspecialines = array(1 => 'Transport', 2 => 'EcoTax', 3 => 'Option');
13581 if ($idcode > 10) {
13582 return 'Module ID ' . $idcode;
13584 if (!empty($arrayspecialines[$idcode])) {
13585 return $langs->trans($arrayspecialines[$idcode]);
13598function ajax_autoselect($htmlname, $addlink = '', $textonlink = 'Link')
13601 $out = '<script nonce="
' . getNonce() . '">
13602 jQuery(document).ready(function () {
13603 jQuery("' . ((strpos($htmlname, '.
') === 0 ? '' : '#
') . $htmlname) . '").click(function() { jQuery(this).select(); } );
13607 if ($textonlink === 'image') {
13608 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . img_picto('', 'globe') . '</a>';
13610 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . $langs->trans("Link") . '</a>';
13623function dolIsAllowedForPreview($file)
13625 // Check .noexe extension in filename
13626 if (preg_match('/\.noexe$/i', $file)) {
13630 // Check mime types
13631 $mime_preview = array('bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css', 'webp', 'webm', 'mp4');
13632 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES')) {
13633 $mime_preview[] = 'svg+xml';
13635 //$mime_preview[]='vnd.oasis.opendocument.presentation';
13636 //$mime_preview[]='archive';
13637 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
13638 if ($num_mime !== false) {
13642 // By default, not allowed for preview
13656function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0)
13659 $imgmime = 'other.png';
13660 $famime = 'file-o';
13663 $tmpfile = preg_replace('/\.noexe$/', '', $file);
13665 // Plain text files
13666 if (preg_match('/\.txt$/i', $tmpfile)) {
13667 $mime = 'text/plain';
13668 $imgmime = 'text.png';
13669 $famime = 'file-alt';
13670 } elseif (preg_match('/\.rtx$/i', $tmpfile)) {
13671 $mime = 'text/richtext';
13672 $imgmime = 'text.png';
13673 $famime = 'file-alt';
13674 } elseif (preg_match('/\.csv$/i', $tmpfile)) {
13675 $mime = 'text/csv';
13676 $imgmime = 'text.png';
13677 $famime = 'file-csv';
13678 } elseif (preg_match('/\.tsv$/i', $tmpfile)) {
13679 $mime = 'text/tab-separated-values';
13680 $imgmime = 'text.png';
13681 $famime = 'file-alt';
13682 } elseif (preg_match('/\.(cf|conf|log)$/i', $tmpfile)) {
13683 $mime = 'text/plain';
13684 $imgmime = 'text.png';
13685 $famime = 'file-alt';
13686 } elseif (preg_match('/\.ini$/i', $tmpfile)) {
13687 $mime = 'text/plain';
13688 $imgmime = 'text.png';
13690 $famime = 'file-alt';
13691 } elseif (preg_match('/\.md$/i', $tmpfile)) {
13692 $mime = 'text/plain';
13693 $imgmime = 'text.png';
13695 $famime = 'file-alt';
13696 } elseif (preg_match('/\.css$/i', $tmpfile)) {
13697 $mime = 'text/css';
13698 $imgmime = 'css.png';
13700 $famime = 'file-alt';
13701 } elseif (preg_match('/\.lang$/i', $tmpfile)) {
13702 $mime = 'text/plain';
13703 $imgmime = 'text.png';
13705 $famime = 'file-alt';
13706 } elseif (preg_match('/\.(crt|cer|key|pub)$/i', $tmpfile)) { // Certificate files
13707 $mime = 'text/plain';
13708 $imgmime = 'text.png';
13709 $famime = 'file-alt';
13710 } elseif (preg_match('/\.(html|htm|shtml)$/i', $tmpfile)) { // XML based (HTML/XML/XAML)
13711 $mime = 'text/html';
13712 $imgmime = 'html.png';
13714 $famime = 'file-alt';
13715 } elseif (preg_match('/\.(xml|xhtml)$/i', $tmpfile)) {
13716 $mime = 'text/xml';
13717 $imgmime = 'other.png';
13719 $famime = 'file-alt';
13720 } elseif (preg_match('/\.xaml$/i', $tmpfile)) {
13721 $mime = 'text/xml';
13722 $imgmime = 'other.png';
13724 $famime = 'file-alt';
13725 } elseif (preg_match('/\.bas$/i', $tmpfile)) { // Languages
13726 $mime = 'text/plain';
13727 $imgmime = 'text.png';
13729 $famime = 'file-code';
13730 } elseif (preg_match('/\.(c)$/i', $tmpfile)) {
13731 $mime = 'text/plain';
13732 $imgmime = 'text.png';
13734 $famime = 'file-code';
13735 } elseif (preg_match('/\.(cpp)$/i', $tmpfile)) {
13736 $mime = 'text/plain';
13737 $imgmime = 'text.png';
13739 $famime = 'file-code';
13740 } elseif (preg_match('/\.cs$/i', $tmpfile)) {
13741 $mime = 'text/plain';
13742 $imgmime = 'text.png';
13744 $famime = 'file-code';
13745 } elseif (preg_match('/\.(h)$/i', $tmpfile)) {
13746 $mime = 'text/plain';
13747 $imgmime = 'text.png';
13749 $famime = 'file-code';
13750 } elseif (preg_match('/\.(java|jsp)$/i', $tmpfile)) {
13751 $mime = 'text/plain';
13752 $imgmime = 'text.png';
13754 $famime = 'file-code';
13755 } elseif (preg_match('/\.php([0-9]{1})?$/i', $tmpfile)) {
13756 $mime = 'text/plain';
13757 $imgmime = 'php.png';
13759 $famime = 'file-code';
13760 } elseif (preg_match('/\.phtml$/i', $tmpfile)) {
13761 $mime = 'text/plain';
13762 $imgmime = 'php.png';
13764 $famime = 'file-code';
13765 } elseif (preg_match('/\.(pl|pm)$/i', $tmpfile)) {
13766 $mime = 'text/plain';
13767 $imgmime = 'pl.png';
13769 $famime = 'file-code';
13770 } elseif (preg_match('/\.sql$/i', $tmpfile)) {
13771 $mime = 'text/plain';
13772 $imgmime = 'text.png';
13774 $famime = 'file-code';
13775 } elseif (preg_match('/\.js$/i', $tmpfile)) {
13776 $mime = 'text/x-javascript';
13777 $imgmime = 'jscript.png';
13779 $famime = 'file-code';
13780 } elseif (preg_match('/\.odp$/i', $tmpfile)) { // Open office
13781 $mime = 'application/vnd.oasis.opendocument.presentation';
13782 $imgmime = 'ooffice.png';
13783 $famime = 'file-powerpoint';
13784 } elseif (preg_match('/\.ods$/i', $tmpfile)) {
13785 $mime = 'application/vnd.oasis.opendocument.spreadsheet';
13786 $imgmime = 'ooffice.png';
13787 $famime = 'file-excel';
13788 } elseif (preg_match('/\.odt$/i', $tmpfile)) {
13789 $mime = 'application/vnd.oasis.opendocument.text';
13790 $imgmime = 'ooffice.png';
13791 $famime = 'file-word';
13792 } elseif (preg_match('/\.mdb$/i', $tmpfile)) { // MS Office
13793 $mime = 'application/msaccess';
13794 $imgmime = 'mdb.png';
13796 } elseif (preg_match('/\.doc[xm]?$/i', $tmpfile)) {
13797 $mime = 'application/msword';
13798 $imgmime = 'doc.png';
13799 $famime = 'file-word';
13800 } elseif (preg_match('/\.dot[xm]?$/i', $tmpfile)) {
13801 $mime = 'application/msword';
13802 $imgmime = 'doc.png';
13803 $famime = 'file-word';
13804 } elseif (preg_match('/\.xlt(x)?$/i', $tmpfile)) {
13805 $mime = 'application/vnd.ms-excel';
13806 $imgmime = 'xls.png';
13807 $famime = 'file-excel';
13808 } elseif (preg_match('/\.xla(m)?$/i', $tmpfile)) {
13809 $mime = 'application/vnd.ms-excel';
13810 $imgmime = 'xls.png';
13811 $famime = 'file-excel';
13812 } elseif (preg_match('/\.xls$/i', $tmpfile)) {
13813 $mime = 'application/vnd.ms-excel';
13814 $imgmime = 'xls.png';
13815 $famime = 'file-excel';
13816 } elseif (preg_match('/\.xls[bmx]$/i', $tmpfile)) {
13817 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
13818 $imgmime = 'xls.png';
13819 $famime = 'file-excel';
13820 } elseif (preg_match('/\.pps[mx]?$/i', $tmpfile)) {
13821 $mime = 'application/vnd.ms-powerpoint';
13822 $imgmime = 'ppt.png';
13823 $famime = 'file-powerpoint';
13824 } elseif (preg_match('/\.ppt[mx]?$/i', $tmpfile)) {
13825 $mime = 'application/x-mspowerpoint';
13826 $imgmime = 'ppt.png';
13827 $famime = 'file-powerpoint';
13828 } elseif (preg_match('/\.pdf$/i', $tmpfile)) { // Other
13829 $mime = 'application/pdf';
13830 $imgmime = 'pdf.png';
13831 $famime = 'file-pdf';
13832 } elseif (preg_match('/\.bat$/i', $tmpfile)) { // Scripts
13833 $mime = 'text/x-bat';
13834 $imgmime = 'script.png';
13836 $famime = 'file-code';
13837 } elseif (preg_match('/\.sh$/i', $tmpfile)) {
13838 $mime = 'text/x-sh';
13839 $imgmime = 'script.png';
13841 $famime = 'file-code';
13842 } elseif (preg_match('/\.ksh$/i', $tmpfile)) {
13843 $mime = 'text/x-ksh';
13844 $imgmime = 'script.png';
13846 $famime = 'file-code';
13847 } elseif (preg_match('/\.bash$/i', $tmpfile)) {
13848 $mime = 'text/x-bash';
13849 $imgmime = 'script.png';
13851 $famime = 'file-code';
13852 } elseif (preg_match('/\.ico$/i', $tmpfile)) { // Images
13853 $mime = 'image/x-icon';
13854 $imgmime = 'image.png';
13855 $famime = 'file-image';
13856 } elseif (preg_match('/\.(jpg|jpeg)$/i', $tmpfile)) {
13857 $mime = 'image/jpeg';
13858 $imgmime = 'image.png';
13859 $famime = 'file-image';
13860 } elseif (preg_match('/\.png$/i', $tmpfile)) {
13861 $mime = 'image/png';
13862 $imgmime = 'image.png';
13863 $famime = 'file-image';
13864 } elseif (preg_match('/\.gif$/i', $tmpfile)) {
13865 $mime = 'image/gif';
13866 $imgmime = 'image.png';
13867 $famime = 'file-image';
13868 } elseif (preg_match('/\.bmp$/i', $tmpfile)) {
13869 $mime = 'image/bmp';
13870 $imgmime = 'image.png';
13871 $famime = 'file-image';
13872 } elseif (preg_match('/\.(tif|tiff)$/i', $tmpfile)) {
13873 $mime = 'image/tiff';
13874 $imgmime = 'image.png';
13875 $famime = 'file-image';
13876 } elseif (preg_match('/\.svg$/i', $tmpfile)) {
13877 $mime = 'image/svg+xml';
13878 $imgmime = 'image.png';
13879 $famime = 'file-image';
13880 } elseif (preg_match('/\.webp$/i', $tmpfile)) {
13881 $mime = 'image/webp';
13882 $imgmime = 'image.png';
13883 $famime = 'file-image';
13884 } elseif (preg_match('/\.vcs$/i', $tmpfile)) { // Calendar
13885 $mime = 'text/calendar';
13886 $imgmime = 'other.png';
13887 $famime = 'file-alt';
13888 } elseif (preg_match('/\.ics$/i', $tmpfile)) {
13889 $mime = 'text/calendar';
13890 $imgmime = 'other.png';
13891 $famime = 'file-alt';
13892 } elseif (preg_match('/\.torrent$/i', $tmpfile)) { // Other
13893 $mime = 'application/x-bittorrent';
13894 $imgmime = 'other.png';
13895 $famime = 'file-o';
13896 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) { // Audio
13898 $imgmime = 'audio.png';
13899 $famime = 'file-audio';
13900 } elseif (preg_match('/\.mp4$/i', $tmpfile)) { // Video
13901 $mime = 'video/mp4';
13902 $imgmime = 'video.png';
13903 $famime = 'file-video';
13904 } elseif (preg_match('/\.ogv$/i', $tmpfile)) {
13905 $mime = 'video/ogg';
13906 $imgmime = 'video.png';
13907 $famime = 'file-video';
13908 } elseif (preg_match('/\.webm$/i', $tmpfile)) {
13909 $mime = 'video/webm';
13910 $imgmime = 'video.png';
13911 $famime = 'file-video';
13912 } elseif (preg_match('/\.avi$/i', $tmpfile)) {
13913 $mime = 'video/x-msvideo';
13914 $imgmime = 'video.png';
13915 $famime = 'file-video';
13916 } elseif (preg_match('/\.divx$/i', $tmpfile)) {
13917 $mime = 'video/divx';
13918 $imgmime = 'video.png';
13919 $famime = 'file-video';
13920 } elseif (preg_match('/\.xvid$/i', $tmpfile)) {
13921 $mime = 'video/xvid';
13922 $imgmime = 'video.png';
13923 $famime = 'file-video';
13924 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
13926 $imgmime = 'video.png';
13927 $famime = 'file-video';
13928 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) { // Archive
13929 // application/xxx where zzz is zip, ...
13931 $imgmime = 'archive.png';
13932 $famime = 'file-archive';
13933 } elseif (preg_match('/\.(exe|com)$/i', $tmpfile)) { // Exe
13934 $mime = 'application/octet-stream';
13935 $imgmime = 'other.png';
13936 $famime = 'file-o';
13937 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i', $tmpfile)) { // Lib
13939 $imgmime = 'library.png';
13940 $famime = 'file-o';
13941 } elseif (preg_match('/\.err$/i', $tmpfile)) { // phpcs:ignore
13943 $imgmime = 'error.png';
13944 $famime = 'file-alt';
13947 if ($famime == 'file-o') {
13948 // file-o seems to not work in fontawesome 5
13952 // Return mimetype string
13953 switch ((int) $mode) {
13955 $tmp = explode('/', $mime);
13956 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
13978function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid')
13982 $tablename = preg_replace('/^' . preg_quote(MAIN_DB_PREFIX, '/') . '/', '', $tablename); // Clean name of table for backward compatibility.
13984 $dictvalues = (isset($conf->cache['dictvalues_' . $tablename]) ? $conf->cache['dictvalues_' . $tablename] : null);
13986 if (is_null($dictvalues)) {
13987 $dictvalues = array();
13989 $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
13990 if ($checkentity) {
13991 $sql .= ' AND entity IN (0,' . getEntity($tablename) . ')';
13994 $resql = $db->query($sql);
13996 while ($obj = $db->fetch_object($resql)) {
13997 $dictvalues[$obj->$rowidfield] = $obj; // $obj is stdClass
14000 dol_print_error($db);
14003 $conf->cache['dictvalues_' . $tablename] = $dictvalues;
14006 if (!empty($dictvalues[$id])) {
14008 $tmp = $dictvalues[$id];
14009 return (property_exists($tmp, $field) ? $tmp->$field : '');
14022function colorIsLight($stringcolor)
14024 $stringcolor = str_replace('#', '', $stringcolor);
14026 if (!empty($stringcolor)) {
14028 $tmp = explode(',', $stringcolor);
14029 if (count($tmp) > 1) { // This is a comma RGB ('255','255','255')
14034 $hexr = $stringcolor[0] . $stringcolor[1];
14035 $hexg = $stringcolor[2] . $stringcolor[3];
14036 $hexb = $stringcolor[4] . $stringcolor[5];
14037 $r = hexdec($hexr);
14038 $g = hexdec($hexg);
14039 $b = hexdec($hexb);
14041 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0; // HSL algorithm
14042 if ($bright > 0.6) {
14057function isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
14059 //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms'];
14060 //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal);
14061 if (empty($menuentry['enabled'])) {
14062 return 0; // Entry disabled by condition
14064 if ($type_user && array_key_exists('module', $menuentry) && $menuentry['module']) {
14065 $tmploops = explode('|', $menuentry['module']);
14067 foreach ($tmploops as $tmploop) {
14068 if (in_array($tmploop, $listofmodulesforexternal)) {
14074 return 0; // Entry is for menus all excluded to external users
14077 if (!$menuentry['perms'] && $type_user) {
14078 return 0; // No permissions and user is external
14080 if (!$menuentry['perms'] && getDolGlobalString('MAIN_MENU_HIDE_UNAUTHORIZED')) {
14081 return 0; // No permissions and option to hide when not allowed, even for internal user, is on
14083 if (!$menuentry['perms']) {
14084 return 2; // No permissions and user is external
14096function roundUpToNextMultiple($n, $x = 5)
14098 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
14099 return (int) $result;
14113function dolGetBadge($label, $html = '', $type = 'primary', $mode = '', $url = '', $params = array())
14115 $csstouse = 'badge';
14116 $csstouse .= (!empty($mode) ? ' badge-' . $mode : '');
14117 $csstouse .= (!empty($type) ? ' badge-' . $type : '');
14118 $csstouse .= (empty($params['css']) ? '' : ' ' . $params['css']);
14121 'class' => $csstouse
14124 if (empty($html)) {
14128 if (!empty($url)) {
14129 $attr['href'] = $url;
14132 if ($mode === 'dot') {
14133 $attr['class'] .= ' classfortooltip';
14134 $attr['title'] = $html;
14135 $attr['aria-label'] = $label;
14140 if (!empty($params['attr']) && is_array($params['attr'])) {
14141 foreach ($params['attr'] as $key => $value) {
14142 if ($key == 'class') {
14143 $attr['class'] .= ' ' . $value;
14144 } elseif ($key == 'classOverride') {
14145 $attr['class'] = $value;
14147 $attr[$key] = $value;
14154 // escape all attribute
14155 $attr = array_map('dolPrintHTMLForAttribute', $attr);
14157 $TCompiledAttr = array();
14158 foreach ($attr as $key => $value) {
14159 $TCompiledAttr[] = $key . '="
' . $value . '"';
14162 $compiledAttributes = !empty($TCompiledAttr) ? implode(' ', $TCompiledAttr) : '';
14164 $tag = !empty($url) ? 'a' : 'span';
14166 return '<' . $tag . ' ' . $compiledAttributes . '>' . $html . '</' . $tag . '>';
14182function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $statusType = 'status0', $displayMode = 0, $url = '', $params = array())
14187 $dolGetBadgeParams = array();
14189 if (!empty($params['badgeParams'])) {
14190 $dolGetBadgeParams = $params['badgeParams'];
14193 // TODO : add a hook
14194 if ($displayMode == 0) {
14195 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
14196 } elseif ($displayMode == 1) {
14197 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14198 } elseif (getDolGlobalString('MAIN_STATUS_USES_IMAGES')) {
14199 // Use status with images (for backward compatibility)
14201 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ? '<span class="hideonsmartphone
">' : '') . (!empty($html) ? $html : $statusLabel) . (in_array($displayMode, array(1, 2, 5)) ? '</span>' : '');
14202 $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>' : '');
14204 // For small screen, we always use the short label instead of long label.
14205 if (!empty($conf->dol_optimize_smallscreen)) {
14206 if ($displayMode == 0) {
14208 } elseif ($displayMode == 4) {
14210 } elseif ($displayMode == 6) {
14215 // For backward compatibility. Image's filename are still in French, so we use this array to convert
14216 $statusImg = array(
14217 'status0' => 'statut0',
14218 'status1' => 'statut1',
14219 'status2' => 'statut2',
14220 'status3' => 'statut3',
14221 'status4' => 'statut4',
14222 'status5' => 'statut5',
14223 'status6' => 'statut6',
14224 'status7' => 'statut7',
14225 'status8' => 'statut8',
14226 'status9' => 'statut9'
14229 if (!empty($statusImg[$statusType])) {
14230 $htmlImg = img_picto($statusLabel, $statusImg[$statusType]);
14232 $htmlImg = img_picto($statusLabel, $statusType);
14235 if ($displayMode === 2) {
14236 $return = $htmlImg . ' ' . $htmlLabelShort;
14237 } elseif ($displayMode === 3) {
14238 $return = $htmlImg;
14239 } elseif ($displayMode === 4) {
14240 $return = $htmlImg . ' ' . $htmlLabel;
14241 } elseif ($displayMode === 5) {
14242 $return = $htmlLabelShort . ' ' . $htmlImg;
14243 } else { // $displayMode >= 6
14244 $return = $htmlLabel . ' ' . $htmlImg;
14246 } elseif (!getDolGlobalString('MAIN_STATUS_USES_IMAGES') && !empty($displayMode)) {
14248 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14250 $dolGetBadgeParams['attr']['class'] = 'badge-status';
14251 if (empty($dolGetBadgeParams['attr']['title'])) {
14252 $dolGetBadgeParams['attr']['title'] = empty($params['tooltip']) ? $statusLabel : ($params['tooltip'] != 'no' ? $params['tooltip'] : '');
14253 } else { // If a title was forced from $params['badgeParams']['attr']['title'], we set the class to get it as a tooltip.
14254 $dolGetBadgeParams['attr']['class'] .= ' classfortooltip';
14255 // And if we use tooltip, we can output title in HTML @phan-suppress-next-line PhanTypeInvalidDimOffset
14256 $dolGetBadgeParams['attr']['title'] = dol_htmlentitiesbr((string) $dolGetBadgeParams['attr']['title'], 1);
14259 if ($displayMode == 3) {
14260 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), '', $statusType, 'dot', $url, $dolGetBadgeParams);
14261 } elseif ($displayMode === 5) {
14262 $return = dolGetBadge($statusLabelShort, $html, $statusType, '', $url, $dolGetBadgeParams);
14264 $return = dolGetBadge(((empty($conf->dol_optimize_smallscreen) && $displayMode != 2) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType, '', $url, $dolGetBadgeParams);
14307function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = '', $id = '', $userRight = 1, $params = array())
14309 global $hookmanager, $action, $object, $langs;
14311 // If $url is an array, we must build a dropdown button or recursively iterate over each value
14312 if (is_array($url)) {
14313 // Loop on $url array to remove entries of disabled modules
14314 foreach ($url as $key => $subbutton) {
14315 if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
14322 if (array_key_exists('areDropdownButtons', $params) && $params["areDropdownButtons
"] === false) { // @phan-suppress-current-line PhanTypeInvalidDimOffset
14323 foreach ($url as $button) {
14324 if (!empty($button['lang'])) {
14325 $langs->load($button['lang']);
14327 $label = $langs->trans($button['label']);
14328 $text = $button['text'] ?? '';
14329 $actionType = $button['actionType'] ?? '';
14330 $tmpUrl = DOL_URL_ROOT . $button['url'] . (empty($params['backtopage']) ? '' : '&backtopage=' . urlencode($params['backtopage']));
14331 $id = $button['id'] ?? '';
14332 $userRight = $button['perm'] ?? 1;
14333 $button['params'] = $button['params'] ?? []; // @phan-suppress-current-line PhanPluginDuplicateExpressionAssignmentOperation
14335 $out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
14340 if (count($url) > 1) {
14341 $out .= '<div class="dropdown
inline-block dropdown-holder
">';
14342 $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>';
14343 $out .= '<div class="dropdown-content
">';
14344 foreach ($url as $subbutton) {
14345 if (!empty($subbutton['lang'])) {
14346 $langs->load($subbutton['lang']);
14349 if (!empty($subbutton['urlraw'])) {
14350 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14352 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14353 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14356 $subbuttonparam = array();
14357 if (!empty($subbutton['attr'])) {
14358 $subbuttonparam['attr'] = $subbutton['attr'];
14360 $subbuttonparam['isDropDown'] = (empty($params['isDropDown']) ? ($subbutton['isDropDown'] ?? false) : $params['isDropDown']);
14362 $out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, $subbutton['id'] ?? '', $subbutton['perm'], $subbuttonparam);
14367 foreach ($url as $subbutton) { // Should loop on 1 record only
14368 if (!empty($subbutton['lang'])) {
14369 $langs->load($subbutton['lang']);
14372 if (!empty($subbutton['urlraw'])) {
14373 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14375 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14376 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14379 $label = $langs->trans($subbutton['label']);
14380 $text = $subbutton['text'] ?? '';
14381 if (empty($text)) {
14386 $out .= dolGetButtonAction($label, $text, 'default', $tmpurl, '', $subbutton['perm'], $params);
14393 // Here, $url is a simple link
14394 if (!empty($params['isDropdown']) || !empty($params['isDropDown'])) { // Use the dropdown-item style (not for action button)
14395 $class = "dropdown-item
";
14397 $class = 'butAction';
14398 if ($actionType == 'edit') {
14399 $class = 'butAction butActionEdit';
14400 } elseif ($actionType == 'email') {
14401 $class = 'butAction butActionEmail';
14402 } elseif ($actionType == 'clone') {
14403 $class = 'butAction butActionClone';
14404 } elseif ($actionType == 'danger' || $actionType == 'delete') {
14405 $class = 'butAction butActionDelete';
14406 if (!empty($url) && strpos($url, 'token=') === false) {
14407 $url .= '&token=' . newToken();
14413 'href' => empty($url) ? '' : $url,
14417 if (empty($text)) {
14419 $attr['title'] = ''; // if html not set, using label on title is redundant
14421 $attr['title'] = $label;
14422 $attr['aria-label'] = $label;
14425 if (empty($userRight) || $userRight < 0) {
14426 $attr['class'] = 'butActionRefused';
14427 $attr['href'] = '';
14428 $attr['title'] = (($label && $text && $label != $text) ? $label : '');
14429 $attr['title'] = ($attr['title'] ? $attr['title'] . (empty($userRight) ? '<br>' : '') : '');
14430 $attr['title'] .= ((empty($userRight) && empty($label)) ? $langs->trans('NotEnoughPermissions') : '');
14438 if (!empty($params['attr']) && is_array($params['attr'])) {
14439 foreach ($params['attr'] as $key => $value) {
14440 if ($key == 'class') {
14441 $attr['class'] .= ' ' . $value;
14442 } elseif ($key == 'classOverride') {
14443 $attr['class'] = $value;
14445 $attr[$key] = $value;
14450 // automatic add tooltip when title is detected
14451 if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
14452 $attr['class'] .= ' classfortooltip';
14455 // Js Confirm button
14456 if ($userRight && !empty($params['confirm'])) {
14457 if (!is_array($params['confirm'])) {
14458 $params['confirm'] = array();
14461 if (empty($params['confirm']['url'])) {
14462 $params['confirm']['url'] = $url . (strpos($url, '?') > 0 ? '&' : '?') . 'confirm=yes';
14465 // for js disabled compatibility set $url as call to confirm action and $params['confirm']['url'] to confirmed action
14466 $attr['data-confirm-url'] = $params['confirm']['url'];
14467 $attr['data-confirm-title'] = !empty($params['confirm']['title']) ? $params['confirm']['title'] : $langs->trans('ConfirmBtnCommonTitle', $label);
14468 $attr['data-confirm-content'] = !empty($params['confirm']['content']) ? $params['confirm']['content'] : $langs->trans('ConfirmBtnCommonContent', $label);
14469 $attr['data-confirm-content'] = preg_replace("/\r|\n/
", "", $attr['data-confirm-content']);
14470 $attr['data-confirm-action-btn-label'] = !empty($params['confirm']['action-btn-label']) ? $params['confirm']['action-btn-label'] : $langs->trans('Confirm');
14471 $attr['data-confirm-cancel-btn-label'] = !empty($params['confirm']['cancel-btn-label']) ? $params['confirm']['cancel-btn-label'] : $langs->trans('CloseDialog');
14472 $attr['data-confirm-modal'] = !empty($params['confirm']['modal']) ? $params['confirm']['modal'] : true;
14474 $attr['class'] .= ' butActionConfirm';
14477 if (isset($attr['href']) && empty($attr['href'])) {
14478 unset($attr['href']);
14481 // TODO replace $TCompiledAttr generation by commonHtmlAttributeBuilder given below
14482 $TCompiledAttr = array();
14483 foreach ($attr as $key => $value) {
14484 if (!empty($params['use_unsecured_unescapedattr']) && is_array($params['use_unsecured_unescapedattr']) && in_array($key, $params['use_unsecured_unescapedattr'])) {
14486 $value = dol_htmlentities($value, ENT_QUOTES | ENT_SUBSTITUTE);
14487 } elseif ($key == 'href') {
14488 $value = dolPrintHTMLForAttributeUrl($value);
14490 $value = dolPrintHTMLForAttribute($value);
14493 $TCompiledAttr[] = $key . '="' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14495 // TODO replace $TCompiledAttr generation by uncomment line below and remove old code
14496 // $TCompiledAttr = commonHtmlAttributeBuilder($attr,$params['use_unsecured_unescapedattr'] ?? []);
14497 $compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
14499 $tag = !empty($attr['href']) ? 'a' : 'span';
14501 $parameters = array(
14502 'TCompiledAttr' => $TCompiledAttr, // array
14503 'compiledAttributes' => $compiledAttributes, // string
14508 'actionType' => $actionType,
14511 'userRight' => $userRight,
14512 'params' => $params
14515 $reshook = $hookmanager->executeHooks('dolGetButtonAction', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
14516 if ($reshook < 0) {
14517 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
14520 if (empty($reshook)) {
14521 if (dol_textishtml($text)) { // If content already HTML encoded
14522 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . $text . '</span></' . $tag . '>';
14524 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . dol_escape_htmltag($text) . '</span></' . $tag . '>';
14527 return $hookmanager->resPrint;
14566function commonHtmlAttributeBuilder($attr, array $unescapedAttr = [])
14568 $TCompiledAttr = array();
14569 if (empty($attr)) {
14573 foreach ($attr as $key => $value) {
14574 // special boolean attributes case
14575 if (in_array($key, getListOfHtmlBooleanAttributes())) {
14577 $TCompiledAttr[$key] = $key;
14582 if (!empty($unescapedAttr) && in_array($key, $unescapedAttr)) {
14584 $value = dol_htmlentities((string) $value, ENT_QUOTES | ENT_SUBSTITUTE);
14585 } elseif ($key == 'href') {
14586 $value = dolPrintHTMLForAttributeUrl((string) $value);
14588 $value = dolPrintHTMLForAttribute((string) $value);
14591 $TCompiledAttr[$key] = $key . '="
' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14594 return $TCompiledAttr;
14611function getListOfHtmlBooleanAttributes(): array
14660function dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot = true)
14666 $parsedUrl = parse_url($url);
14667 if ((isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], ['javascript', 'mailto', 'tel'])) || strpos($url, '#') === 0) {
14671 if (!empty($parsedUrl['query'])) {
14672 // Use parse_str() function to parse the string passed via URL
14673 parse_str($parsedUrl['query'], $urlQuery);
14674 if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
14675 $url .= '&backtopage=' . urlencode($params['backtopage']);
14679 if (!isset($parsedUrl['scheme']) && $addDolUrlRoot) {
14680 $url = DOL_URL_ROOT . $url;
14693function dolGetButtonTitleSeparator($moreClass = "
")
14695 return '<span class="button-title-separator
' . $moreClass . '" ></span>';
14704function getFieldErrorIcon($fieldValidationErrorMsg)
14707 if (!empty($fieldValidationErrorMsg)) {
14708 $out .= '<span class="field-error-icon classfortooltip
" title="' . dol_escape_htmltag($fieldValidationErrorMsg, 1) . '" role="alert
" >'; // role alert is used for accessibility
14709 $out .= '<span class="fa fa-exclamation-circle
" aria-hidden="true" ></span>'; // For accessibility icon is separated and aria-hidden
14728function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $url = '', $id = '', $status = 1, $params = array())
14730 global $langs, $user;
14732 // Actually this conf is used in css too for external module compatibility and smooth transition to this function
14733 if (getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
14736 // Fix old picto fa-th-list to use fa-grid-vertical instead
14737 if ($iconClass == 'fa fa-th-list imgforviewmode') {
14738 $iconClass = ' fa fa-grip-horizontal imgforviewmode';
14741 $class = 'btnTitle';
14742 if (in_array($iconClass, array('fa fa-plus-circle', 'fa fa-plus-circle size15x', 'fa fa-comment-dots', 'fa fa-paper-plane'))) {
14743 $class .= ' btnTitlePlus';
14745 $useclassfortooltip = 1;
14747 if (!empty($params['morecss'])) {
14748 $class .= ' ' . $params['morecss'];
14753 'href' => empty($url) ? '' : $url
14756 if (!empty($helpText)) {
14757 $attr['title'] = $helpText;
14758 } elseif ($label) { // empty($attr['title']) &&
14759 $attr['title'] = $label;
14760 $useclassfortooltip = 0;
14763 if ($status == 2) {
14764 $attr['class'] .= ' btnTitleSelected';
14765 } elseif ($status <= 0) {
14766 $attr['class'] .= ' refused';
14768 $attr['href'] = '';
14770 if ($status == -1) { // disable
14771 $attr['title'] = $langs->transnoentitiesnoconv("FeatureDisabled
");
14772 } elseif ($status == 0) { // Not enough permissions
14773 $attr['title'] = $langs->transnoentitiesnoconv("NotEnoughPermissions
");
14777 if (!empty($attr['title']) && $useclassfortooltip) {
14778 $attr['class'] .= ' classfortooltip';
14786 if (!empty($params['attr']) && is_array($params['attr'])) {
14787 foreach ($params['attr'] as $key => $value) {
14788 if ($key == 'class') {
14789 $attr['class'] .= ' ' . $value;
14790 } elseif ($key == 'classOverride') {
14791 $attr['class'] = $value;
14793 $attr[$key] = $value;
14798 if (isset($attr['href']) && empty($attr['href'])) {
14799 unset($attr['href']);
14802 // TODO : add a hook
14804 // Generate attributes with escapement
14805 $TCompiledAttr = array();
14806 foreach ($attr as $key => $value) {
14807 $TCompiledAttr[] = $key . '="' . dol_escape_htmltag($value) . '"'; // Do not use dolPrintHTMLForAttribute() here, we must accept "javascript:
string"
14810 $compiledAttributes = (empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr));
14812 $tag = (empty($attr['href']) ? 'span' : 'a');
14814 $button = '<' . $tag . ' ' . $compiledAttributes . '>';
14815 $button .= '<span class="' . $iconClass . ' valignmiddle btnTitle-icon
"></span>';
14816 if (!empty($params['forcenohideoftext'])) {
14817 $button .= '<span class="valignmiddle text-plus-circle btnTitle-label
' . (empty($params['forcenohideoftext
']) ? ' hideonsmartphone
' : '') . '">' . $label . '</span>';
14819 $button .= '</' . $tag . '>';
14833function getElementProperties($elementType)
14835 global $conf, $db, $hookmanager;
14839 //$element_type='facture';
14841 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element = '';
14843 // Parse element/subelement
14844 $module = $elementType;
14845 $element = $elementType;
14846 $subelement = $elementType;
14847 $table_element = $elementType;
14849 // If we ask a resource form external module (instead of default path)
14850 if (preg_match('/^([^@]+)@([^@]+)$/i', $elementType, $regs)) { // 'myobject@mymodule'
14851 $element = $subelement = $regs[1];
14852 $module = $regs[2];
14855 // If we ask a resource for a string with an element and a subelement
14856 // Example 'project_task'
14857 if (preg_match('/^([^_]+)_([^_]+)/i', $element, $regs)) { // 'myobject_mysubobject' with myobject=mymodule
14858 $module = $element = $regs[1];
14859 $subelement = $regs[2];
14862 // Object lines will use parent classpath and module ref
14863 if (substr($elementType, -3) == 'det') {
14864 $module = preg_replace('/det$/', '', $element);
14865 $subelement = preg_replace('/det$/', '', $subelement);
14866 $classpath = $module . '/class';
14867 $classfile = $module;
14868 $classname = preg_replace('/det$/', 'Line', $element);
14869 if (in_array($module, array('expedition', 'propale', 'facture', 'contrat', 'fichinter', 'supplier_order', 'commandefournisseur'))) {
14870 $classname = preg_replace('/det$/', 'Ligne', $element);
14873 // For compatibility and to work with non standard path
14874 if ($elementType == "action
" || $elementType == "actioncomm
") {
14875 $classpath = 'comm/action/class';
14876 $subelement = 'Actioncomm';
14877 $module = 'agenda';
14878 $table_element = 'actioncomm';
14879 } elseif ($elementType == 'cronjob') {
14880 $classpath = 'cron/class';
14882 $table_element = 'cron';
14883 } elseif ($elementType == 'adherent_type') {
14884 $classpath = 'adherents/class';
14885 $classfile = 'adherent_type';
14886 $module = 'adherent';
14887 $subelement = 'adherent_type';
14888 $classname = 'AdherentType';
14889 $table_element = 'adherent_type';
14890 } elseif ($elementType == 'bank_account') {
14891 $classpath = 'compta/bank/class';
14892 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
14893 $classfile = 'account';
14894 $classname = 'Account';
14895 } elseif ($elementType == 'bank_line') {
14896 $classpath = 'compta/bank/class';
14897 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
14898 $classfile = 'account';
14899 $classname = 'AccountLine';
14900 } elseif ($elementType == 'category') {
14901 $classpath = 'categories/class';
14902 $module = 'categorie';
14903 $subelement = 'categorie';
14904 $table_element = 'categorie';
14905 } elseif ($elementType == 'contact') {
14906 $classpath = 'contact/class';
14907 $classfile = 'contact';
14908 $module = 'societe';
14909 $subelement = 'contact';
14910 $table_element = 'socpeople';
14911 } elseif ($elementType == 'inventory') {
14912 $module = 'product';
14913 $classpath = 'product/inventory/class';
14914 } elseif ($elementType == 'inventoryline') {
14915 $module = 'product';
14916 $classpath = 'product/inventory/class';
14917 $table_element = 'inventorydet';
14918 $parent_element = 'inventory';
14919 } elseif ($elementType == 'stock' || $elementType == 'entrepot' || $elementType == 'warehouse') {
14921 $classpath = 'product/stock/class';
14922 $classfile = 'entrepot';
14923 $classname = 'Entrepot';
14924 $table_element = 'entrepot';
14925 } elseif ($elementType == 'project') {
14926 $classpath = 'projet/class';
14927 $module = 'projet';
14928 $table_element = 'projet';
14929 } elseif ($elementType == 'project_task') {
14930 $classpath = 'projet/class';
14931 $module = 'projet';
14932 $subelement = 'task';
14933 $table_element = 'projet_task';
14934 } elseif ($elementType == 'facture' || $elementType == 'invoice') {
14935 $classpath = 'compta/facture/class';
14936 $module = 'facture';
14937 $subelement = 'facture';
14938 $table_element = 'facture';
14939 } elseif ($elementType == 'facturedet') {
14940 $classpath = 'compta/facture/class';
14941 $classfile = 'facture';
14942 $classname = 'FactureLigne';
14943 $module = 'facture';
14944 $table_element = 'facturedet';
14945 $parent_element = 'facture';
14946 } elseif ($elementType == 'facturerec'|| $elementType == 'facture_rec') {
14947 $classpath = 'compta/facture/class';
14948 $classfile = 'facture-rec';
14949 $module = 'facture';
14950 $classname = 'FactureRec';
14951 } elseif ($elementType == 'commande' || $elementType == 'order') {
14952 $classpath = 'commande/class';
14953 $module = 'commande';
14954 $subelement = 'commande';
14955 $table_element = 'commande';
14956 } elseif ($elementType == 'commandedet') {
14957 $classpath = 'commande/class';
14958 $classfile = 'commande';
14959 $classname = 'OrderLine';
14960 $module = 'commande';
14961 $table_element = 'commandedet';
14962 $parent_element = 'commande';
14963 } elseif ($elementType == 'propal') {
14964 $classpath = 'comm/propal/class';
14965 $table_element = 'propal';
14966 } elseif ($elementType == 'propaldet') {
14967 $classpath = 'comm/propal/class';
14968 $classfile = 'propal';
14969 $subelement = 'propaleligne';
14970 $module = 'propal';
14971 $table_element = 'propaldet';
14972 $parent_element = 'propal';
14973 } elseif ($elementType == 'shipping') {
14974 $classpath = 'expedition/class';
14975 $classfile = 'expedition';
14976 $classname = 'Expedition';
14977 $module = 'expedition';
14978 $table_element = 'expedition';
14979 } elseif ($elementType == 'expeditiondet' || $elementType == 'shippingdet') {
14980 $classpath = 'expedition/class';
14981 $classfile = 'expedition';
14982 $classname = 'ExpeditionLigne';
14983 $module = 'expedition';
14984 $table_element = 'expeditiondet';
14985 $parent_element = 'expedition';
14986 } elseif ($elementType == 'delivery_note') {
14987 $classpath = 'delivery/class';
14988 $subelement = 'delivery';
14989 $module = 'expedition';
14990 } elseif ($elementType == 'delivery') {
14991 $classpath = 'delivery/class';
14992 $subelement = 'delivery';
14993 $module = 'expedition';
14994 } elseif ($elementType == 'deliverydet') {
14996 } elseif ($elementType == 'supplier_proposal') {
14997 $classpath = 'supplier_proposal/class';
14998 $module = 'supplier_proposal';
14999 $element = 'supplierproposal';
15000 $classfile = 'supplier_proposal';
15001 $subelement = 'supplierproposal';
15002 } elseif ($elementType == 'supplier_proposaldet') {
15003 $classpath = 'supplier_proposal/class';
15004 $module = 'supplier_proposal';
15005 $classfile = 'supplier_proposal';
15006 $classname = 'SupplierProposalLine';
15007 $table_element = 'supplier_proposaldet';
15008 $parent_element = 'supplier_proposal';
15009 } elseif ($elementType == 'contract') {
15010 $classpath = 'contrat/class';
15011 $module = 'contrat';
15012 $subelement = 'contrat';
15013 $table_element = 'contract';
15014 } elseif ($elementType == 'contratdet') {
15015 $classpath = 'contrat/class';
15016 $module = 'contrat';
15017 $table_element = 'contratdet';
15018 $parent_element = 'contrat';
15019 } elseif ($elementType == 'mailing') {
15020 $classpath = 'comm/mailing/class';
15021 $module = 'mailing';
15022 $classfile = 'mailing';
15023 $classname = 'Mailing';
15025 } elseif ($elementType == 'member' || $elementType == 'adherent') {
15026 $classpath = 'adherents/class';
15027 $module = 'adherent';
15028 $subelement = 'adherent';
15029 $table_element = 'adherent';
15030 } elseif ($elementType == 'subscription') {
15031 $classpath = 'adherents/class';
15032 $classfile = 'subscription';
15033 $module = 'adherent';
15034 $subelement = 'subscription';
15035 $classname = 'Subscription';
15036 $table_element = 'subscription';
15037 } elseif ($elementType == 'usergroup') {
15038 $classpath = 'user/class';
15040 } elseif ($elementType == 'mo' || $elementType == 'mrp') {
15041 $classpath = 'mrp/class';
15046 $table_element = 'mrp_mo';
15047 } elseif ($elementType == 'mrp_production') {
15048 $classpath = 'mrp/class';
15050 $classname = 'MoLine';
15053 $table_element = 'mrp_production';
15054 $parent_element = 'mo';
15055 } elseif ($elementType == 'cabinetmed_cons') {
15056 $classpath = 'cabinetmed/class';
15057 $module = 'cabinetmed';
15058 $subelement = 'cabinetmedcons';
15059 $table_element = 'cabinetmedcons';
15060 } elseif ($elementType == 'fichinter') {
15061 $classpath = 'fichinter/class';
15062 $module = 'ficheinter';
15063 $subelement = 'fichinter';
15064 $table_element = 'fichinter';
15065 } elseif ($elementType == 'dolresource' || $elementType == 'resource') {
15066 $classpath = 'resource/class';
15067 $module = 'resource';
15068 $subelement = 'dolresource';
15069 $table_element = 'resource';
15070 } elseif ($elementType == 'opensurvey_sondage') {
15071 $classpath = 'opensurvey/class';
15072 $module = 'opensurvey';
15073 $subelement = 'opensurveysondage';
15074 } elseif ($elementType == 'order_supplier' || $elementType == 'supplier_order' || $elementType == 'commande_fournisseur' || $elementType == 'commandefournisseur') {
15075 $classpath = 'fourn/class';
15076 $module = 'fournisseur';
15077 $classfile = 'fournisseur.commande';
15078 $element = 'order_supplier';
15080 $classname = 'CommandeFournisseur';
15081 $table_element = 'commande_fournisseur';
15082 } elseif ($elementType == 'commande_fournisseurdet') {
15083 $classpath = 'fourn/class';
15084 $module = 'fournisseur';
15085 $classfile = 'fournisseur.commande';
15086 $element = 'commande_fournisseurdet';
15088 $classname = 'CommandeFournisseurLigne';
15089 $table_element = 'commande_fournisseurdet';
15090 $parent_element = 'commande_fournisseur';
15091 } elseif ($elementType == 'invoice_supplier' || $elementType == 'supplier_invoice' || $elementType == 'facture_fourn') {
15092 $classpath = 'fourn/class';
15093 $module = 'fournisseur';
15094 $classfile = 'fournisseur.facture';
15095 $element = 'invoice_supplier';
15097 $classname = 'FactureFournisseur';
15098 $table_element = 'facture_fourn';
15099 } elseif ($elementType == 'facture_fourn_det') {
15100 $classpath = 'fourn/class';
15101 $module = 'fournisseur';
15102 $classfile = 'fournisseur.facture';
15103 $element = 'facture_fourn_det';
15105 $classname = 'SupplierInvoiceLine';
15106 $table_element = 'facture_fourn_det';
15107 $parent_element = 'invoice_supplier';
15108 } elseif ($elementType == "service
") {
15109 $classpath = 'product/class';
15110 $subelement = 'product';
15111 $table_element = 'product';
15112 } elseif ($elementType == 'salary') {
15113 $classpath = 'salaries/class';
15114 $module = 'salaries';
15115 } elseif ($elementType == 'payment_salary') {
15116 $classpath = 'salaries/class';
15117 $classfile = 'paymentsalary';
15118 $classname = 'PaymentSalary';
15119 $module = 'salaries';
15120 } elseif ($elementType == 'productlot') {
15121 $module = 'productbatch';
15122 $classpath = 'product/stock/class';
15123 $classfile = 'productlot';
15124 $classname = 'Productlot';
15125 $element = 'productlot';
15127 $table_element = 'product_lot';
15128 } elseif ($elementType == 'societeaccount') {
15129 $classpath = 'societe/class';
15130 $classfile = 'societeaccount';
15131 $classname = 'SocieteAccount';
15132 $module = 'societe';
15133 } elseif ($elementType == 'websitepage' || $elementType == 'website_page') {
15134 $classpath = 'website/class';
15135 $classfile = 'websitepage';
15136 $classname = 'Websitepage';
15137 $module = 'website';
15138 $subelement = 'websitepage';
15139 $table_element = 'website_page';
15140 } elseif ($elementType == 'fiscalyear') {
15141 $classpath = 'core/class';
15142 $module = 'accounting';
15143 $subelement = 'fiscalyear';
15144 } elseif ($elementType == 'chargesociales') {
15145 $classpath = 'compta/sociales/class';
15147 $table_element = 'chargesociales';
15148 } elseif ($elementType == 'tva') {
15149 $classpath = 'compta/tva/class';
15152 $table_element = 'tva';
15153 } elseif ($elementType == 'emailsenderprofile') {
15155 $classpath = 'core/class';
15156 $classfile = 'emailsenderprofile';
15157 $classname = 'EmailSenderProfile';
15158 $table_element = 'c_email_senderprofile';
15160 } elseif ($elementType == 'conferenceorboothattendee') {
15161 $classpath = 'eventorganization/class';
15162 $classfile = 'conferenceorboothattendee';
15163 $classname = 'ConferenceOrBoothAttendee';
15164 $module = 'eventorganization';
15165 } elseif ($elementType == 'conferenceorbooth') {
15166 $classpath = 'eventorganization/class';
15167 $classfile = 'conferenceorbooth';
15168 $classname = 'ConferenceOrBooth';
15169 $module = 'eventorganization';
15170 } elseif ($elementType == 'ccountry') {
15172 $classpath = 'core/class';
15173 $classfile = 'ccountry';
15174 $classname = 'Ccountry';
15175 $table_element = 'c_country';
15177 } elseif ($elementType == 'ecmfiles') {
15179 $classpath = 'ecm/class';
15180 $classfile = 'ecmfiles';
15181 $classname = 'Ecmfiles';
15182 $table_element = 'ecmfiles';
15184 } elseif ($elementType == 'knowledgerecord' || $elementType == 'knowledgemanagement') {
15185 $module = 'knowledgemanagement';
15186 $classpath = 'knowledgemanagement/class';
15187 $classfile = 'knowledgerecord';
15188 $classname = 'KnowledgeRecord';
15189 $table_element = 'knowledgemanagement_knowledgerecord';
15191 } elseif ($elementType == 'customer') {
15192 $module = 'societe';
15193 $classpath = 'societe/class';
15194 $classfile = 'client';
15195 $classname = 'Client';
15196 $table_element = 'societe';
15198 } elseif ($elementType == 'fournisseur' || $elementType == 'supplier') {
15199 $module = 'societe';
15200 $classpath = 'fourn/class';
15201 $classfile = 'fournisseur';
15202 $classname = 'Fournisseur';
15203 $table_element = 'societe';
15205 } elseif ($elementType == 'recruitmentcandidature') {
15206 $module = 'recruitment';
15207 $classfile = 'recruitmentcandidature';
15208 $classpath = 'recruitment/class';
15209 $classname = 'RecruitmentCandidature';
15210 $subelement = 'recruitmentcandidature';
15211 $subdir = '/recruitmentcandidature';
15212 } elseif ($elementType == 'recruitmentjobposition') {
15213 $module = 'recruitment';
15214 $classfile = 'recruitmentjobposition';
15215 $classpath = 'recruitment/class';
15216 $classname = 'RecruitmentJobPosition';
15217 $subelement = 'recruitmentjobposition';
15218 $subdir = '/recruitmentjobposition';
15222 if (empty($classfile)) {
15223 $classfile = strtolower($subelement);
15225 if (empty($classname)) {
15226 $classname = ucfirst($subelement);
15228 if (empty($classpath)) {
15229 $classpath = $module . '/class';
15232 //print 'getElementProperties subdir='.$subdir;
15235 if ($module && isset($conf->$module)) { // The generic case
15236 if (!empty($conf->$module->multidir_output[$conf->entity])) {
15237 $dir_output = $conf->$module->multidir_output[$conf->entity];
15238 } elseif (!empty($conf->$module->output[$conf->entity])) {
15239 $dir_output = $conf->$module->output[$conf->entity];
15240 } elseif (!empty($conf->$module->dir_output)) {
15241 $dir_output = $conf->$module->dir_output;
15243 if (!empty($conf->$module->multidir_temp[$conf->entity])) {
15244 $dir_temp = $conf->$module->multidir_temp[$conf->entity];
15245 } elseif (!empty($conf->$module->temp[$conf->entity])) {
15246 $dir_temp = $conf->$module->temp[$conf->entity];
15247 } elseif (!empty($conf->$module->dir_temp)) {
15248 $dir_temp = $conf->$module->dir_temp;
15252 // Overwrite value for special cases
15253 if ($element == 'order_supplier' && isModEnabled('fournisseur')) {
15254 $dir_output = $conf->fournisseur->commande->dir_output;
15255 $dir_temp = $conf->fournisseur->commande->dir_temp;
15256 } elseif ($element == 'invoice_supplier' && isModEnabled('fournisseur')) {
15257 $dir_output = $conf->fournisseur->facture->dir_output;
15258 $dir_temp = $conf->fournisseur->facture->dir_temp;
15260 $dir_output .= $subdir;
15261 $dir_temp .= $subdir;
15263 $elementProperties = array(
15264 'module' => $module,
15265 'element' => $element,
15266 'table_element' => $table_element,
15267 'subelement' => $subelement,
15268 'classpath' => $classpath,
15269 'classfile' => $classfile,
15270 'classname' => $classname,
15271 'dir_output' => $dir_output,
15272 'dir_temp' => $dir_temp,
15273 'parent_element' => $parent_element,
15278 if (!is_object($hookmanager)) {
15279 include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
15280 $hookmanager = new HookManager($db);
15282 $hookmanager->initHooks(array('elementproperties'));
15286 $parameters = array(
15287 'elementType' => $elementType,
15288 'elementProperties' => $elementProperties
15291 $reshook = $hookmanager->executeHooks('getElementProperties', $parameters);
15294 $elementProperties = $hookmanager->resArray;
15295 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for sécurity against misconfigured external modules
15296 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
15299 // context of elementproperties doesn't need to exist out of this function so delete it to avoid elementproperties context is equal to all
15300 if (($key = array_search('elementproperties', $hookmanager->contextarray)) !== false) {
15301 unset($hookmanager->contextarray[$key]);
15304 return $elementProperties;
15319function fetchObjectByElement($element_id, $element_type, $element_ref = '', $useCache = 0, $maxCacheByType = 10)
15325 $element_prop = getElementProperties($element_type);
15327 if ($element_prop['module'] == 'product' || $element_prop['module'] == 'service') {
15328 // For example, for an extrafield 'product' (shared for both product and service) that is a link to an object,
15329 // this is called with $element_type = 'product' when we need element properties of a service, we must return a product. If we create the
15330 // extrafield for a service, it is not supported and not found when editing the product/service card. So we must keep 'product' for extrafields
15331 // of service and we will return properties of a product.
15332 $ismodenabled = (isModEnabled('product') || isModEnabled('service'));
15333 } elseif ($element_prop['module'] == 'societeaccount') {
15334 $ismodenabled = isModEnabled('website') || isModEnabled('webportal');
15336 $ismodenabled = isModEnabled($element_prop['module']);
15338 //var_dump('element_type='.$element_type);
15339 //var_dump($element_prop);
15340 //var_dump($element_prop['module'].' '.$ismodenabled);
15341 if (is_array($element_prop) && (empty($element_prop['module']) || $ismodenabled)) {
15342 if ($useCache === 1 && $element_id > 0
15343 && !empty($conf->cache['fetchObjectByElement'][$element_type])
15344 && !empty($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15345 && is_object($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15347 return $conf->cache['fetchObjectByElement'][$element_type][$element_id];
15350 dol_include_once('/' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15352 if (class_exists($element_prop['classname'])) {
15353 $className = $element_prop['classname'];
15354 $objecttmp = new $className($db);
15355 '@phan-var-force CommonObject $objecttmp';
15358 if ($element_id > 0 || !empty($element_ref)) {
15359 $ret = $objecttmp->fetch($element_id, $element_ref);
15361 if (empty($objecttmp->module)) {
15362 $objecttmp->module = $element_prop['module'];
15365 if ($useCache > 0) {
15366 if (!isset($conf->cache['fetchObjectByElement'][$element_type])) {
15367 $conf->cache['fetchObjectByElement'][$element_type] = [];
15370 // Manage cache limit
15371 if (! empty($conf->cache['fetchObjectByElement'][$element_type]) && is_array($conf->cache['fetchObjectByElement'][$element_type]) && count($conf->cache['fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
15372 array_shift($conf->cache['fetchObjectByElement'][$element_type]);
15375 $conf->cache['fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
15381 return $objecttmp; // returned an object without fetch
15384 dol_syslog($element_prop['classname'] . ' doesn\'t exists in /' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15397function getExecutableContent()
15399 $arrayofregexextension = array(
15426 return $arrayofregexextension;
15435function isAFileWithExecutableContent($filename)
15437 $arrayofregexextension = getExecutableContent();
15439 foreach ($arrayofregexextension as $fileextension) {
15440 if (preg_match('/\.' . preg_quote($fileextension, '/') . '$/i', $filename)) {
15457 return empty($_SESSION['newtoken']) ? '' : $_SESSION['newtoken'];
15467function currentToken()
15469 return isset($_SESSION['token']) ? $_SESSION['token'] : '';
15481 if (empty($conf->cache['nonce'])) {
15482 include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php';
15483 $conf->cache['nonce'] = dolGetRandomBytes(8);
15486 return $conf->cache['nonce'];
15503function startSimpleTable($header, $link = "
", $arguments = "", $emptyColumns = 0, $number = -1, $pictofulllist = '')
15507 print '<div class="div-
table-responsive-no-min
">';
15508 print '<table class="noborder centpercent
">';
15509 print '<tr class="liste_titre
">';
15511 print ($emptyColumns < 1) ? '<th>' : '<th colspan="' . ($emptyColumns + 1) . '">';
15513 print '<span class="valignmiddle
">' . $langs->trans($header) . '</span>';
15515 if (!empty($link)) {
15516 if (!empty($arguments)) {
15517 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '?
' . $arguments . '">';
15519 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '">';
15523 if ($number > -1) {
15524 print '<span class="badge marginleftonlyshort
">' . $number . '</span>';
15525 } elseif (!empty($link)) {
15526 print '<span class="badge marginleftonlyshort
">...</span>';
15529 if (!empty($link)) {
15535 if ($number < 0 && !empty($link)) {
15536 print '<th class="right
">';
15551function finishSimpleTable($addLineBreak = false)
15556 if ($addLineBreak) {
15572function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord = "None
", $extraRightColumn = false)
15577 print '<tr class="oddeven
">';
15578 print '<td colspan="' . $tableColumnCount . '"><span class="opacitymedium
">' . $langs->trans($noneWord) . '</span></td>';
15583 if ($nbofloop === 0) {
15584 // don't show a summary line
15588 /* Case already handled above, commented to satisfy phpstan.
15590 $colspan = $tableColumnCount;
15593 if ($num > $nbofloop) {
15594 $colspan = $tableColumnCount;
15596 $colspan = $tableColumnCount - 1;
15599 if ($extraRightColumn) {
15603 print '<tr class="liste_total
">';
15605 if ($nbofloop > 0 && $num > $nbofloop) {
15606 print '<td colspan="' . $colspan . '" class="right
">' . $langs->trans("XMoreLines
", ($num - $nbofloop)) . '</td>';
15608 print '<td colspan="' . $colspan . '" class="right
"> ' . $langs->trans("Total
") . '</td>';
15609 print '<td class="right centpercent
">' . price($total) . '</td>';
15612 if ($extraRightColumn) {
15627function readfileLowMemory($fullpath_original_file_osencoded, $method = -1)
15629 if ($method == -1) {
15631 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_FREAD')) {
15634 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_STREAM_COPY')) {
15639 // Be sure we don't have output buffering enabled to have readfile working correctly
15640 while (ob_get_level()) {
15645 if ($method == 0) {
15646 readfile($fullpath_original_file_osencoded);
15647 } elseif ($method == 1) {
15649 $handle = fopen($fullpath_original_file_osencoded, "rb
");
15650 while (!feof($handle)) {
15651 print fread($handle, 8192);
15654 } elseif ($method == 2) {
15656 $handle1 = fopen($fullpath_original_file_osencoded, "rb
");
15657 $handle2 = fopen("php:
15658 stream_copy_to_stream($handle1, $handle2);
15679 $result =
'<span class="clipboardCP' . ($showonlyonhover ?
' clipboardCPShowOnHover valignmiddle' :
'') .
'">';
15680 if ($texttoshow ===
'none') {
15681 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15682 $result .=
'<span class="clipboardCPValueToPrint"></span>';
15683 } elseif ($texttoshow) {
15684 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15685 $result .=
'<span class="clipboardCPValueToPrint">' .
dol_escape_htmltag($texttoshow, 1, 1) .
'</span>';
15687 $result .=
'<' . $tag .
' class="clipboardCPValue">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15689 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="' .
dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")) .
'"></span>';
15690 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
15691 $result .=
'<span class="clipboardCPText"></span>';
15692 $result .=
'</span>';
15707 $result = json_decode($stringtodecode, $assoc);
15708 if ($result ===
null) {
15709 $result = unserialize($stringtodecode);
15736 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
15739 if (!preg_match(
'/^\(.*\)$/', $filter)) {
15740 $filter =
'(' . $filter .
')';
15743 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
15744 $firstandlastparenthesis = 0;
15746 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
15750 return 'Filter syntax error - ' . $errorstr;
15755 $t = preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeDummyCriteriaCallback', $filter);
15756 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
15759 if (preg_match(
'/[^\(\)]/', $t)) {
15760 $tmperrorstr =
'Bad syntax of the search string';
15761 $errorstr =
'Bad syntax of the search string: ' . $filter;
15765 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - " . $errorstr, LOG_WARNING);
15766 return 'Filter error - ' . $tmperrorstr;
15770 $ret = ($noand ?
"" :
" AND ") . ($nopar ?
"" :
'(') . preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeSQLCriteriaCallback', $filter) . ($nopar ?
"" :
')');
15772 if (is_object($db)) {
15773 $ret = str_replace(
'__NOW__',
"'" . $db->idate(
dol_now()) .
"'", $ret);
15775 if (is_object($user)) {
15776 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
15791 $arrayofandtags = array();
15795 $parenthesislevel = 0;
15800 if ($parenthesislevel >= 1) {
15801 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
15806 $countparenthesis = 0;
15807 while ($i < $nbofchars) {
15810 if ($char ==
'(') {
15811 $countparenthesis++;
15812 } elseif ($char ==
')') {
15813 $countparenthesis--;
15816 if ($countparenthesis == 0) {
15817 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
15818 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
15819 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
15822 if (!preg_match(
'/^\(.*\)$/', $s)) {
15823 $s =
'(' . $s .
')';
15825 $arrayofandtags[] = $s;
15838 if (!preg_match(
'/^\(.*\)$/', $s)) {
15839 $s =
'(' . $s .
')';
15841 $arrayofandtags[] = $s;
15844 return $arrayofandtags;
15856function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
15860 $tmp = $sqlfilters;
15864 $parenthesislevel = 0;
15872 if ($char ==
'(') {
15873 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
15875 $parenthesislevel++;
15878 } elseif ($char ==
')') {
15879 $nbcharremaining = ($nb - $i - 1);
15880 if ($nbcharremaining >= $counter) {
15881 $parenthesislevel = min($parenthesislevel, $counter - 1);
15883 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
15884 $parenthesislevel = $counter;
15889 if ($counter < 0) {
15890 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
15891 $parenthesislevel = 0;
15899 if ($counter > 0) {
15900 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
15901 $parenthesislevel = 0;
15919 if (empty($matches[1])) {
15922 $tmp = explode(
':', $matches[1]);
15923 if (count($tmp) < 3) {
15943 if (empty($matches[1])) {
15946 $tmp = explode(
':', $matches[1], 3);
15947 if (count($tmp) < 3) {
15951 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
15953 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
15956 'NOTLIKE' =>
'NOT LIKE',
15957 'ISNOT' =>
'IS NOT',
15958 'NOTIN' =>
'NOT IN',
15962 if (array_key_exists($operator, $realOperator)) {
15963 $operator = $realOperator[$operator];
15966 $tmpescaped = $tmp[2];
15972 if ($operator ==
'IN' || $operator ==
'NOT IN') {
15974 $tmpescaped2 =
'(';
15976 $tmpelemarray = explode(
',', $tmpescaped);
15977 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
15979 $tmpelem = trim($tmpelem);
15980 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
15981 $tmpelemarray[$tmpkey] =
"'" . $db->escape($db->sanitize($reg[1], 2, 1, 1, 1)) .
"'";
15982 } elseif (ctype_digit((
string) $tmpelem)) {
15983 $tmpelemarray[$tmpkey] = (int) $tmpelem;
15984 } elseif (is_numeric((
string) $tmpelem)) {
15985 $tmpelemarray[$tmpkey] = (float) $tmpelem;
15986 } elseif (!
getDolGlobalString(
"MAIN_DISALLOW_UNSECURED_SELECT_INTO_EXTRAFIELDS_FILTER")) {
15987 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_<>=!\s]/i',
'', $tmpelem);
15989 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpelem);
15992 $tmpescaped2 .= implode(
',', $tmpelemarray);
15993 $tmpescaped2 .=
')';
15995 $tmpescaped = $tmpescaped2;
15996 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
15997 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
15998 $tmpescaped = $regbis[1];
16001 $tmpescaped =
"'" . $db->escape($tmpescaped) .
"'";
16002 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
16005 $tmpescaped =
"'" . $db->escape($regbis[1]) .
"'";
16007 if (strtoupper($tmpescaped) ==
'NULL') {
16008 $tmpescaped =
'NULL';
16009 } elseif (ctype_digit((
string) $tmpescaped)) {
16010 $tmpescaped = (int) $tmpescaped;
16011 } elseif (is_numeric((
string) $tmpescaped)) {
16012 $tmpescaped = (float) $tmpescaped;
16014 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
16018 return '(' . $db->escape($operand) .
' ' . strtoupper($operator) .
' ' . $tmpescaped .
')';
16035 $out =
'<!-- timeline icon -->' .
"\n";
16036 $iconClass =
'fa fa-comments';
16041 if ($histo[$key][
'percent'] == -1) {
16042 $colorClass =
'timeline-icon-not-applicble';
16043 $pictoTitle = $langs->trans(
'StatusNotApplicable');
16044 } elseif ($histo[$key][
'percent'] == 0) {
16045 $colorClass =
'timeline-icon-todo';
16046 $pictoTitle = $langs->trans(
'StatusActionToDo') .
' (0%)';
16047 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
16048 $colorClass =
'timeline-icon-in-progress';
16049 $pictoTitle = $langs->trans(
'StatusActionInProcess') .
' (' . $histo[$key][
'percent'] .
'%)';
16050 } elseif ($histo[$key][
'percent'] >= 100) {
16051 $colorClass =
'timeline-icon-done';
16052 $pictoTitle = $langs->trans(
'StatusActionDone') .
' (100%)';
16055 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
16056 $iconClass =
'fa fa-ticket';
16057 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
16058 $iconClass =
'fa fa-pencilxxx';
16059 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16060 $iconClass =
'fa fa-comments';
16061 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16062 $iconClass =
'fa fa-mask';
16064 if ($actionstatic->type_picto) {
16065 $img_picto =
img_picto(
'', $actionstatic->type_picto);
16067 if ($actionstatic->type_code ==
'AC_RDV') {
16068 $iconClass =
'fa fa-handshake';
16069 } elseif ($actionstatic->type_code ==
'AC_TEL') {
16070 $iconClass =
'fa fa-phone';
16071 } elseif ($actionstatic->type_code ==
'AC_FAX') {
16072 $iconClass =
'fa fa-fax';
16073 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
16074 $iconClass =
'fa fa-envelope';
16075 } elseif ($actionstatic->type_code ==
'AC_INT') {
16076 $iconClass =
'fa fa-shipping-fast';
16077 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
16078 $iconClass =
'fa fa-robot';
16079 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
16080 $iconClass =
'fa fa-robot';
16085 $out .=
'<i class="' . $iconClass .
' ' . $colorClass .
'" title="' . $pictoTitle .
'">' . $img_picto .
'</i>' .
"\n";
16099 $documents = array();
16101 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename, ecm.agenda_id';
16102 $sql .=
' FROM ' . MAIN_DB_PREFIX .
'ecm_files ecm';
16103 $sql .=
" WHERE ecm.filepath = 'agenda/" . ((int)
$object->id) .
"'";
16105 $sql .=
' OR ecm.agenda_id = ' . (int)
$object->id;
16106 $sql .=
' ORDER BY ecm.position ASC';
16108 $resql = $db->query($sql);
16110 if ($db->num_rows($resql)) {
16111 while ($obj = $db->fetch_object($resql)) {
16112 $documents[$obj->id] = $obj;
16138function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
16140 global $user, $conf;
16143 global $param, $massactionbutton;
16145 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16148 if (!is_object($filterobj) && !is_object($objcon)) {
16153 '@phan-var-force array<int,array{type:string,tododone:string,id:string,datestart:int|string,dateend:int|string,note:string,message:string,percent:string,userid:string,login:string,userfirstname:string,userlastname:string,userphoto:string,msg_from?:string,contact_id?:string,socpeopleassigned?:int[],lastname?:string,firstname?:string,fk_element?:int,elementtype?:string,acode:string,alabel?:string,libelle?:string,apicto?:string}> $histo';
16158 $sortfield_list = explode(
',', $sortfield);
16159 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
16160 $sortfield_new_list = array();
16161 foreach ($sortfield_list as $sortfield_value) {
16162 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
16164 $sortfield_new = implode(
',', $sortfield_new_list);
16171 if (is_object($objcon) && $objcon->id > 0) {
16172 $sql =
"SELECT DISTINCT a.id, a.label as label,";
16174 $sql =
"SELECT a.id, a.label as label,";
16176 $sql .=
" a.datep as dp,";
16177 $sql .=
" a.note as message,";
16178 $sql .=
" a.datep2 as dp2,";
16179 $sql .=
" a.percent as percent, 'action' as type,";
16180 $sql .=
" a.fk_element, a.elementtype,";
16181 $sql .=
" a.fk_contact,";
16182 $sql .=
" a.email_from as msg_from,";
16183 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
16184 $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";
16185 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16186 $sql .=
", sp.lastname, sp.firstname";
16187 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16188 $sql .=
", m.lastname, m.firstname";
16189 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur',
'Propal',
'Expedition'))) {
16192 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16196 $sql .=
" FROM " . MAIN_DB_PREFIX .
"actioncomm as a";
16197 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"user as u on u.rowid = a.fk_user_action";
16198 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_actioncomm as c ON a.fk_action = c.id";
16200 $force_filter_contact = $filterobj instanceof
User;
16202 if (is_object($objcon) && $objcon->id > 0) {
16203 $force_filter_contact =
true;
16204 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
16205 $sql .=
" AND r.element_type = '" . $db->escape($objcon->table_element) .
"' AND r.fk_element = " . ((int) $objcon->id);
16208 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
16209 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"socpeople as sp ON a.fk_contact = sp.rowid";
16210 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
16211 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"element_resources as er";
16212 $sql .=
" ON er.resource_type = 'dolresource'";
16213 $sql .=
" AND er.element_id = a.id";
16214 $sql .=
" AND er.resource_id = " . ((int) $filterobj->id);
16215 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16216 $sql .=
", " . MAIN_DB_PREFIX .
"adherent as m";
16217 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16218 $sql .=
", " . MAIN_DB_PREFIX .
"commande_fournisseur as o";
16219 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16220 $sql .=
", " . MAIN_DB_PREFIX .
"product as o";
16221 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16222 $sql .=
", " . MAIN_DB_PREFIX .
"ticket as o";
16223 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16224 $sql .=
", " . MAIN_DB_PREFIX .
"bom_bom as o";
16225 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16226 $sql .=
", " . MAIN_DB_PREFIX .
"contrat as o";
16227 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16228 $sql .=
", " . MAIN_DB_PREFIX .
"facture as o";
16229 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16230 $sql .=
", " . MAIN_DB_PREFIX .
"facture_fourn as o";
16231 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16232 $sql .=
", " . MAIN_DB_PREFIX .
"commande as o";
16233 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16234 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as o";
16235 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16236 $sql .=
", " . MAIN_DB_PREFIX .
"propal as o";
16238 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16239 $sql .=
", " . MAIN_DB_PREFIX . $filterobj->table_element .
" as o";
16242 $sql .=
" WHERE a.entity IN (" .
getEntity(
'agenda') .
")";
16243 if (!$force_filter_contact) {
16244 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
16245 $sql .=
" AND a.fk_soc = " . ((int) $filterobj->id);
16246 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
16247 $sql .=
" AND a.fk_project = o.rowid AND a.fk_project = " . ((int) $filterobj->id);
16248 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16249 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
16250 if ($filterobj->id) {
16251 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16253 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16254 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
16255 if ($filterobj->id) {
16256 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16258 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16259 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'shipping'";
16260 if ($filterobj->id) {
16261 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16263 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16264 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'propal'";
16265 if ($filterobj->id) {
16266 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16268 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16269 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
16270 if ($filterobj->id) {
16271 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16273 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16274 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
16275 if ($filterobj->id) {
16276 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16278 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16279 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
16280 if ($filterobj->id) {
16281 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16283 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16284 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
16285 if ($filterobj->id) {
16286 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16288 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16289 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
16290 if ($filterobj->id) {
16291 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16293 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
16294 $sql .=
" AND a.fk_contact = sp.rowid";
16295 if ($filterobj->id) {
16296 $sql .=
" AND a.fk_contact = " . ((int) $filterobj->id);
16298 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16299 $sql .=
" AND a.fk_element = o.rowid";
16300 if ($filterobj->id) {
16301 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice'";
16303 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16304 $sql .=
" AND a.fk_element = o.rowid";
16305 if ($filterobj->id) {
16306 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice_supplier'";
16309 if (is_object($filterobj) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16310 $sql .=
" AND a.fk_element = o.rowid";
16311 $sql .=
" AND a.elementtype = '" . $db->escape($filterobj->element) .
"'";
16312 if ($filterobj->id) {
16313 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16318 $sql .=
" AND u.rowid = " . ((int) $filterobj->id);
16322 if (!empty($actioncode) && $actioncode !=
'-1') {
16324 if ($actioncode ==
'AC_NON_AUTO') {
16325 $sql .=
" AND c.type != 'systemauto'";
16326 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16327 $sql .=
" AND c.type = 'systemauto'";
16329 if ($actioncode ==
'AC_OTH') {
16330 $sql .=
" AND c.type != 'systemauto'";
16331 } elseif ($actioncode ==
'AC_OTH_AUTO') {
16332 $sql .=
" AND c.type = 'systemauto'";
16336 if ($actioncode ==
'AC_NON_AUTO') {
16337 $sql .=
" AND c.type != 'systemauto'";
16338 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16339 $sql .=
" AND c.type = 'systemauto'";
16341 $sql .=
" AND c.code = '" . $db->escape($actioncode) .
"'";
16345 if ($donetodo ==
'todo') {
16346 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '" . $db->idate($now) .
"'))";
16347 } elseif ($donetodo ==
'done') {
16348 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '" . $db->idate($now) .
"'))";
16350 if (is_array($filters) && $filters[
'search_agenda_label']) {
16351 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
16358 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')
16360 $langs->load(
"mails");
16362 $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";
16363 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
16364 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
16365 $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";
16366 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16367 $sql2 .=
", '' as lastname, '' as firstname";
16368 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16369 $sql2 .=
", '' as lastname, '' as firstname";
16370 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16371 $sql2 .=
", '' as ref";
16372 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16373 $sql2 .=
", '' as ref";
16374 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16375 $sql2 .=
", '' as ref";
16377 $sql2 .=
" FROM " . MAIN_DB_PREFIX .
"mailing as m, " . MAIN_DB_PREFIX .
"mailing_cibles as mc, " . MAIN_DB_PREFIX .
"user as u";
16378 $sql2 .=
" WHERE mc.email = '" . $db->escape($objcon->email) .
"'";
16379 $sql2 .=
" AND mc.statut = 1";
16380 $sql2 .=
" AND u.rowid = m.fk_user_valid";
16381 $sql2 .=
" AND mc.fk_mailing=m.rowid";
16385 $MAXWITHOUTPAGINATION =
getDolGlobalInt(
'AGENDA_MAX_EVENTS_ON_PAGE_WITHOUT_PAGINATION', 100);
16387 if ($sql || $sql2) {
16388 if (!empty($sql) && !empty($sql2)) {
16389 $sql = $sql .
" UNION " . $sql2;
16390 } elseif (empty($sql) && !empty($sql2)) {
16396 $limit = $MAXWITHOUTPAGINATION;
16399 $sql .= $db->order($sortfield_new, $sortorder);
16401 $sql .= $db->plimit($limit + 1, $offset);
16404 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
16406 $resql = $db->query($sql);
16409 $num = $db->num_rows($resql);
16411 $imaxinloop = ($limit ? min($num, $limit) : $num);
16412 while ($i < $imaxinloop) {
16413 $obj = $db->fetch_object($resql);
16415 if ($obj->type ==
'action') {
16417 $contactaction->id = $obj->id;
16418 $result = $contactaction->fetchResources();
16421 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
16427 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
16428 $tododone =
'todo';
16431 $histo[$numaction] = array(
16432 'type' => $obj->type,
16433 'tododone' => $tododone,
16435 'datestart' => $db->jdate($obj->dp),
16436 'dateend' => $db->jdate($obj->dp2),
16437 'note' => $obj->label,
16438 'message' => $obj->message,
16439 'percent' => $obj->percent,
16441 'userid' => $obj->user_id,
16442 'login' => $obj->user_login,
16443 'userfirstname' => $obj->user_firstname,
16444 'userlastname' => $obj->user_lastname,
16445 'userphoto' => $obj->user_photo,
16446 'msg_from' => $obj->msg_from,
16448 'contact_id' => $obj->fk_contact,
16449 'socpeopleassigned' => $contactaction->socpeopleassigned,
16450 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
16451 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
16452 'fk_element' => $obj->fk_element,
16453 'elementtype' => $obj->elementtype,
16455 'acode' => $obj->acode,
16456 'alabel' => $obj->alabel,
16457 'libelle' => $obj->alabel,
16458 'apicto' => $obj->apicto
16461 $histo[$numaction] = array(
16462 'type' => $obj->type,
16463 'tododone' =>
'done',
16465 'datestart' => $db->jdate($obj->dp),
16466 'dateend' => $db->jdate($obj->dp2),
16467 'note' => $obj->label,
16468 'message' => $obj->message,
16469 'percent' => $obj->percent,
16470 'acode' => $obj->acode,
16472 'userid' => $obj->user_id,
16473 'login' => $obj->user_login,
16474 'userfirstname' => $obj->user_firstname,
16475 'userlastname' => $obj->user_lastname,
16476 'userphoto' => $obj->user_photo
16492 $langs->loadLangs(array(
"admin",
"errors"));
16493 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
16497 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
16499 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16500 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
16501 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
16502 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
16507 $userstatic =
new User($db);
16508 $contactstatic =
new Contact($db);
16509 $userGetNomUrlCache = array();
16510 $contactGetNomUrlCache = array();
16512 $out .=
'<div class="filters-container" >';
16513 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
16514 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
16517 $objcon && get_class($objcon) ==
'Contact' &&
16518 (is_null($filterobj) || get_class($filterobj) ==
'Societe')
16520 $out .=
'<input type="hidden" name="id" value="' . $objcon->id .
'" />';
16522 $out .=
'<input type="hidden" name="id" value="' . $filterobj->id .
'" />';
16524 if (($filterobj && get_class($filterobj) ==
'Societe')) {
16525 $out .=
'<input type="hidden" name="socid" value="' . $filterobj->id .
'" />';
16527 $out .=
'<input type="hidden" name="userid" value="' . $filterobj->id .
'" />';
16532 $out .=
'<div class="div-table-responsive-no-min">';
16533 $out .=
'<table class="noborder borderbottom centpercent">';
16535 $out .=
'<tr class="liste_titre">';
16539 $out .=
'<th class="liste_titre width50 middle">';
16540 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16541 $out .= $searchpicto;
16546 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ') .
"\n";
16548 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">' . $langs->trans(
"Search") .
' : </strong></th>';
16550 $out .=
'<th class="liste_titre"></th>';
16553 $out .=
'<th class="liste_titre">';
16554 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="' . $langs->trans(
"ActionType") .
'"></span>';
16555 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
16558 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
16559 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="' . $filters[
'search_agenda_label'] .
'" placeholder="' . $langs->trans(
"Label") .
'">';
16564 $out .=
'<th class="liste_titre width50 middle">';
16565 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16566 $out .= $searchpicto;
16572 $out .=
'</table>';
16579 $out .=
'<ul class="timeline">';
16583 if ($filterobj instanceof
Societe) {
16584 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16586 if ($filterobj instanceof
User) {
16587 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16589 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
16590 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
16591 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
16593 if ($filterobj instanceof
Societe) {
16596 if ($filterobj instanceof
User) {
16602 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/cactioncomm.class.php';
16604 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
16606 $actualCycleDate =
false;
16609 foreach ($histo as $key => $value) {
16610 $actionstatic->fetch($histo[$key][
'id']);
16612 $actionstatic->type_picto = $histo[$key][
'apicto'];
16613 $actionstatic->type_code = $histo[$key][
'acode'];
16615 $labeltype = $actionstatic->type_code;
16616 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
16617 $labeltype =
'AC_OTH';
16619 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16620 $labeltype = $langs->trans(
"Message");
16622 if (!empty($arraylist[$labeltype])) {
16623 $labeltype = $arraylist[$labeltype];
16625 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
16626 $labeltype .=
' - ' . $arraylist[$actionstatic->code];
16630 $url = DOL_URL_ROOT .
'/comm/action/card.php?id=' . $histo[$key][
'id'];
16632 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
16634 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'] .
'-' . $tmpa[
'yday']) {
16635 $actualCycleDate = $tmpa[
'year'] .
'-' . $tmpa[
'yday'];
16636 $out .=
'<!-- timeline time label -->';
16637 $out .=
'<li class="time-label">';
16638 $out .=
'<span class="timeline-badge-date">';
16639 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
16642 $out .=
'<!-- /.timeline-label -->';
16646 $out .=
'<!-- timeline item -->' .
"\n";
16647 $out .=
'<li class="timeline-code-' . (!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none") .
'">';
16650 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
16655 $out .=
'<div class="timeline-item">' .
"\n";
16657 $out .=
'<span class="time timeline-header-action2">';
16659 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
16660 $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") .
' ';
16661 $out .= $histo[$key][
'id'];
16664 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle') .
' ';
16668 $user->hasRight(
'agenda',
'allactions',
'create') ||
16669 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))
16671 $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) .
'">';
16673 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
16680 $out .=
'<span class="time"><i class="fa fa-clock valignmiddle"></i> ';
16681 $out .=
'<span class="valignmiddle marginrightonly">';
16682 $out .=
dol_print_date($histo[$key][
'datestart'],
'day',
'tzuserrel');
16685 $out .=
' '.dol_print_date($histo[$key][
'datestart'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
16687 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
16688 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
16689 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
16690 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
16691 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false, 1);
16693 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'day',
'tzuserrel');
16695 $out .=
' '.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
16700 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16703 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16706 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
16709 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16713 $out .=
img_warning($langs->trans(
"Late")) .
' ';
16715 $out .=
"</span></span>\n";
16717 $out .=
'<span class="time">';
16718 $out .= $actionstatic->getLibStatut(2);
16722 $out .=
'<h3 class="timeline-header">';
16725 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
16726 if ($histo[$key][
'userid'] > 0) {
16727 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
16728 $userstatic->fetch($histo[$key][
'userid']);
16729 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
16731 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
16732 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
16733 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
16734 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
16735 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
16737 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
16740 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
16742 $out .=
'<img class="photomemberphoto userphoto" alt="" src="/public/theme/common/user_anonymous.png">'.$langs->trans(
"Anonymous");
16747 $out .=
' <div class="messaging-title inline-block">';
16749 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
16750 $out .= $labeltype .
' - ';
16755 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16756 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
16757 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16758 $out .= $langs->trans(
'TicketNewMessage');
16759 } elseif (isset($histo[$key][
'type'])) {
16760 if ($histo[$key][
'type'] ==
'action') {
16761 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
16762 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
16763 $libelle = $histo[$key][
'note'];
16764 $actionstatic->id = $histo[$key][
'id'];
16765 if ($libelle != $labeltype) {
16768 } elseif ($histo[$key][
'type'] ==
'mailing') {
16769 $out .=
'<a href="' . DOL_URL_ROOT .
'/comm/mailing/card.php?id=' . $histo[$key][
'id'] .
'">' .
img_object($langs->trans(
"ShowEMailing"),
"email") .
' ';
16770 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
16771 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
16774 $libelle .= $histo[$key][
'note'];
16778 $out = preg_replace(
'/ - $/',
'', $out);
16780 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
16781 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
16782 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
16784 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
16785 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
16787 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
16788 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
16791 $out .=
' - ' . $link;
16801 !empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
16802 && $actionstatic->code !=
'AC_TICKET_CREATE'
16803 && $actionstatic->code !=
'AC_TICKET_MODIFY'
16805 $out .=
'<div class="timeline-body wordbreak small">';
16806 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
16809 if ($truncateLines > 0 && strlen($newmess) > strlen($truncatedText)) {
16810 $out .=
'<div class="readmore-block --closed" >';
16811 $out .=
' <div class="readmore-block__excerpt">';
16813 $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>';
16815 $out .=
' <div class="readmore-block__full-text" >';
16817 $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>';
16831 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
16833 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
16834 if (empty($conf->cache[
'contact'][$cid])) {
16836 $contact->fetch($cid);
16837 $conf->cache[
'contact'][$cid] = $contact;
16839 $contact = $conf->cache[
'contact'][$cid];
16843 $contactList .= !empty($contactList) ?
', ' :
'';
16844 $contactList .= $contact->getNomUrl(1);
16845 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
16846 if (!empty($contact->phone_pro)) {
16853 $footer .= $langs->trans(
'ActionOnContact') .
' : ' . $contactList;
16854 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
16855 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
16857 $result = $contact->fetch($histo[$key][
'contact_id']);
16858 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
16860 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
16861 $result = ($contact instanceof
Contact) ? $contact->id : 0;
16865 $footer .= $contact->getNomUrl(1);
16866 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
16867 if (!empty($contact->phone_pro)) {
16875 if (!empty($documents)) {
16876 $footer .=
'<div class="timeline-documents-container">';
16877 foreach ($documents as $doc) {
16878 $footer .=
'<span id="document_' . $doc->id .
'" class="timeline-documents" ';
16879 $footer .=
' data-id="' . $doc->id .
'" ';
16880 $footer .=
' data-path="' . $doc->filepath .
'"';
16884 $filePath = DOL_DATA_ROOT .
'/' . $doc->filepath .
'/' . $doc->filename;
16886 if (empty($doc->agenda_id)) {
16887 $dir_ref = $actionstatic->id;
16888 $modulepart =
'actions';
16890 $split_dir = explode(
'/', $doc->filepath);
16891 $modulepart = array_shift($split_dir);
16892 $dir_ref = implode(
'/', $split_dir);
16895 $file = $dir_ref .
'/' . $doc->filename;
16896 $thumb = $dir_ref .
'/thumbs/' . substr($doc->filename, 0, strrpos($doc->filename,
'.')) .
'_mini' . substr($doc->filename, strrpos($doc->filename,
'.'));
16897 $doclink =
dol_buildpath(
'document.php', 1) .
'?modulepart=' . $modulepart .
'&attachment=0&file=' . urlencode($file) .
'&entity=' . $conf->entity;
16898 $viewlink =
dol_buildpath(
'viewimage.php', 1) .
'?modulepart=' . $modulepart .
'&file=' . urlencode($thumb) .
'&entity=' . $conf->entity;
16902 $mimeAttr =
' mime="' . $mime .
'" ';
16904 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
16905 $class .=
' documentpreview';
16908 $footer .=
'<a href="' . $doclink .
'" class="btn-link ' . $class .
'" target="_blank" rel="noopener noreferrer" ' . $mimeAttr .
' >';
16909 $footer .=
img_mime($filePath) .
' ' . $doc->filename;
16912 $footer .=
'</span>';
16914 $footer .=
'</div>';
16917 if (!empty($footer)) {
16918 $out .=
'<div class="timeline-footer">' . $footer .
'</div>';
16921 $out .=
'</div>' .
"\n";
16924 $out .=
'<!-- END timeline item -->';
16931 jQuery(document).ready(function () {
16932 $(document).on("click", "[data-read-more-action]", function(e){
16933 console.log("We click on data-read-more-action");
16934 let readMoreBloc = $(this).closest(".readmore-block");
16935 if(readMoreBloc.length > 0){
16936 e.preventDefault();
16937 if($(this).attr("data-read-more-action") == "close"){
16938 readMoreBloc.addClass("--closed").removeClass("--open");
16939 $("html, body").animate({
16940 scrollTop: readMoreBloc.offset().top - 200
16943 readMoreBloc.addClass("--open").removeClass("--closed");
16951 if (empty($histo)) {
16952 $out .=
'<span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span>';
16955 if ($num > $MAXWITHOUTPAGINATION) {
16956 $langs->load(
"errors");
16958 $out .=
'<center><span class="opacitymedium">...' . $langs->trans(
"WarningTooManyDataPleaseUseMoreFilters", $MAXWITHOUTPAGINATION) .
'...</span></center>';
16981function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
16983 if ($timestamp ===
null) {
16984 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
16991 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
16992 $TParam = array_merge($TParam, array(
16999 return '&' . http_build_query($TParam);
17020function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
17022 global $conf, $db, $langs, $hookmanager;
17025 if (!is_object($langs)) {
17026 include_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
17028 $langs->setDefaultLang();
17031 $langs->load(
"errors");
17033 if ($printheader) {
17034 if (function_exists(
"llxHeader")) {
17036 } elseif (function_exists(
"llxHeaderVierge")) {
17041 print
'<div class="error">';
17042 if (empty($message)) {
17043 print $langs->trans(
"ErrorRecordNotFound");
17045 print $langs->trans($message);
17050 if (empty($showonlymessage)) {
17051 if (empty($hookmanager)) {
17052 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
17055 $hookmanager->initHooks(array(
'main'));
17058 $parameters = array(
'message' => $message,
'params' => $params);
17059 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
17060 print $hookmanager->resPrint;
17063 if ($printfooter && function_exists(
"llxFooter")) {
17065 if (is_object($db)) {
17104 foreach ($array2 as $key => $value) {
17105 if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
17108 $merged[$key] = $value;
17123 if (!empty($obj->socid)) {
17124 return (
int) $obj->socid;
17125 } elseif (!empty($obj->soc_id)) {
17126 return (
int) $obj->soc_id;
17127 } elseif (!empty($obj->societe_id)) {
17128 return (
int) $obj->societe_id;
$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=[])
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.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert an image file or a PDF into another image format.
dragAndDropFileUpload($htmlname)
Function to manage the drag and drop of a file.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_is_dir($folder)
Test if filename is a directory.
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
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.
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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
getObjectSocId($obj)
Get the socid of an object, supporting legacy attribute names.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
isASecretKey($keyname)
Return if string has a name dedicated to store a secret.
dolPrintHTMLForTextArea($s, $allowiframe=0)
Return a string ready to be output on input textarea.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_eval_new($s)
Replace eval function to add more security.
getCallerInfoString()
Get caller info as a string that can be appended to a log message.
get_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Get formatted error messages to output (Used to show messages on html output).
dol_user_country()
Return country code for current user.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=null)
Clean a string from some undesirable HTML tags.
getMultidirTemp($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its temporary ...
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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 properties for an object - including magic properties when requested.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
dol_strftime($fmt, $ts=false, $is_gmt=false)
Format a string.
img_picto_common($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $notitle=0)
Show picto (generic function)
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.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dolPrintPassword($s)
Return a string ready to be output on an HTML attribute (alt, title, ...)
dol_escape_all($stringtoescape)
Returns text escaped for all protocols (so only alpha chars and numbers)
dolForgeSQLCriteriaCallback($matches)
Function to forge a SQL criteria from a USF (Universal Filter Syntax) string.
if(!function_exists( 'utf8_encode')) if(!function_exists('utf8_decode')) if(!function_exists( 'str_starts_with')) if(!function_exists('str_ends_with')) if(!function_exists( 'str_contains')) getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_escape_uri($stringtoescape)
Returns text escaped by RFC 3986 for inclusion into a clickable link.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
getDolDBType()
Return the current entity.
print_titre($title)
Show a title.
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.
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_searchclear($titlealt='default', $other='')
Show search logo.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
utf8_check($str)
Check if a string is in UTF8.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT 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
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.
realCharForNumericEntities($matches)
Return the real char for a numeric entities.