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;
1354 if ($paramname ==
'hashp' && $out ==
'shared') {
1370function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1374 if ($out ===
null) {
1382 if (!is_numeric($out)) {
1387 if (is_array($out)) {
1388 $out = implode(
',', $out);
1390 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1395 dol_syslog(
"Use of parameter value 'san_alpha' in GETPOST is deprecated. Use 'alphanohtml', 'aZ09comma', ...", LOG_WARNING);
1396 $out = filter_var($out, FILTER_SANITIZE_STRING);
1399 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1403 $out = preg_replace(
'/[^:\/\[\]a-z0-9@\$\'\*\~\.\-_,;\?\!=%&+#]+/i',
'', $out);
1407 if (!is_array($out)) {
1409 if (preg_match(
'/[^a-z]+/i', $out)) {
1415 if (!is_array($out)) {
1417 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1423 if (!is_array($out)) {
1425 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1431 if (!is_array($out)) {
1433 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1440 if (!is_array($out)) {
1443 $oldstringtoclean = $out;
1447 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1454 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1455 }
while ($oldstringtoclean != $out);
1459 case 'alphawithlgt':
1460 if (!is_array($out)) {
1463 $oldstringtoclean = $out;
1467 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1474 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1475 }
while ($oldstringtoclean != $out);
1481 case 'restricthtmlnolink':
1482 case 'restricthtml':
1483 case 'restricthtmlallowclass':
1484 case 'restricthtmlallowiframe':
1485 case 'restricthtmlallowlinkscript':
1486 case 'restricthtmlallowunvalid':
1491 if (empty($filter)) {
1492 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1494 if (is_null($options)) {
1497 $out = filter_var($out, $filter, $options);
1501 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1502 $out =
GETPOST($out,
'alphanohtml');
1517function dolSetCookie(
string $cookiename,
string $cookievalue,
int $expire = -1)
1519 global $dolibarr_main_force_https;
1521 if ($expire == -1) {
1522 $expire = (time() + (86400 * 354));
1525 if (PHP_VERSION_ID < 70300) {
1526 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : $expire,
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
1529 $cookieparams = array(
1530 'expires' => empty($cookievalue) ? 0 : $expire,
1533 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
1537 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
1539 if (empty($cookievalue)) {
1540 unset($_COOKIE[$cookiename]);
1544if (!function_exists(
'dol_getprefix')) {
1555 function dol_getprefix($mode =
'')
1558 if ($mode ==
'email') {
1564 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1565 return $_SERVER[
"SERVER_NAME"];
1570 if (!empty($conf->file->instance_unique_id)) {
1571 return sha1(
'dolibarr' . $conf->file->instance_unique_id);
1575 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1579 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1580 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1583 if (!empty($tmp_instance_unique_id)) {
1584 return sha1(
'dolibarr' . $tmp_instance_unique_id);
1588 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1589 return sha1($_SERVER[
"SERVER_NAME"] . $_SERVER[
"DOCUMENT_ROOT"] . DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1591 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1608 global $conf, $langs, $user,
$mysoc;
1610 if (strpos($relpath,
'..') !==
false) {
1612 dol_syslog(
'functions::dol_include_once Tried to load a file with a path including a forbidden sequence ".." : ' . $relpath, LOG_WARNING);
1615 if (!preg_match(
'/\.php$/', $relpath)) {
1617 dol_syslog(
'functions::dol_include_once Tried to load a file that is not a PHP file : ' . $relpath, LOG_WARNING);
1623 if (!file_exists($fullpath)) {
1624 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: ' . $relpath, LOG_WARNING);
1627 if (!empty($classname) && !class_exists($classname)) {
1628 return include $fullpath;
1630 return include_once $fullpath;
1648function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1652 $path = preg_replace(
'/^\//',
'', $path);
1655 $res = DOL_DOCUMENT_ROOT .
'/' . $path;
1656 if (is_array($conf->file->dol_document_root)) {
1657 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1658 if ($key ==
'main') {
1662 if (@file_exists($dirroot .
'/' . $path)) {
1663 if ($key !=
'main' && preg_match(
'/^core\//', $path)) {
1666 $res = $dirroot .
'/' . $path;
1671 if ($returnemptyifnotfound) {
1673 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1685 $res = DOL_URL_ROOT .
'/' . $path;
1688 $res = DOL_MAIN_URL_ROOT .
'/' . $path;
1691 $res = DOL_URL_ROOT .
'/' . $path;
1694 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1695 if ($key ==
'main') {
1700 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim($conf->file->dol_main_url_root));
1701 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1704 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) .
'/' . $path;
1709 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1710 if (!empty($regs[1])) {
1713 if (@file_exists($dirroot .
'/' . $regs[1])) {
1715 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT) . $conf->file->dol_url_root[$key] .
'/' . $path;
1716 } elseif ($type == 2) {
1717 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT) . $conf->file->dol_url_root[$key] .
'/' . $path;
1718 } elseif ($type == 3) {
1722 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim($conf->file->dol_main_url_root));
1723 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1726 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) . $conf->file->dol_url_root[$key] .
'/' . $path;
1745function dolBuildUrl($url, $params = [], $addtoken =
false)
1747 global $db, $hookmanager;
1749 if (!is_object($hookmanager)) {
1750 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
1753 if ((!isset($params[
'mainmenu']) || empty($params[
'mainmenu'])) && GETPOSTISSET(
'mainmenu')) {
1754 $params = array_merge($params, [
'mainmenu' => (
GETPOST(
'mainmenu',
'restricthtml'))]);
1756 if ((!isset($params[
'leftmenu'])) && GETPOSTISSET(
'leftmenu')) {
1757 $params = array_merge($params, [
'leftmenu' => (
GETPOST(
'leftmenu',
'restricthtml'))]);
1761 'params' => &$params,
1762 'addtoken' => &$addtoken,
1764 $hookmanager->executeHooks(
'buildurl', $parameters);
1766 $params = array_merge($params, [
'token' =>
newToken()]);
1770 $params = array_merge($params, [
'debug' =>
'debug']);
1773 $url .=
'?' . http_build_query($params);
1792 if (empty($properties)) {
1793 return get_object_vars($obj);
1796 $existingProperties = [];
1797 $realProperties = get_object_vars($obj);
1800 foreach ($properties as $property) {
1801 if (array_key_exists($property, $realProperties)) {
1803 $existingProperties[$property] = $obj->{$property};
1804 } elseif (property_exists($obj, $property)) {
1806 $existingProperties[$property] = $obj->{$property};
1810 return $existingProperties;
1829function dol_clone($srcobject, $native = 2)
1833 dol_syslog(
"Warning, call to dol_clone() with the deprecated parameter native=0, use 2 instead", LOG_WARNING);
1836 if (isset($srcobject->db) && isset($srcobject->db->db) && is_object($srcobject->db->db) && get_class($srcobject->db->db) ==
'PgSql\Connection') {
1837 $tmpsavdb = $srcobject->db;
1838 unset($srcobject->db);
1841 $myclone = unserialize(serialize($srcobject));
1843 if (!empty($tmpsavdb)) {
1844 $srcobject->db = $tmpsavdb;
1846 } elseif ($native == 2) {
1849 $tmparray = get_object_vars($srcobject);
1851 if (is_array($tmparray)) {
1852 foreach ($tmparray as $propertykey => $propertyval) {
1853 if (is_scalar($propertyval) || is_array($propertyval)) {
1854 $myclone->$propertykey = $propertyval;
1859 $myclone = clone $srcobject;
1876 if (is_object($srcobject)) {
1877 $srcobject = get_object_vars($srcobject);
1880 if (is_array($srcobject)) {
1882 foreach ($srcobject as $key => $value) {
1883 if (in_array($key, array(
'db',
'fields',
'error',
'errorhidden',
'errors',
'oldcopy',
'linkedObjects',
'linked_objects'))) {
1904function dol_size($size, $type =
'')
1907 if (empty($conf->dol_optimize_smallscreen)) {
1910 if ($type ==
'width' && $size > 250) {
1931function dol_sanitizeFileName($str, $newstr =
'_', $unaccent = 1, $includequotes = 0, $allowdash = 0)
1937 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1938 if ($includequotes) {
1939 $filesystem_forbidden_chars[] =
"'";
1942 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1943 if (empty($allowdash)) {
1944 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1945 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1947 $tmp = str_replace(
'..',
'', $tmp);
1948 $tmp = str_replace(
'~', $newstr, $tmp);
1949 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
1976 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1983 $tmp = preg_replace(
'/\-\-+/', $newstr, $tmp);
1984 if (empty($allowdash)) {
1985 $tmp = preg_replace(
'/\s+\-([^\s])/',
' '.$newstr.
'$1', $tmp);
1986 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1988 $tmp = str_replace(
'..', $newstr, $tmp);
1989 $tmp = str_replace(
'~', $newstr, $tmp);
1990 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
2006 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
2008 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
2010 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
2014 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
2018 $oldstringtoclean = $stringtoclean;
2021 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
2022 }
while ($oldstringtoclean != $stringtoclean);
2026 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
2029 return $stringtoclean;
2041 $oldstringtoclean = $stringtoclean;
2042 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
2043 }
while ($oldstringtoclean != $stringtoclean);
2045 return $stringtoclean;
2058 return preg_replace(
'/[^\w]+/',
'', $str);
2072 if (is_null($str)) {
2077 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
2078 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
2079 return $transliterator->transliterate($str);
2082 $string = rawurlencode($str);
2083 $replacements = array(
2084 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
2086 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
2087 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
2089 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
'%C5%90' =>
'O',
2091 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
'%C5%B0' =>
'U',
2092 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
2093 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
2095 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
2096 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
2098 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
'%C5%91' =>
'o',
2100 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
'%C5%B1' =>
'u',
2101 '%C3%BD' =>
'y',
'%C3%BF' =>
'y',
2122 $string = strtr($string, $replacements);
2123 return rawurldecode($string);
2128 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
2129 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
2130 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
2131 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
2132 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
2133 \xF9\xFA\xFB\xFC\xFD\xFF",
2141 $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"));
2159function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
2161 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
2162 if (empty($keepspaces)) {
2163 $forbidden_chars_to_replace[] =
" ";
2165 $forbidden_chars_to_remove = array();
2168 if (is_array($badcharstoreplace)) {
2169 $forbidden_chars_to_replace = $badcharstoreplace;
2171 if (is_array($badcharstoremove)) {
2172 $forbidden_chars_to_remove = $badcharstoremove;
2176 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
2195 if ($removetabcrlf) {
2196 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
2198 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
2213 if (function_exists(
'iconv')) {
2214 $slug = iconv(
'UTF-8',
'ASCII//TRANSLIT//IGNORE', $slug);
2218 $slug = strtolower($slug);
2221 $slug = preg_replace(
'/[^a-z0-9]+/',
'-', $slug);
2224 $slug = trim($slug,
'-');
2237function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
2239 if (is_null($stringtoescape)) {
2244 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
2246 if (empty($noescapebackslashn)) {
2247 $substitjs[
"\n"] =
'\\n';
2248 $substitjs[
'\\'] =
'\\\\';
2251 $substitjs[
"'"] =
"\\'";
2252 $substitjs[
'"'] =
"\\'";
2253 } elseif ($mode == 1) {
2254 $substitjs[
"'"] =
"\\'";
2255 } elseif ($mode == 2) {
2256 $substitjs[
'"'] =
'\\"';
2257 } elseif ($mode == 3) {
2258 $substitjs[
"'"] =
"\\'";
2259 $substitjs[
'"'] =
"\\\"";
2261 return strtr((
string) $stringtoescape, $substitjs);
2275 return rawurlencode($stringtoescape);
2286 return str_replace(
'"',
'\"', $stringtoescape);
2298 if (is_null($stringtoescape)) {
2302 if ($stringforquotes == 2) {
2303 return str_replace(
'"',
"'", $stringtoescape);
2304 } elseif ($stringforquotes == 1) {
2310 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
2311 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
2314 return 'Bad parameter for stringforquotes in dol_escape_php';
2325 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
2336 return $stringtoescape;
2400 $allowedtags = array(
'br',
'b',
'font',
'hr',
'span');
2401 if (!empty($allowothertags) && is_array($allowothertags)) {
2402 $allowedtags = array_merge($allowedtags, $allowothertags);
2406 if ($escapeonlyhtmltags) {
2407 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 0, 0, 0, $allowedtags), 1, -1,
'', 1, 1);
2409 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, $allowedtags), 1, -1,
'', 0, 1);
2425 $escapeonlyhtmltags = 1;
2426 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 1, 1, 0, array()), 0, 0,
'', $escapeonlyhtmltags, 1);
2451 return htmlspecialchars($s, ENT_HTML5,
'UTF-8');
2471function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2473 if ($noescapetags ==
'common') {
2474 $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';
2476 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2478 if ($cleanalsojavascript) {
2483 if ($escapeonlyhtmltags) {
2484 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2491 $tmp = (string) $stringtoescape;
2494 $tmp = str_ireplace(
'<',
'__DONOTDECODELT', $tmp);
2495 $tmp = str_ireplace(
'>',
'__DONOTDECODEGT', $tmp);
2496 $tmp = str_ireplace(
'&',
'__DONOTDECODEAMP', $tmp);
2497 $tmp = str_ireplace(
'"',
'__DONOTDECODEQUOT', $tmp);
2498 $tmp = str_ireplace(
'&apos',
'__DONOTDECODEAPOS', $tmp);
2499 $tmp = str_ireplace(
''',
'__DONOTDECODE39', $tmp);
2501 $tmp = html_entity_decode((
string) $tmp, ENT_COMPAT,
'UTF-8');
2504 $tmp = str_ireplace(
'__DONOTDECODELT',
'<', $tmp);
2505 $tmp = str_ireplace(
'__DONOTDECODEGT',
'>', $tmp);
2506 $tmp = str_ireplace(
'__DONOTDECODEAMP',
'&', $tmp);
2507 $tmp = str_ireplace(
'__DONOTDECODEQUOT',
'"', $tmp);
2508 $tmp = str_ireplace(
'__DONOTDECODEAPOS',
'&apos', $tmp);
2509 $tmp = str_ireplace(
'__DONOTDECODE39',
''', $tmp);
2511 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE__', $tmp);
2514 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2517 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2518 } elseif ($keepn == -1) {
2519 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2522 if ($escapeonlyhtmltags) {
2523 $tmp = htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2527 $tmparrayoftags = array();
2528 if ($noescapetags) {
2529 $tmparrayoftags = explode(
',', $noescapetags);
2532 if (count($tmparrayoftags)) {
2537 $tmp = str_ireplace(array(
'__DOUBLEQUOTE',
'__BEGINTAGTOREPLACE',
'__ENDTAGTOREPLACE',
'__BEGINENDTAGTOREPLACE'),
'', $tmp);
2539 foreach ($tmparrayoftags as $tagtoreplace) {
2541 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
'>/',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2542 $tmp = str_ireplace(
'</' . $tagtoreplace .
'>',
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2543 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
' \/>/',
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2549 if (preg_match(
'/<' . preg_quote($tagtoreplace,
'/') .
'(\s+)([^>]+)>/', $tmp, $reg)) {
2551 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2552 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE__', $tmpattributes);
2553 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2555 $tmp = str_replace(
'<' . $tagtoreplace . $reg[1] . $reg[2] .
'>',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'[' . $tmpattributes .
']__', $tmp);
2558 $diff = strcmp($tmpold, $tmp);
2562 $tmp = str_ireplace(
'&',
'__ANDNOSEMICOLON__', $tmp);
2563 $tmp = str_ireplace(
'"',
'__DOUBLEQUOTENOSEMICOLON__', $tmp);
2564 $tmp = str_ireplace(
'<',
'__LESSTHAN__', $tmp);
2565 $tmp = str_ireplace(
'>',
'__GREATERTHAN__', $tmp);
2569 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2573 if (count($tmparrayoftags)) {
2575 foreach ($tmparrayoftags as $tagtoreplace) {
2576 $result = str_ireplace(
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
'>', $result);
2577 $result = preg_replace(
'/__BEGINTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1>', $result);
2578 $result = str_ireplace(
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__',
'</' . $tagtoreplace .
'>', $result);
2579 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
' />', $result);
2580 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1 />', $result);
2583 $result = str_ireplace(
'__DOUBLEQUOTE__',
'"', $result);
2585 $result = str_ireplace(
'__ANDNOSEMICOLON__',
'&', $result);
2586 $result = str_ireplace(
'__DOUBLEQUOTENOSEMICOLON__',
'"', $result);
2587 $result = str_ireplace(
'__LESSTHAN__',
'<', $result);
2588 $result = str_ireplace(
'__GREATERTHAN__',
'>', $result);
2591 $result = str_ireplace(
'__SIMPLEQUOTE__',
''', $result);
2608 if (function_exists(
'mb_strtolower')) {
2609 return mb_strtolower($string, $encoding);
2611 return strtolower($string);
2625 if (function_exists(
'mb_strtoupper')) {
2626 return mb_strtoupper($string, $encoding);
2628 return strtoupper($string);
2642 if (function_exists(
'mb_substr')) {
2643 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding) . mb_substr($string, 1,
null, $encoding);
2645 return ucfirst($string);
2659 if (function_exists(
'mb_convert_case')) {
2660 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2662 return ucwords($string);
2674 $backtrace = debug_backtrace();
2676 if (count($backtrace) >= 1) {
2678 if (count($backtrace) == 1) {
2681 $trace = $backtrace[$pos];
2682 if (isset($trace[
'file'], $trace[
'line'])) {
2683 $msg =
" From {$trace['file']}:{$trace['line']}.";
2711function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2713 global $conf, $user, $debugbar;
2721 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2722 global $website, $websitekey;
2723 if (is_object($website) && !empty($website->ref)) {
2724 $suffixinfilename .=
'_website_' . $website->ref;
2725 } elseif (!empty($websitekey)) {
2726 $suffixinfilename .=
'_website_' . $websitekey;
2731 if (defined(
'USESUFFIXINLOG')) {
2732 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2736 foreach ($conf->loghandlers as $loghandlerinstance) {
2737 $loghandlerinstance->setIdent($ident);
2741 if (!empty($message)) {
2744 $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');
2746 if (!array_key_exists($level, $logLevels)) {
2747 dol_syslog(
'Error Bad Log Level ' . $level, LOG_ERR);
2755 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2759 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2760 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))
2762 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2763 $osuser =
" " . sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2765 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S") .
" " . sprintf(
"%-7s", $logLevels[$level]) .
" " . $ospid .
" " . $osuser .
" " . $message;
2771 print
"\n\n<!-- Log start\n";
2773 print
"Log end -->\n";
2777 'message' => $message,
2778 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
''),
2780 'user' => ((is_object($user) && $user->id) ? $user->login :
''),
2782 'osuser' => function_exists(
'posix_getuid') ? (string) posix_getuid() :
'',
2783 'ospid' => (string) getmypid()
2788 if (!empty($remoteip)) {
2789 $data[
'ip'] = $remoteip;
2793 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
2794 $tmpips = explode(
',', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
2798 foreach ($tmpips as $tmpip) {
2799 $tmpip = trim($tmpip);
2800 if (strtolower($tmpip) == strtolower($remoteip)) {
2803 if (empty($data[
'ip'])) {
2804 $data[
'ip'] = $tmpip;
2807 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2810 if (!$foundremoteip) {
2812 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2814 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2815 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP'])) {
2816 $tmpips = explode(
',', $_SERVER[
'HTTP_CLIENT_IP']);
2820 foreach ($tmpips as $tmpip) {
2821 $tmpip = trim($tmpip);
2822 if (strtolower($tmpip) == strtolower($remoteip)) {
2825 if (empty($data[
'ip'])) {
2826 $data[
'ip'] = $tmpip;
2829 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2832 if (!$foundremoteip) {
2834 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2836 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2838 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2840 $data[
'ip'] = (string) $_SERVER[
'SERVER_ADDR'];
2841 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2843 $data[
'ip'] = (string) $_SERVER[
'COMPUTERNAME'];
2845 $data[
'ip'] =
'???';
2848 if (!empty($_SERVER[
'USERNAME'])) {
2850 $data[
'osuser'] = (string) $_SERVER[
'USERNAME'];
2851 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2853 $data[
'osuser'] = (string) $_SERVER[
'LOGNAME'];
2857 foreach ($conf->loghandlers as $loghandlerinstance) {
2858 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2861 $loghandlerinstance->export($data, $suffixinfilename);
2867 foreach ($conf->loghandlers as $loghandlerinstance) {
2868 $loghandlerinstance->setIdent($ident);
2888 $form =
new Form($db);
2890 $templatenameforexport = $website->name_template;
2891 if (empty($templatenameforexport)) {
2892 $templatenameforexport =
'website_' . $website->ref;
2896 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="' .
dol_escape_htmltag($buttonstring) .
'"/>';
2899 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2900 $out .=
'jQuery(document).ready(function () {';
2901 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2902 $out .=
' var dialogHtml = \'';
2904 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2905 $dialogcontent .=
' <div style="margin-top: 20px;">';
2906 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>' . $langs->trans(
"ExportSiteLabel") .
'...</label><br>';
2907 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2908 $dialogcontent .=
' </div>';
2909 $dialogcontent .=
' <br>';
2910 $dialogcontent .=
' <div style="margin-top: 20px;">';
2911 $dialogcontent .=
' <strong>' . $langs->trans(
"ExportSiteGitLabel") .
' ' . $form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'') .
'</strong><br>';
2912 $dialogcontent .=
' <form action="' .
dol_escape_htmltag($overwriteGitUrl) .
'" method="POST">';
2913 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2914 $dialogcontent .=
' <input type="hidden" name="token" value="' .
newToken() .
'">';
2915 $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>';
2916 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2917 $dialogcontent .=
' </form>';
2918 $dialogcontent .=
' </div>';
2919 $dialogcontent .=
' </div>';
2926 // Add the content of the dialog to the body of the page
2927 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2928 $out .= ' if ($dialog.length > 0) {
2931 jQuery(
"body").append(dialogHtml);
';
2933 // Configuration of popup
2934 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2935 $out .= ' autoOpen:
false,
';
2936 $out .= ' modal:
true,
';
2937 $out .= ' height: 290,
';
2938 $out .= ' width:
"40%",
';
2939 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2942 // Simulate a click on the original "submit" input to export the site.
2943 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2944 $out .= ' console.log(
"Clic on exportsite.");
';
2945 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2946 $out .= ' console.log(
"element founded:", target.length > 0);
';
2947 $out .= ' if (target.length > 0) { target.click(); }
';
2948 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2952 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2953 $out .= ' return false;
';
2956 $out .= '</script>
';
2978function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $jsonclose = '', $accesskey = '')
2982 if (strpos($url, '?
') > 0) {
2983 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
2985 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
2988 if (preg_match('/^https/i
', $url)) {
2991 $urltoopen = DOL_URL_ROOT . $url;
2996 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2997 $out .= '<!-- a link
for button to open url into a dialog popup -->
';
2998 $out .= '<a
' . ($accesskey ? ' accesskey=
"' . $accesskey . '"' : '') . ' class=
"cursorpointer reposition button_' . $name . ($morecss ? ' ' . $morecss : '') . '"' . $disabled . ' title=
"' . dol_escape_htmltag($label) . '"';
2999 if (empty($conf->use_javascript_ajax)) {
3000 $out .= ' href=
"' . $urltoopen . '" target=
"_blank"';
3001 } elseif ($jsonopen) {
3002 $out .= ' href=
"#" onclick=
"' . $jsonopen . '"';
3004 $out .= ' href=
"#"';
3006 $out .= '>
' . $buttonstring . '</a>
';
3008 if (!empty($conf->use_javascript_ajax)) {
3009 // Add code to open url using the popup.
3010 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
3011 $out .= '<div
id=
"idfordialog' . $name . '" class=
"hidden">
' . (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '') . '</div>
';
3013 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
3014 $out .= '<script nonce=
"' . getNonce() . '" type=
"text/javascript">
3015 jQuery(document).ready(
function () {
3016 jQuery(
".button_' . $name . '").click(
function () {
3017 console.log(\
'Open popup with jQuery(...).dialog() on URL ' .
dol_escape_js($urltoopen) .
'\');
3018 var $tmpdialog = $(\
'#idfordialog' . $name .
'\');
3019 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog' . $name .
'" style="border: 0px;" src="' . $urltoopen .
'" width="100%" height="98%"></iframe>\');
3023 height: (window.innerHeight - 150),
3026 open: function (event, ui) {
3027 console.log(
"open popup name=' . $name . '");
3029 close:
function (event, ui) {
3030 console.log(
"Popup is closed, run jsonclose = ' . $jsonclose . '");
3031 ' . (empty($jsonclose) ? '' : $jsonclose . ';
') . '
3035 $tmpdialog.dialog(\
'open\');
3060function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
3062 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
3082function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0, $morecssdiv =
'')
3084 global $conf, $langs, $hookmanager;
3088 if (!empty($conf->dol_optimize_smallscreen)) {
3092 $out =
"\n" .
'<!-- dol_fiche_head - dol_get_fiche_head -->';
3094 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3095 $out .=
'<div class="tabs' . ($picto ?
'' :
' nopaddingleft') .
'" data-role="controlgroup" data-type="horizontal">' .
"\n";
3099 if ($morehtmlright) {
3100 $out .=
'<div class="inline-block floatright tabsElem">' . $morehtmlright .
'</div>';
3107 if (is_array($links) && !empty($links)) {
3108 $keys = array_keys($links);
3110 $maxkey = max($keys);
3116 if (empty($limittoshow)) {
3119 if (!empty($conf->dol_optimize_smallscreen)) {
3127 for ($i = 0; $i <= $maxkey; $i++) {
3128 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3130 if ($i >= $limittoshow) {
3136 for ($i = 0; $i <= $maxkey; $i++) {
3137 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3143 if ($i < $limittoshow || $isactive) {
3145 $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])) .
' -->';
3147 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3148 if (!empty($links[$i][0])) {
3149 $out .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3151 $out .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3153 } elseif (!empty($links[$i][1])) {
3155 $out .=
'<div class="tab tab' . ($isactive ?
'active' :
'unactive') .
'" style="margin: 0 !important">';
3157 if (!empty($links[$i][0])) {
3158 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
3159 $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) .
'">';
3162 if ($displaytab == 0 && $picto) {
3163 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
3166 $out .= $links[$i][1];
3167 if (!empty($links[$i][0])) {
3168 $out .=
'</a>' .
"\n";
3170 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
3179 $outmore .=
'<div class="popuptabset wordwrap">';
3181 $outmore_content =
'';
3183 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3184 if (!empty($links[$i][0])) {
3185 $outmore_content .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3187 $outmore_content .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3189 } elseif (!empty($links[$i][1])) {
3190 $outmore_content .=
'<a' . (!empty($links[$i][2]) ?
' id="' . $links[$i][2] .
'"' :
'') .
' class="wordwrap inline-block' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">';
3191 $outmore_content .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
3192 $outmore_content .=
'</a>' .
"\n";
3194 if ($outmore_content !==
'') {
3195 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">' . $outmore_content .
'</div>';
3201 $displaytab = $i + 1;
3204 $outmore .=
'</div>';
3208 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
3209 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
3210 $widthofpopup = 240;
3212 $tabsname = $moretabssuffix;
3213 if (empty($tabsname)) {
3214 $tabsname = str_replace(
"@",
"", $picto);
3216 $out .=
'<div id="moretabs' . $tabsname .
'" class="inline-block tabsElem valignmiddle">';
3218 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">' . $langs->trans(
"More") .
'</span>... (' . $nbintab .
')</a></div>';
3220 $out .=
'<div id="moretabsList' . $tabsname .
'" style="width: ' . $widthofpopup .
'px; position: absolute; ' . $left .
': -999em; text-align: ' . $left .
'; margin:0px; padding:2px; z-index:10;">';
3223 $out .=
'<div></div>';
3226 $out .=
'<script nonce="' .
getNonce() .
'">';
3227 $out .=
"$('#moretabs" . $tabsname .
"').mouseenter( function() {
3228 var x = this.offsetLeft, y = this.offsetTop;
3229 console.log('mouseenter " . $left .
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
3230 if ((window.innerWidth - x) < " . ($widthofpopup + 10) .
") {
3231 $('#moretabsList" . $tabsname .
"').css('" . $right .
"','8px');
3233 $('#moretabsList" . $tabsname .
"').css('" . $left .
"','auto');
3236 $out .=
"$('#moretabs" . $tabsname .
"').mouseleave( function() { console.log('mouseleave " . $left .
"'); $('#moretabsList" . $tabsname .
"').css('" . $left .
"','-999em');});";
3237 $out .=
"</script>";
3240 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3244 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
3245 $out .=
"\n" .
'<div id="dragDropAreaTabBar" class="tabBar' . ($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'') . ($notab == -4 ?
'' :
' tabBarWithBottom'))));
3246 $out .= ($morecssdiv ?
' ' . $morecssdiv :
'');
3247 $out .=
'">' .
"\n";
3249 if (!empty($dragdropfile)) {
3250 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3253 $parameters = array(
'tabname' => $active,
'out' => $out);
3254 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
3256 $out = $hookmanager->resPrint;
3282 if (!$notab || $notab == -1) {
3283 return "\n</div>\n";
3308function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
3310 global $conf, $form, $user, $langs, $hookmanager, $action;
3314 $maxvisiblephotos = 1;
3316 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
3319 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
3322 $modulepart =
'unknown';
3324 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
3325 $modulepart =
$object->element;
3326 } elseif (
$object->element ==
'member') {
3327 $modulepart =
'memberphoto';
3328 } elseif (
$object->element ==
'user') {
3329 $modulepart =
'userphoto';
3332 if (class_exists(
"Imagick")) {
3333 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
3334 $modulepart =
$object->element;
3335 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
3336 $modulepart =
'ficheinter';
3337 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3338 $modulepart =
'contract';
3339 } elseif (
$object->element ==
'order_supplier') {
3340 $modulepart =
'supplier_order';
3341 } elseif (
$object->element ==
'invoice_supplier') {
3342 $modulepart =
'supplier_invoice';
3346 if (
$object->element ==
'product') {
3348 '@phan-var-force Product $object';
3350 $cssclass =
'photowithmargin photoref';
3351 $showimage =
$object->is_photo_available($conf->product->multidir_output[$entity]);
3353 if ($conf->browser->layout ==
'phone') {
3354 $maxvisiblephotos = 1;
3357 $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>';
3361 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3363 $nophoto =
'/public/theme/common/nophoto.png';
3364 $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>';
3367 } elseif (
$object->element ==
'category') {
3369 '@phan-var-force Categorie $object';
3371 $cssclass =
'photowithmargin photoref';
3372 $showimage =
$object->isAnyPhotoAvailable($conf->categorie->multidir_output[$entity]);
3374 if ($conf->browser->layout ==
'phone') {
3375 $maxvisiblephotos = 1;
3378 $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>';
3382 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3384 $nophoto =
'/public/theme/common/nophoto.png';
3385 $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>';
3388 } elseif (
$object->element ==
'bom') {
3390 '@phan-var-force Bom $object';
3392 $cssclass =
'photowithmargin photoref';
3393 $showimage =
$object->is_photo_available($conf->bom->multidir_output[$entity]);
3395 if ($conf->browser->layout ==
'phone') {
3396 $maxvisiblephotos = 1;
3399 $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>';
3403 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3405 $nophoto =
'/public/theme/common/nophoto.png';
3406 $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>';
3409 } elseif (
$object->element ==
'ticket') {
3411 $cssclass =
'photoref';
3413 '@phan-var-force Ticket $object';
3414 $showimage =
$object->is_photo_available($conf->ticket->multidir_output[$entity] .
'/' .
$object->ref);
3416 if ($conf->browser->layout ==
'phone') {
3417 $maxvisiblephotos = 1;
3421 $showphoto =
$object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
3423 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $showphoto .
'</div>';
3431 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3433 $nophoto =
img_picto(
'No photo',
'object_ticket');
3434 $morehtmlleft .=
'<!-- No photo to show -->';
3435 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3436 $morehtmlleft .= $nophoto;
3437 $morehtmlleft .=
'</div></div>';
3441 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3444 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3446 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]) .
"/";
3447 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3449 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'') . $objectref;
3453 if (empty($subdir)) {
3454 $subdir =
'errorgettingsubdirofobject';
3457 $filepath = $dir_output . $subdir .
"/";
3459 $filepdf = $filepath . $objectref .
".pdf";
3460 $relativepath = $subdir .
'/' . $objectref .
'.pdf';
3463 $fileimage = $filepdf .
'_preview.png';
3464 $relativepathimage = $relativepath .
'_preview.png';
3466 $pdfexists = file_exists($filepdf);
3471 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3473 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3482 if ($pdfexists && !$error) {
3483 $heightforphotref = 80;
3484 if (!empty($conf->dol_optimize_smallscreen)) {
3485 $heightforphotref = 60;
3488 if (file_exists($fileimage)) {
3489 $phototoshow =
'<div class="photoref">';
3490 $phototoshow .=
'<img height="' . $heightforphotref .
'" class="photo photowithborder" src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=apercu' . $modulepart .
'&file=' . urlencode($relativepathimage) .
'">';
3491 $phototoshow .=
'</div>';
3494 } elseif (!$phototoshow) {
3495 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0);
3499 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3500 $morehtmlleft .= $phototoshow;
3501 $morehtmlleft .=
'</div>';
3505 if (empty($phototoshow)) {
3506 if (
$object->element ==
'action') {
3508 $cssclass =
'photorefcenter';
3509 $nophoto =
img_picto(
'No photo',
'title_agenda');
3512 $cssclass =
'photorefcenter';
3514 $prefix =
'object_';
3518 if (strpos($picto,
'fontawesome_') !==
false) {
3521 $nophoto =
img_picto(
'No photo', $prefix . $picto);
3523 $morehtmlleft .=
'<!-- No photo to show -->';
3524 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3525 $morehtmlleft .= $nophoto;
3526 $morehtmlleft .=
'</div></div>';
3532 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $form->showbarcode(
$object, 100,
'photoref valignmiddle') .
'</div>';
3535 if (
$object->element ==
'societe') {
3537 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3540 $morehtmlstatus .=
$object->getLibStatut(6);
3542 } elseif (
$object->element ==
'product') {
3545 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3546 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'status',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3548 $morehtmlstatus .=
'<span class="statusrefsell">' .
$object->getLibStatut(6, 0) .
'</span>';
3550 $morehtmlstatus .=
' ';
3552 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3553 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'status_buy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3555 $morehtmlstatus .=
'<span class="statusrefbuy">' .
$object->getLibStatut(6, 1) .
'</span>';
3557 } elseif (in_array(
$object->element, array(
'salary'))) {
3559 '@phan-var-force Salary $object';
3561 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3564 $morehtmlstatus .= $tmptxt;
3565 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3567 '@phan-var-force Facture|FactureFournisseur|CommonInvoice $object';
3568 if (!isset(
$object->alreadypaid)) {
3574 $tmptxt =
$object->getLibStatut(6, (
float)
$object->alreadypaid);
3575 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3576 $tmptxt =
$object->getLibStatut(5, (
float)
$object->alreadypaid);
3578 $morehtmlstatus .= $tmptxt;
3579 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3581 '@phan-var-force ChargeSociales|Loan|Tva $object';
3583 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3586 $morehtmlstatus .= $tmptxt;
3587 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3590 $morehtmlstatus .=
$object->getLibStatut(5);
3592 $morehtmlstatus .=
$object->getLibStatut(4);
3594 } elseif (
$object->element ==
'facturerec') {
3596 '@phan-var-force FactureRec $object';
3597 if (
$object->frequency == 0) {
3598 $morehtmlstatus .=
$object->getLibStatut(2);
3600 $morehtmlstatus .=
$object->getLibStatut(5);
3602 } elseif (
$object->element ==
'project_task') {
3604 $tmptxt =
$object->getLibStatut(4);
3605 $morehtmlstatus .= $tmptxt;
3606 } elseif (method_exists(
$object,
'getLibStatut')) {
3607 $tmptxt =
$object->getLibStatut(6);
3608 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3609 $tmptxt =
$object->getLibStatut(5);
3611 $morehtmlstatus .= $tmptxt;
3615 if (
isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3617 if (method_exists(
$object,
'getVentilExportCompta')) {
3618 $accounted =
$object->getVentilExportCompta(1);
3619 $langs->load(
"accountancy");
3620 $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>';
3625 if (!empty(
$object->name_alias)) {
3627 '@phan-var-force Societe $object';
3632 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3635 $morehtmlref .=
'<div class="refidno banner-object-label">' .
$object->label .
'</div>';
3639 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3642 $morehtmlref .=
'<div class="refidno refaddress">';
3643 $morehtmlref .= $moreaddress;
3644 $morehtmlref .=
'</div>';
3648 $morehtmlref .=
'<div style="clear: both;"></div>';
3649 $morehtmlref .=
'<div class="refidno opacitymedium">';
3650 $morehtmlref .= $langs->trans(
"TechnicalID") .
': ' . ((int)
$object->id);
3651 $morehtmlref .=
'</div>';
3654 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3655 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3658 } elseif (empty($reshook)) {
3659 $morehtmlref .= $hookmanager->resPrint;
3660 } elseif ($reshook > 0) {
3661 $morehtmlref = $hookmanager->resPrint;
3670 print
'<div class="' . ($onlybanner ?
'arearefnobottom ' :
'arearef ') .
'heightref valignmiddle centpercent object-banner-tab-container" data-module-part="'.
dolPrintHTMLForAttribute($modulepart).
'">';
3671 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3673 print
'<div class="underrefbanner clearboth"></div>';
3685function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3689 if ($fieldrequired) {
3690 $ret .=
'<span class="fieldrequired">';
3692 $ret .=
'<label for="' . $fieldkey .
'">';
3693 $ret .= $langs->trans($langkey);
3695 if ($fieldrequired) {
3716 global $langs, $hookmanager;
3719 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3724 $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)));
3727 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3729 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3730 $ret .= (($ret && $town) ? $sep :
'') . $town;
3733 $ret .= ($ret ? ($town ?
", " : $sep) :
'') .
$object->state;
3736 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'') .
$object->zip;
3738 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3740 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3741 $ret .= ($ret ? $sep :
'') . $town;
3743 $ret .= ($ret ?
", " :
'') .
$object->state;
3746 $ret .= ($ret ? $sep :
'') .
$object->zip;
3748 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3750 $ret .= ($ret ? $sep :
'') .
$object->zip;
3751 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3752 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3754 $ret .= $sep .
$object->state;
3756 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3759 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3761 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3763 $ret .= ($ret ? $sep :
'') .
$object->zip;
3764 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3765 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3766 $ret .= (empty(
$object->state_code) ?
'' : (
' ' .
$object->state_code));
3769 $town = (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3770 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'') .
$object->zip) :
'';
3771 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')) . $town) :
'');
3772 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3773 $ret .= ($ret ?
", " :
'') .
$object->state;
3777 if (!is_object($outputlangs)) {
3778 $outputlangs = $langs;
3781 $langs->load(
"dict");
3782 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'') . $outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country" .
$object->country_code)));
3785 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3786 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3790 $ret .= $hookmanager->resPrint;
3807function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3809 if ((abs($ts) <= 0x7FFFFFFF)) {
3812 return 'Error date outside supported range';
3838function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false, $decorate = 0)
3840 global $conf, $langs;
3847 if ($tzoutput ===
'auto') {
3848 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
3853 $offsettz = $offsetdst = 0;
3856 if (is_string($tzoutput)) {
3857 if ($tzoutput ==
'tzserver') {
3859 $offsettzstring = @date_default_timezone_get();
3864 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3867 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
getDolGlobalString(
'MAIN_DOLIBARR_USER_TIMEZONE',
'UTC') : $_SESSION[
'dol_tz_string']);
3869 if (class_exists(
'DateTimeZone')) {
3871 $user_date_tz =
new DateTimeZone($offsettzstring);
3874 dol_syslog(
"DateInvalidTimeZoneException for timezone string '".$offsettzstring.
"'. Falling back to UTC.", LOG_ERR);
3875 $user_date_tz =
new DateTimeZone(
'UTC');
3877 $user_dt =
new DateTime();
3878 $user_dt->setTimezone($user_date_tz);
3879 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3880 $offsettz = $user_dt->getOffset();
3882 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3883 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3888 if (!is_object($outputlangs)) {
3889 $outputlangs = $langs;
3892 $format =
'daytextshort';
3897 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3898 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3899 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3900 if ($formatwithoutreduce != $format) {
3901 $format = $formatwithoutreduce;
3907 if ($format ==
'day') {
3908 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
3909 } elseif ($format ==
'hour') {
3910 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
3911 } elseif ($format ==
'hourduration') {
3912 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
3913 } elseif ($format ==
'daytext') {
3914 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
3915 } elseif ($format ==
'daytextshort') {
3916 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
3917 } elseif ($format ==
'dayhour') {
3918 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
3919 } elseif ($format ==
'dayhoursec') {
3920 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
3921 } elseif ($format ==
'dayhourtext') {
3922 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
3923 } elseif ($format ==
'dayhourtextshort') {
3924 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
3925 } elseif ($format ==
'dayhourlog') {
3927 $format =
'%Y%m%d%H%M%S';
3928 } elseif ($format ==
'dayhourlogsmall') {
3930 $format =
'%y%m%d%H%M';
3931 } elseif ($format ==
'dayhourldap') {
3932 $format =
'%Y%m%d%H%M%SZ';
3933 } elseif ($format ==
'dayhourxcard') {
3934 $format =
'%Y%m%dT%H%M%SZ';
3935 } elseif ($format ==
'dayxcard') {
3937 } elseif ($format ==
'dayrfc') {
3938 $format =
'%Y-%m-%d';
3939 } elseif ($format ==
'dayhourrfc') {
3940 $format =
'%Y-%m-%dT%H:%M:%SZ';
3941 } elseif ($format ==
'standard') {
3942 $format =
'%Y-%m-%d %H:%M:%S';
3945 if ($reduceformat) {
3946 $format = str_replace(
'%Y',
'%y', $format);
3947 $format = str_replace(
'yyyy',
'yy', $format);
3951 if (preg_match(
'/%b/i', $format)) {
3953 $format = str_replace(
'%b',
'__b__', $format);
3954 $format = str_replace(
'%B',
'__B__', $format);
3956 if (preg_match(
'/%a/i', $format)) {
3958 $format = str_replace(
'%a',
'__a__', $format);
3959 $format = str_replace(
'%A',
'__A__', $format);
3964 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)) {
3967 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3971 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3972 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3973 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3974 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3975 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3976 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3978 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
3981 $tzo =
new DateTimeZone(
'UTC');
3983 $tzo =
new DateTimeZone(date_default_timezone_get());
3985 $dtts =
new DateTime();
3986 $dtts->setTimestamp($time);
3987 $dtts->setTimezone($tzo);
3988 $newformat = str_replace(
3989 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3990 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3993 $ret = $dtts->format($newformat);
3995 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3996 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4001 if ($time < 100000000000) {
4002 $dtts =
new DateTime();
4005 $timetouse = (int) $time + $offsettz + $offsetdst;
4007 $tzo =
new DateTimeZone(
'UTC');
4008 $dtts->setTimezone($tzo);
4009 $dtts->setTimestamp($timetouse);
4011 $timetouse = (int) $time + $offsettz + $offsetdst;
4013 $tzo =
new DateTimeZone(date_default_timezone_get());
4014 $dtts->setTimestamp($timetouse);
4015 $dtts->setTimezone($tzo);
4018 $newformat = str_replace(
4019 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4020 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4024 $ret = $dtts->format($newformat);
4027 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4028 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4032 $ret =
'Bad value ' . $time .
' for date';
4036 if (preg_match(
'/__b__/i', $format)) {
4037 $timetouse = $time + $offsettz + $offsetdst;
4040 $tzo =
new DateTimeZone(
'UTC');
4042 $tzo =
new DateTimeZone(date_default_timezone_get());
4044 $dtts =
new DateTime();
4045 $dtts->setTimestamp($timetouse);
4046 $dtts->setTimezone($tzo);
4047 $month = (int) $dtts->format(
"m");
4048 $month = sprintf(
"%02d", $month);
4049 if ($encodetooutput) {
4050 $monthtext = $outputlangs->transnoentities(
'Month' . $month);
4051 $monthtextshort = $outputlangs->transnoentities(
'MonthShort' . $month);
4053 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month' . $month);
4054 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort' . $month);
4057 $ret = str_replace(
'__b__', $monthtextshort, $ret);
4058 $ret = str_replace(
'__B__', $monthtext, $ret);
4062 if (preg_match(
'/__a__/i', $format)) {
4064 $timetouse = $time + $offsettz + $offsetdst;
4067 $tzo =
new DateTimeZone(
'UTC');
4069 $tzo =
new DateTimeZone(date_default_timezone_get());
4071 $dtts =
new DateTime();
4072 $dtts->setTimestamp($timetouse);
4073 $dtts->setTimezone($tzo);
4074 $w = $dtts->format(
"w");
4075 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day' . $w);
4077 $ret = str_replace(
'__A__', $dayweek, $ret);
4078 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
4082 $ret = preg_replace(
'/(\d\d:\d\d [AP]M)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4083 $ret = preg_replace(
'/(\d\d:\d\d)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4110function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
4112 if ($timestamp ===
'') {
4116 $datetimeobj =
new DateTime();
4117 $datetimeobj->setTimestamp($timestamp);
4118 if ($forcetimezone) {
4119 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
4122 'year' => ((
int) date_format($datetimeobj,
'Y')),
4123 'mon' => ((
int) date_format($datetimeobj,
'm')),
4124 'mday' => ((
int) date_format($datetimeobj,
'd')),
4125 'wday' => ((
int) date_format($datetimeobj,
'w')),
4126 'yday' => ((
int) date_format($datetimeobj,
'z')),
4127 'hours' => ((
int) date_format($datetimeobj,
'H')),
4128 'minutes' => ((
int) date_format($datetimeobj,
'i')),
4129 'seconds' => ((
int) date_format($datetimeobj,
's')),
4157function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
4162 if ($gm ===
'auto') {
4163 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
4168 if ($hour == -1 || empty($hour)) {
4171 if ($minute == -1 || empty($minute)) {
4174 if ($second == -1 || empty($second)) {
4180 if (!$month || !$day) {
4189 if ($hour < 0 || $hour > 24) {
4192 if ($minute < 0 || $minute > 60) {
4195 if ($second < 0 || $second > 60) {
4200 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
4201 $default_timezone = @date_default_timezone_get();
4202 $localtz =
new DateTimeZone($default_timezone);
4203 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
4205 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
4207 $localtz =
new DateTimeZone($default_timezone);
4209 dol_syslog(
"Warning dol_tz_string contains an invalid value " . json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
4210 $default_timezone = @date_default_timezone_get();
4212 } elseif (strrpos($gm,
"tz,") !==
false) {
4213 $timezone = str_replace(
"tz,",
"", $gm);
4215 $localtz =
new DateTimeZone($timezone);
4217 dol_syslog(
"Warning passed timezone contains an invalid value " . $timezone, LOG_WARNING);
4221 if (empty($localtz)) {
4222 $localtz =
new DateTimeZone(
'UTC');
4224 $dt =
new DateTime(
'now', $localtz);
4225 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
4226 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
4227 $date = $dt->getTimestamp();
4243function dol_now($mode =
'gmt')
4247 if ($mode ===
'auto') {
4251 if ($mode ==
'gmt') {
4253 } elseif ($mode ==
'tzserver') {
4254 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
4256 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
4261 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
4264 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
4265 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
4266 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
4283 global $conf, $langs;
4286 if (!empty($conf->dol_optimize_smallscreen)) {
4291 if (empty($shortvalue) || $size < ($level * 10)) {
4293 $textunitshort = $langs->trans(
"b");
4294 $textunitlong = $langs->trans(
"Bytes");
4296 $ret = round($size / $level, 0);
4297 $textunitshort = $langs->trans(
"Kb");
4298 $textunitlong = $langs->trans(
"KiloBytes");
4301 if (empty($shortunit)) {
4302 $ret .=
' ' . $textunitlong;
4304 $ret .=
' ' . $textunitshort;
4320function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
4328 $linkstart =
'<a href="';
4329 if (!preg_match(
'/^http/i', $url)) {
4330 $linkstart .=
'http://';
4335 $linkstart .=
' target="' . $target .
'"';
4337 $linkstart .=
' title="' . $langs->trans(
"URL") .
': ' . $url .
'"';
4341 if (!preg_match(
'/^http/i', $url)) {
4348 if ($morecss ==
'float') {
4349 return '<div class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'') . $link .
'</div>';
4351 return $linkstart .
'<span class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'') . $link .
'</span>' . $linkend;
4368function dol_print_email($email, $contactid = 0, $socid = 0, $addlink = 0, $max = 0, $showinvalid = 2, $withpicto = 0, $morecss =
'paddingrightonly')
4370 global $user, $langs, $hookmanager;
4381 if (empty($email)) {
4385 if ($addlink == 1) {
4386 $newemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="';
4387 if (!preg_match(
'/^mailto:/i', $email)) {
4388 $newemail .=
'mailto:';
4390 $newemail .= $email;
4391 $newemail .=
'" target="_blank">';
4393 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4398 $newemail .= $email;
4400 $newemail .=
'</a>';
4403 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4404 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4407 $langs->load(
"errors");
4408 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $emailonly),
'',
'paddingrightonly');
4410 $langs->load(
"errors");
4411 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly),
'',
'paddingrightonly');
4415 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4417 $linktoaddaction =
'';
4419 $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>';
4421 if ($linktoaddaction) {
4422 $newemail =
'<div>' . $newemail .
' ' . $linktoaddaction .
'</div>';
4425 } elseif ($addlink ===
'thirdparty') {
4426 $tmpnewemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="' . DOL_URL_ROOT .
'/societe/card.php?socid=' . $socid .
'&action=presend&mode=init#formmailbeforetitle">';
4427 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4428 if ($withpicto == 1) {
4429 $tmpnewemail .= $newemail;
4431 $tmpnewemail .=
'</a>';
4433 $newemail = $tmpnewemail;
4435 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'') . $newemail;
4438 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4439 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4442 $langs->load(
"errors");
4443 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $email));
4445 $langs->load(
"errors");
4446 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly));
4457 $parameters = array(
'cid' => $contactid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
4459 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
4463 $rep .= $hookmanager->resPrint;
4478 $socialnetworks = array();
4480 require_once DOL_DOCUMENT_ROOT .
'/core/lib/memory.lib.php';
4484 if (!is_null($dataretrieved)) {
4485 $socialnetworks = $dataretrieved;
4487 $sql =
"SELECT rowid, code, label, url, icon, active FROM " . MAIN_DB_PREFIX .
"c_socialnetworks";
4488 $sql .=
" WHERE entity IN (" .
getEntity(
'c_socialnetworks').
")";
4490 $resql = $db->query($sql);
4492 while ($obj = $db->fetch_object($resql)) {
4493 $socialnetworks[$obj->code] = array(
4494 'rowid' => $obj->rowid,
4495 'label' => $obj->label,
4497 'icon' => $obj->icon,
4498 'active' => $obj->active,
4505 return (is_array($socialnetworks) ? $socialnetworks : array());
4520 global $hookmanager, $langs, $user;
4524 if (empty($value)) {
4528 if (!empty($type)) {
4529 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4531 $htmllink .=
'<span class="fab pictofixedwidth ' . ($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link') .
'"></span>';
4532 if ($type ==
'skype') {
4534 $htmllink .=
' <a href="skype:';
4536 $htmllink .=
'?call" alt="' . $langs->trans(
"Call") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Call") .
' ' . $value) .
'">';
4537 $htmllink .=
'<img src="' . DOL_URL_ROOT .
'/theme/common/skype_callbutton.png" border="0">';
4538 $htmllink .=
'</a><a href="skype:';
4540 $htmllink .=
'?chat" alt="' . $langs->trans(
"Chat") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Chat") .
' ' . $value) .
'">';
4541 $htmllink .=
'<img class="paddingleft" src="' . DOL_URL_ROOT .
'/theme/common/skype_chatbutton.png" border="0">';
4542 $htmllink .=
'</a>';
4543 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4544 $addlink =
'AC_SKYPE';
4547 $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>';
4549 $htmllink .= ($link ?
' ' . $link :
'');
4552 if (!empty($dictsocialnetworks[$type][
'url'])) {
4553 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4554 if ($tmpvirginurl) {
4555 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4556 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4558 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4559 if ($tmpvirginurl3) {
4560 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4561 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4564 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4565 if ($tmpvirginurl2) {
4566 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4567 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4570 if (preg_match(
'/^https?:\/\//i', $value)) {
4573 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4575 $valuetoshow = $value;
4576 $valuetoshow = preg_replace(
'/https:\/\/www\.(twitter|x|linkedin)\.com\/?/',
'', $valuetoshow);
4577 if (preg_match(
'/^https?:\/\//i', $link)) {
4586 $htmllink .=
'</div>';
4588 $langs->load(
"errors");
4589 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4593 $parameters = array(
4595 'cid' => $contactid,
4598 'dictsocialnetworks' => $dictsocialnetworks,
4601 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4605 $htmllink .= $hookmanager->resPrint;
4620function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4624 if (empty($profID) || empty($profIDtype)) {
4627 if (empty($countrycode)) {
4628 $countrycode =
$mysoc->country_code;
4630 $newProfID = $profID;
4631 $id = substr($profIDtype, -1);
4633 if (strtoupper($countrycode) ==
'FR') {
4639 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3);
4643 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3) .
' ' . substr($newProfID, 9, 5);
4647 $newProfID = substr($newProfID, 0, 2) .
'.' . substr($newProfID, 2, 3);
4649 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4651 $newProfID = substr($newProfID, 0, 4) .
' ' . substr($newProfID, 4, 3) .
' ' . substr($newProfID, 7, 3) .
' ' . substr($newProfID, 10, 3);
4654 if (!empty($addcpButton)) {
4677function dol_print_phone($phone, $countrycode =
'', $contactid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4679 global $conf, $user, $langs,
$mysoc, $hookmanager;
4682 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4683 if (empty($phone)) {
4689 if (empty($countrycode) && is_object(
$mysoc)) {
4690 $countrycode =
$mysoc->country_code;
4694 if (!empty($conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4699 $newphonewa = $phone;
4700 if (strtoupper($countrycode) ==
"FR") {
4703 $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);
4705 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 2);
4707 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 2) . $separ . substr($newphone, 7, 2);
4709 $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);
4711 $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);
4713 $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);
4715 } elseif (strtoupper($countrycode) ==
"CA") {
4717 $newphone = ($separ !=
'' ?
'(' :
'') . substr($newphone, 0, 3) . ($separ !=
'' ?
')' :
'') . $separ . substr($newphone, 3, 3) . ($separ !=
'' ?
'-' :
'') . substr($newphone, 6, 4);
4719 } elseif (strtoupper($countrycode) ==
"PT") {
4721 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4723 } elseif (strtoupper($countrycode) ==
"SR") {
4725 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3);
4727 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
4729 } elseif (strtoupper($countrycode) ==
"DE") {
4731 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 4) . $separ . substr($newphone, 11, 3);
4733 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 4) . $separ . substr($newphone, 10, 3);
4735 } elseif (strtoupper($countrycode) ==
"ES") {
4737 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4739 } elseif (strtoupper($countrycode) ==
"BF") {
4741 $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);
4743 } elseif (strtoupper($countrycode) ==
"RO") {
4745 $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);
4747 } elseif (strtoupper($countrycode) ==
"TR") {
4749 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4751 } elseif (strtoupper($countrycode) ==
"US") {
4753 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4755 } elseif (strtoupper($countrycode) ==
"MX") {
4757 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4759 $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);
4761 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4763 } elseif (strtoupper($countrycode) ==
"ML") {
4765 $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);
4767 } elseif (strtoupper($countrycode) ==
"TH") {
4769 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4771 $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);
4773 } elseif (strtoupper($countrycode) ==
"MU") {
4776 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2);
4778 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
4780 } elseif (strtoupper($countrycode) ==
"ZA") {
4782 $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);
4784 } elseif (strtoupper($countrycode) ==
"SY") {
4786 $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);
4788 $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);
4790 } elseif (strtoupper($countrycode) ==
"AE") {
4792 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4794 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4796 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 4);
4798 } elseif (strtoupper($countrycode) ==
"DZ") {
4800 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4802 } elseif (strtoupper($countrycode) ==
"BE") {
4804 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4806 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4808 } elseif (strtoupper($countrycode) ==
"PF") {
4810 $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);
4812 } elseif (strtoupper($countrycode) ==
"CO") {
4814 $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);
4816 } elseif (strtoupper($countrycode) ==
"JO") {
4818 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 1) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
4820 } elseif (strtoupper($countrycode) ==
"JM") {
4822 $newphone = substr($newphone, 0, 5) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4824 } elseif (strtoupper($countrycode) ==
"MG") {
4826 $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);
4828 } elseif (strtoupper($countrycode) ==
"GB") {
4830 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4832 } elseif (strtoupper($countrycode) ==
"CH") {
4834 $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);
4836 $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);
4838 } elseif (strtoupper($countrycode) ==
"TN") {
4840 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4842 } elseif (strtoupper($countrycode) ==
"GF") {
4844 $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);
4846 } elseif (strtoupper($countrycode) ==
"GP") {
4848 $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);
4850 } elseif (strtoupper($countrycode) ==
"MQ") {
4852 $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);
4854 } elseif (strtoupper($countrycode) ==
"IT") {
4856 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4858 $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);
4860 } elseif (strtoupper($countrycode) ==
"AU") {
4864 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 1) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 4);
4866 } elseif (strtoupper($countrycode) ==
"LU") {
4869 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2);
4871 $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);
4873 $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);
4875 $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);
4877 } elseif (strtoupper($countrycode) ==
"PE") {
4880 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4);
4882 $newphonewa =
'+51' . $newphone;
4883 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3);
4885 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
4887 $newphonewa = $newphone;
4888 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4890 } elseif (strtoupper($countrycode) ==
"IN") {
4892 if ($withpicto ==
'phone') {
4893 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 4) . $separ . substr($newphone, 9, 4);
4895 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 5) . $separ . substr($newphone, 8, 5);
4900 $newphoneastart = $newphoneaend =
'';
4901 if (!empty($addlink)) {
4902 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (
isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4903 $newphoneastart =
'<a href="tel:' . urlencode($phone) .
'">';
4904 $newphoneaend .=
'</a>';
4905 } elseif (
isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4906 if (empty($user->clicktodial_loaded)) {
4907 $user->fetch_clicktodial();
4911 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4912 if (!empty($user->clicktodial_url)) {
4913 $urlmask = $user->clicktodial_url;
4916 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4917 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4918 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4920 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4922 $substitarray = array(
4923 '__PHONEFROM__' => $clicktodial_poste,
4924 '__PHONETO__' => urlencode($phone),
4925 '__LOGIN__' => $clicktodial_login,
4926 '__PASS__' => $clicktodial_password
4931 $newphoneastart =
'<a href="' . $url .
'" class="cssforclicktodial">';
4932 $newphoneaend =
'</a>';
4935 $newphoneastart =
'<a href="' . $url .
'"';
4937 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4939 $newphoneastart .=
'>';
4940 $newphoneaend .=
'</a>';
4945 if (
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4947 $addlinktoagenda =
'';
4948 if ($addlink ==
'AC_FAX') {
4952 $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>';
4954 if ($addlinktoagenda) {
4955 $newphone =
'<span>' . $newphone .
' ' . $addlinktoagenda .
'</span>';
4960 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4962 $newphone .=
' <a href="https://wa.me/' . $newphonewa .
'" target="_blank"';
4963 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4966 if (empty($titlealt)) {
4967 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4972 $parameters = array(
'countrycode' => $countrycode,
'cid' => $contactid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4973 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4974 $rep .= $hookmanager->resPrint;
4976 if (empty($reshook)) {
4979 if ($withpicto ==
'fax') {
4980 $picto =
'phoning_fax';
4981 } elseif ($withpicto ==
'phone') {
4983 } elseif ($withpicto ==
'mobile') {
4984 $picto =
'phoning_mobile';
4989 if ($adddivfloat == 1) {
4990 $rep .=
'<div class="nospan float' . ($morecss ?
' ' . $morecss :
'') .
'">';
4991 } elseif (empty($adddivfloat)) {
4992 $rep .=
'<span' . ($morecss ?
' class="' . $morecss .
'"' :
'') .
'>';
4995 $rep .= $newphoneastart;
4996 $rep .= ($withpicto ?
img_picto($titlealt, $picto) :
'');
4997 if ($separ !=
'hidenum') {
4998 $rep .= ($withpicto ?
' ' :
'') . $newphone;
5000 $rep .= $newphoneaend;
5002 if ($adddivfloat == 1) {
5004 } elseif (empty($adddivfloat)) {
5025 if (!isset($conf->cache[
'resolveips'])) {
5026 $conf->cache[
'resolveips'] = array();
5032 if (file_exists(DOL_DOCUMENT_ROOT .
'/theme/common/flags/' . $countrycode .
'.png')) {
5035 $ret .=
'(' . $countrycode .
')';
5043 if (in_array($mode, [0, 2])) {
5046 if (!array_key_exists($ip, $conf->cache[
'resolveips'])) {
5047 $domain = gethostbyaddr($ip);
5048 $conf->cache[
'resolveips'][$ip] = $domain;
5050 $domain = $conf->cache[
'resolveips'][$ip];
5078 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5085 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
5086 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
5087 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
5088 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5090 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
5093 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_CLIENT_IP']);
5096 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
5112 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
5114 } 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') {
5135 $datafile = $diroffile .
'/' .
getDolGlobalString(
'GEOIPMAXMIND_COUNTRY_DATAFILE_EMBEDDED');
5141 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5142 $geoip =
new DolGeoIP(
'country', $datafile);
5144 $countrycode = $geoip->getCountryCodeFromIP($ip);
5151 return $countrycode;
5163 global $conf, $langs, $user;
5172 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5173 $geoip =
new DolGeoIP(
'country', $datafile);
5174 $countrycode = $geoip->getCountryCodeFromIP($ip);
5175 $ret = $countrycode;
5194 global $hookmanager;
5200 $parameters = array(
'element' => $element,
'id' =>
$id);
5201 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
5202 $out .= $hookmanager->resPrint;
5204 if (empty($reshook)) {
5205 if (empty($charfornl)) {
5206 $out .= nl2br((
string) $address);
5208 $out .= preg_replace(
'/[\r\n]+/', $charfornl, (
string) $address);
5212 $showgmap = $showomap = 0;
5238 $url =
dol_buildpath(
'/google/gmaps.php?mode=' . $element .
'&id=' .
$id, 1);
5239 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5242 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode=' . $element .
'&id=' .
$id, 1);
5243 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'_openstreetmap" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5265function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
5267 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
5270 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
5273 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
5291 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
5292 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
5295 if (function_exists(
'getmxrr')) {
5298 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
5299 if (count($mxhosts) > 1) {
5302 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
5339 $tmparray = explode(
' ', $s);
5340 foreach ($tmparray as $tmps) {
5355function dol_strlen($string, $stringencoding =
'UTF-8')
5357 if (is_null($string)) {
5361 if (function_exists(
'mb_strlen')) {
5362 return mb_strlen($string, $stringencoding);
5364 return strlen($string);
5378function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
5382 if (empty($stringencoding)) {
5383 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
5387 if (empty($trunconbytes)) {
5388 if (function_exists(
'mb_substr')) {
5389 $ret = mb_substr($string, $start, $length, $stringencoding);
5391 $ret = substr($string, $start, $length);
5394 if (function_exists(
'mb_strcut')) {
5395 $ret = mb_strcut($string, $start, $length, $stringencoding);
5397 $ret = substr($string, $start, $length);
5417function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
5425 if (empty($stringencoding)) {
5426 $stringencoding =
'UTF-8';
5429 if (!empty($conf->dol_optimize_smallscreen) && $conf->dol_optimize_smallscreen == 1 && $display == 1) {
5430 $size = round($size / 3);
5434 if ($trunc ==
'right') {
5436 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5438 return dol_substr($newstring, 0, $size, $stringencoding) . ($nodot ?
'' :
'…');
5443 } elseif ($trunc ==
'middle') {
5445 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5446 $size1 = (int) round($size / 2);
5447 $size2 = (int) round($size / 2);
5448 return dol_substr($newstring, 0, $size1, $stringencoding) .
'…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
5452 } elseif ($trunc ==
'left') {
5454 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5456 return '…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
5460 } elseif ($trunc ==
'wrap') {
5462 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5468 return 'BadParam3CallingDolTrunc';
5482 $type2picto = array(
5483 'varchar' =>
'font',
5486 'int' =>
'sort-numeric-down',
5487 'double' =>
'sort-numeric-down',
5488 'price' =>
'currency',
5489 'pricecy' =>
'multicurrency',
5490 'password' =>
'key',
5491 'boolean' =>
'check-square',
5492 'date' =>
'calendar',
5493 'datetime' =>
'calendar',
5494 'duration' =>
'hourglass',
5500 'sellist' =>
'list',
5501 'stars' =>
'fontawesome_star_fas',
5502 'radio' =>
'check-circle',
5503 'checkbox' =>
'list',
5504 'chkbxlst' =>
'list',
5506 'icon' =>
"question",
5507 'point' =>
"country",
5508 'multipts' =>
'country',
5509 'linestrg' =>
"country",
5510 'polygon' =>
"country",
5511 'separate' =>
'minus'
5514 if (!empty($type2picto[$key])) {
5515 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5518 return img_picto(
'',
'generic',
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5545function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2, $allowothertags = array())
5550 $url = DOL_URL_ROOT;
5551 $theme = isset($conf->theme) ? $conf->theme :
null;
5552 $path =
'theme/' . $theme;
5553 if (empty($picto)) {
5558 if ($pictoisfullpath) {
5560 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5563 $fullpathpicto = $picto;
5565 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5566 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5567 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5572 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5573 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5574 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5577 $pictoconvertkey = array(
5578 'facture' =>
'bill',
5579 'shipping' =>
'shipment',
5580 'fichinter' =>
'intervention',
5581 'agenda' =>
'calendar',
5582 'invoice_supplier' =>
'supplier_invoice',
5583 'order_supplier' =>
'supplier_order');
5584 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5585 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5588 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5590 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5591 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5594 if ($pictowithouttext ==
'file-o') {
5595 $pictowithouttext =
'file';
5598 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5599 $marginleftonlyshort = 0;
5601 if (!empty($pictowithouttextarray[1])) {
5603 $fakey =
'fa-' . $pictowithouttextarray[0];
5604 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5605 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5606 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5608 $fakey =
'fa-' . $pictowithouttext;
5618 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5619 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5620 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5622 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5623 $morestyle = $reg[1];
5624 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5626 $moreatt = trim($moreatt);
5628 $enabledisablehtml =
'<span class="' . $faprefix .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5629 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5630 $enabledisablehtml .=
'</span>';
5632 return $enabledisablehtml;
5635 if (empty($srconly) && !preg_match(
'/[\.\/@]/', $picto)) {
5636 $fakey = $pictowithouttext;
5640 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'))) {
5643 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'))) {
5649 if ($pictowithouttext ==
'off') {
5650 $fakey =
'fa-square';
5652 } elseif ($pictowithouttext ==
'on') {
5653 $fakey =
'fa-check-square';
5655 } elseif ($pictowithouttext ==
'listlight') {
5656 $fakey =
'fa-download';
5657 $marginleftonlyshort = 1;
5658 } elseif ($pictowithouttext ==
'printer') {
5659 $fakey =
'fa-print';
5661 } elseif ($pictowithouttext ==
'note') {
5662 $fakey =
'fa-sticky-note';
5663 $marginleftonlyshort = 1;
5664 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5665 $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');
5666 $fakey =
'fa-' . $convertarray[$pictowithouttext];
5667 if (preg_match(
'/selected/', $pictowithouttext)) {
5670 $marginleftonlyshort = 1;
5671 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5672 $fakey =
'fa-' . $arrayconvpictotofa[$pictowithouttext];
5674 $fakey =
'fa-' . $pictowithouttext;
5677 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5678 $morecss .=
' em092';
5680 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'eventorganization',
'holiday',
'info',
'info_black',
'project',
'workstation'))) {
5681 $morecss .=
' em088';
5683 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5684 $morecss .=
' em080';
5688 $arrayconvpictotomarginleftonly = array(
5718 '1uparrow_selected',
5719 '1downarrow_selected',
5720 '1leftarrow_selected',
5721 '1rightarrow_selected'
5723 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5724 $marginleftonlyshort = 0;
5728 $arrayconvpictotomorcess = array(
5729 'action' =>
'infobox-action',
5730 'account' =>
'infobox-bank_account',
5731 'accounting_account' =>
'infobox-bank_account',
5732 'accountline' =>
'infobox-bank_account',
5733 'accountancy' =>
'infobox-bank_account',
5734 'admin' =>
'opacitymedium',
5735 'asset' =>
'infobox-bank_account',
5736 'bank_account' =>
'infobox-bank_account',
5737 'bill' =>
'infobox-commande',
5738 'billa' =>
'infobox-commande',
5739 'billr' =>
'infobox-commande',
5740 'billd' =>
'infobox-commande',
5741 'bookcal' =>
'infobox-portal',
5742 'margin' =>
'infobox-bank_account',
5743 'conferenceorbooth' =>
'infobox-project',
5744 'cash-register' =>
'infobox-portal',
5745 'contract' =>
'infobox-contrat',
5746 'check' =>
'font-status4',
5747 'conversation' =>
'infobox-contrat',
5748 'donation' =>
'infobox-commande',
5749 'dolly' =>
'infobox-commande',
5750 'dollyrevert' =>
'flip infobox-order_supplier',
5751 'ecm' =>
'infobox-action',
5752 'eventorganization' =>
'infobox-project',
5753 'hrm' =>
'infobox-adherent',
5754 'group' =>
'infobox-adherent',
5755 'intervention' =>
'infobox-contrat',
5756 'incoterm' =>
'infobox-supplier_proposal',
5757 'intracommreport' =>
'infobox-bank_account',
5758 'currency' =>
'infobox-bank_account',
5759 'multicurrency' =>
'infobox-bank_account',
5760 'members' =>
'infobox-adherent',
5761 'member' =>
'infobox-adherent',
5762 'money-bill-alt' =>
'infobox-bank_account',
5763 'order' =>
'infobox-commande',
5764 'user' =>
'infobox-adherent',
5765 'users' =>
'infobox-adherent',
5766 'error' =>
'pictoerror',
5767 'warning' =>
'pictowarning',
5768 'switch_on' =>
'font-status4',
5769 'switch_on_warning' =>
'font-status4 warning',
5770 'switch_on_red' =>
'font-status8',
5771 'switch_off_warning' =>
'font-status4 warning',
5772 'switch_off_red' =>
'font-status8',
5773 'holiday' =>
'infobox-holiday',
5774 'info' =>
'opacityhigh',
5775 'info_black' =>
'purple',
5776 'invoice' =>
'infobox-commande',
5777 'knowledgemanagement' =>
'infobox-contrat rotate90',
5778 'loan' =>
'infobox-commande',
5779 'payment' =>
'infobox-bank_account',
5780 'payment_vat' =>
'infobox-bank_account',
5781 'poll' =>
'infobox-portal',
5782 'pos' =>
'infobox-bank_account',
5783 'project' =>
'infobox-project',
5784 'projecttask' =>
'infobox-project',
5785 'propal' =>
'infobox-propal',
5786 'proposal' =>
'infobox-propal',
5787 'private' =>
'infobox-project',
5788 'reception' =>
'flip infobox-order_supplier',
5789 'recruitmentjobposition' =>
'infobox-adherent',
5790 'recruitmentcandidature' =>
'infobox-adherent',
5791 'resource' =>
'infobox-action',
5792 'salary' =>
'infobox-commande',
5793 'shapes' =>
'infobox-adherent',
5794 'shipment' =>
'infobox-commande',
5795 'store' =>
'infobox-portal',
5796 'stripe' =>
'infobox-bank_account',
5797 'supplier_invoice' =>
'infobox-order_supplier',
5798 'supplier_invoicea' =>
'infobox-order_supplier',
5799 'supplier_invoiced' =>
'infobox-order_supplier',
5800 'supplier' =>
'infobox-order_supplier',
5801 'supplier_order' =>
'infobox-order_supplier',
5802 'supplier_proposal' =>
'infobox-supplier_proposal',
5803 'ticket' =>
'infobox-contrat',
5804 'title_accountancy' =>
'infobox-bank_account',
5805 'title_hrm' =>
'infobox-holiday',
5806 'expensereport' =>
'infobox-expensereport',
5807 'trip' =>
'infobox-expensereport',
5808 'title_agenda' =>
'infobox-action',
5809 'vat' =>
'infobox-bank_account',
5810 'webportal' =>
'infobox-portal',
5812 'list-alt' =>
'imgforviewmode',
5813 'calendar' =>
'imgforviewmode',
5814 'calendarweek' =>
'imgforviewmode',
5815 'calendarmonth' =>
'imgforviewmode',
5816 'calendarday' =>
'imgforviewmode',
5817 'calendarperuser' =>
'imgforviewmode',
5818 'calendarpertype' =>
'imgforviewmode'
5820 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5821 $morecss .= ($morecss ?
' ' :
'') . $arrayconvpictotomorcess[$pictowithouttext];
5825 $arrayconvpictotocolor = array(
5826 'address' =>
'#6c6aa8',
5827 'building' =>
'#6c6aa8',
5831 'companies' =>
'#6c6aa8',
5832 'company' =>
'#6c6aa8',
5833 'contact' =>
'#6c6aa8',
5835 'dynamicprice' =>
'#a69944',
5840 'listlight' =>
'#999',
5841 'language' =>
'#555',
5845 'map-marker-alt' =>
'#aaa',
5847 'product' =>
'#a69944',
5848 'service' =>
'#a69944',
5849 'inventory' =>
'#a69944',
5850 'stock' =>
'#a69944',
5851 'movement' =>
'#a69944',
5853 'world' =>
'#986c6a',
5854 'partnership' =>
'#6c6aa8',
5855 'playdisabled' =>
'#ccc',
5856 'printer' =>
'#444',
5857 'projectpub' =>
'#986c6a',
5861 'search-plus' =>
'#808080',
5862 'security' =>
'#999',
5864 'stop-circle' =>
'#888',
5866 'superadmin' =>
'#600',
5867 'switch_off' =>
'#999',
5868 'technic' =>
'#999',
5870 'timespent' =>
'#555',
5871 'uncheck' =>
'#800',
5872 'uparrow' =>
'#555',
5873 'user-cog' =>
'#999',
5874 'country' =>
'#aaa',
5875 'globe-americas' =>
'#aaa',
5878 'website' =>
'#304',
5879 'workstation' =>
'#a69944'
5881 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5882 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5889 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5890 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5891 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5893 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5894 $morestyle = $reg[1];
5895 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5897 $moreatt = trim($moreatt);
5899 $enabledisablehtml =
'<span class="' . $fa .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5900 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5901 $enabledisablehtml .=
'</span>';
5903 return $enabledisablehtml;
5910 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
5911 $path = $theme .
'/theme/' . $theme;
5916 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5922 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5927 foreach ($conf->file->dol_document_root as $type => $dirroot) {
5928 if ($type ==
'main') {
5932 if (file_exists($dirroot .
'/' . $path .
'/img/' . $picto) && !empty($conf->file->dol_url_root)) {
5933 $url = DOL_URL_ROOT . $conf->file->dol_url_root[$type];
5939 $fullpathpicto = $url .
'/' . $path .
'/img/' . $picto;
5943 return $fullpathpicto;
5947 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 :
'') .
'"') .
'>';
5961 if (empty($mode) || $mode ==
'fa') {
5963 $arrayconvpictotofa = array(
5964 'account' =>
'university',
5965 'accounting_account' =>
'clipboard-list',
5966 'accountline' =>
'receipt',
5967 'accountancy' =>
'search-dollar',
5968 'action' =>
'calendar-alt',
5969 'add' =>
'plus-circle',
5970 'address' =>
'address-book',
5973 'asset' =>
'money-check-alt',
5974 'autofill' =>
'fill',
5975 'back' =>
'arrow-left',
5976 'bank_account' =>
'university',
5977 'bill' =>
'file-invoice-dollar',
5978 'billa' =>
'file-excel',
5979 'billr' =>
'file-invoice-dollar',
5980 'billd' =>
'file-medical',
5981 'blockedlog' =>
'file-archive',
5982 'bookcal' =>
'calendar-check',
5983 'supplier_invoice' =>
'file-invoice-dollar',
5984 'supplier_invoicea' =>
'file-excel',
5985 'supplier_invoicer' =>
'file-invoice-dollar',
5986 'supplier_invoiced' =>
'file-medical',
5988 'card' =>
'address-card',
5989 'chart' =>
'chart-line',
5990 'company' =>
'building',
5991 'contact' =>
'address-book',
5992 'contract' =>
'suitcase',
5993 'collab' =>
'people-arrows',
5994 'conversation' =>
'comments',
5995 'country' =>
'globe-americas',
5996 'cron' =>
'business-time',
5998 'chevron-double-left' =>
'angle-double-left',
5999 'chevron-double-right' =>
'angle-double-right',
6000 'chevron-double-down' =>
'angle-double-down',
6001 'chevron-double-top' =>
'angle-double-up',
6002 'donation' =>
'gift',
6003 'dynamicprice' =>
'hand-holding-usd',
6005 'companies' =>
'building',
6006 'products' =>
'cube',
6007 'commercial' =>
'suitcase',
6008 'invoicing' =>
'coins',
6009 'accounting' =>
'search-dollar',
6010 'category' =>
'tag',
6011 'dollyrevert' =>
'dolly',
6013 'generate' =>
'plus-square',
6014 'hrm' =>
'user-tie',
6015 'incoterm' =>
'truck-loading',
6016 'margin' =>
'calculator',
6017 'members' =>
'user-friends',
6018 'ticket' =>
'ticket-alt',
6019 'globe' =>
'external-link-alt',
6022 'establishment' =>
'building',
6023 'edit' =>
'pencil-alt',
6024 'entity' =>
'globe',
6025 'graph' =>
'chart-line',
6026 'grip_title' =>
'arrows-alt',
6027 'grip' =>
'arrows-alt',
6028 'help' =>
'question-circle',
6029 'generic' =>
'file',
6030 'holiday' =>
'umbrella-beach',
6031 'info' =>
'info-circle',
6032 'info_black' =>
'info-circle',
6033 'inventory' =>
'boxes',
6034 'intracommreport' =>
'globe-europe',
6035 'jobprofile' =>
'cogs',
6036 'knowledgemanagement' =>
'ticket-alt',
6037 'label' =>
'layer-group',
6038 'layout' =>
'columns',
6040 'loan' =>
'money-bill-alt',
6041 'member' =>
'user-alt',
6042 'meeting' =>
'chalkboard-teacher',
6044 'next' =>
'arrow-alt-circle-right',
6046 'expensereport' =>
'wallet',
6048 'movement' =>
'people-carry',
6049 'sign-out' =>
'sign-out-alt',
6050 'superadmin' =>
'star',
6051 'switch_off' =>
'toggle-off',
6052 'switch_off_grey' =>
'toggle-off',
6053 'switch_off_warning' =>
'toggle-off',
6054 'switch_off_red' =>
'toggle-off',
6055 'switch_on' =>
'toggle-on',
6056 'switch_on_grey' =>
'toggle-on',
6057 'switch_on_warning' =>
'toggle-on',
6058 'switch_on_red' =>
'toggle-on',
6060 'bookmark' =>
'star',
6061 'bank' =>
'university',
6062 'close_title' =>
'times',
6063 'delete' =>
'trash',
6064 'filter' =>
'filter',
6065 'list-alt' =>
'list-alt',
6066 'calendarlist' =>
'bars',
6067 'calendar' =>
'calendar-alt',
6068 'calendarmonth' =>
'calendar-alt',
6069 'calendarweek' =>
'calendar-week',
6070 'calendarday' =>
'calendar-day',
6071 'calendarperuser' =>
'table',
6072 'calendarpertype' =>
'table',
6073 'intervention' =>
'ambulance',
6074 'invoice' =>
'file-invoice-dollar',
6075 'order' =>
'file-invoice',
6076 'error' =>
'exclamation-triangle',
6077 'warning' =>
'exclamation-triangle',
6078 'other' =>
'square',
6079 'playdisabled' =>
'play',
6080 'pdf' =>
'file-pdf',
6081 'poll' =>
'check-double',
6082 'pos' =>
'cash-register',
6083 'preview' =>
'binoculars',
6084 'project' =>
'project-diagram',
6085 'projectpub' =>
'project-diagram',
6086 'projecttask' =>
'tasks',
6087 'propal' =>
'file-signature',
6088 'proposal' =>
'file-signature',
6089 'partnership' =>
'handshake',
6090 'payment' =>
'money-check-alt',
6091 'payment_vat' =>
'money-check-alt',
6092 'pictoconfirm' =>
'check-square',
6093 'phoning' =>
'phone',
6094 'phoning_mobile' =>
'mobile-alt',
6095 'phoning_fax' =>
'fax',
6096 'previous' =>
'arrow-alt-circle-left',
6097 'printer' =>
'print',
6098 'product' =>
'cube',
6099 'puce' =>
'angle-right',
6100 'recent' =>
'check-square',
6101 'reception' =>
'dolly',
6102 'recruitmentjobposition' =>
'id-card-alt',
6103 'recruitmentcandidature' =>
'id-badge',
6105 'supplier_order' =>
'dol-order_supplier',
6106 'supplier_proposal' =>
'file-signature',
6107 'refresh' =>
'redo',
6108 'region' =>
'map-marked',
6109 'replacement' =>
'exchange-alt',
6110 'resource' =>
'laptop-house',
6111 'recurring' =>
'history',
6112 'service' =>
'concierge-bell',
6113 'skill' =>
'shapes',
6114 'state' =>
'map-marked-alt',
6115 'security' =>
'key',
6116 'salary' =>
'wallet',
6117 'shipment' =>
'dolly',
6118 'stock' =>
'box-open',
6119 'stats' =>
'chart-bar',
6120 'split' =>
'code-branch',
6121 'status' =>
'stop-circle',
6122 'stripe' =>
'stripe-s',
6123 'supplier' =>
'building',
6124 'technic' =>
'cogs',
6126 'timespent' =>
'clock',
6127 'title_setup' =>
'tools',
6128 'title_accountancy' =>
'money-check-alt',
6129 'title_bank' =>
'university',
6130 'title_hrm' =>
'umbrella-beach',
6131 'title_agenda' =>
'calendar-alt',
6132 'uncheck' =>
'times',
6133 'uparrow' =>
'share',
6134 'url' =>
'external-link-alt',
6135 'vat' =>
'money-check-alt',
6136 'vcard' =>
'arrow-alt-circle-down',
6137 'jabber' =>
'comment',
6138 'website' =>
'globe-americas',
6139 'workstation' =>
'pallet',
6140 'webhook' =>
'bullseye',
6142 'private' =>
'user-lock',
6143 'conferenceorbooth' =>
'chalkboard-teacher',
6144 'eventorganization' =>
'project-diagram',
6145 'webportal' =>
'door-open'
6148 if ($conf->currency ==
'EUR') {
6149 $arrayconvpictotofa[
'currency'] =
'euro-sign';
6150 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
6152 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
6153 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
6156 $arrayconvpictotofa = array();
6159 return $arrayconvpictotofa;
6177function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $allowothertags = array())
6179 if (strpos($picto,
'^') === 0) {
6180 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6182 return img_picto($titlealt,
'object_' . $picto, $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6197function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
6201 if (is_numeric($picto)) {
6204 return '<i class="fa fa-weather-level' . $picto .
'"></i>';
6205 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6209 $path = DOL_URL_ROOT .
'/theme/' . $conf->theme .
'/img/weather/' . $picto;
6211 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
6225function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
6229 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6233 if ($pictoisfullpath) {
6236 $path = DOL_URL_ROOT .
'/theme/common/' . $picto;
6239 $themepath = DOL_DOCUMENT_ROOT .
'/theme/' . $conf->theme .
'/img/' . $picto;
6241 if (file_exists($themepath)) {
6247 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
6263function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
6267 if (empty($titlealt) || $titlealt ==
'default') {
6268 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
6270 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
6271 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
6273 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
6274 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
6276 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
6277 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
6279 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
6280 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
6282 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
6284 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus ' . $numaction);
6288 if (!is_numeric($numaction)) {
6292 return img_picto($titlealt, (empty($picto) ?
'stcomm' . $numaction .
'.png' : $picto), $moreatt);
6302function img_edit_add($titlealt =
'default', $other =
'')
6306 if ($titlealt ==
'default') {
6307 $titlealt = $langs->trans(
'Add');
6310 return img_picto($titlealt,
'edit_add.png', $other);
6323 if ($titlealt ==
'default') {
6324 $titlealt = $langs->trans(
'Remove');
6327 return img_picto($titlealt,
'edit_remove.png', $other);
6338function img_edit($titlealt =
'default', $float = 0, $other =
'')
6342 if ($titlealt ==
'default') {
6343 $titlealt = $langs->trans(
'Modify');
6346 return img_picto($titlealt,
'edit', ($float ?
'style="float: ' . ($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right') .
'"' :
"") . ($other ?
' ' . $other :
''));
6357function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
6361 if ($titlealt ==
'default') {
6362 $titlealt = $langs->trans(
'View');
6365 $moreatt = ($float ?
'style="float: right" ' :
'') . $other;
6367 return img_picto($titlealt,
'eye', $moreatt);
6378function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
6382 if ($titlealt ==
'default') {
6383 $titlealt = $langs->trans(
'Delete');
6386 return img_picto($titlealt,
'delete', $other, 0, 0, 0,
'', $morecss);
6396function img_printer($titlealt =
"default", $other =
'')
6399 if ($titlealt ==
"default") {
6400 $titlealt = $langs->trans(
"Print");
6402 return img_picto($titlealt,
'printer', $other);
6412function img_split($titlealt =
'default', $other =
'class="pictosplit"')
6416 if ($titlealt ==
'default') {
6417 $titlealt = $langs->trans(
'Split');
6420 return img_picto($titlealt,
'split', $other);
6430function img_help($usehelpcursor = 1, $usealttitle = 1)
6435 if (is_string($usealttitle)) {
6438 $usealttitle = $langs->trans(
'Info');
6442 return img_picto($usealttitle,
'info',
'style="vertical-align: middle;' . ($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')) .
'"');
6451function img_info($titlealt =
'default')
6455 if ($titlealt ==
'default') {
6456 $titlealt = $langs->trans(
'Informations');
6459 return img_picto($titlealt,
'info',
'style="vertical-align: middle;"');
6470function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
6474 if ($titlealt ==
'default') {
6475 $titlealt = $langs->trans(
'Warning');
6479 return img_picto($titlealt,
'warning',
'class="' . $morecss .
'"' . ($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' ' . $moreatt) :
''));
6488function img_error($titlealt =
'default')
6492 if ($titlealt ==
'default') {
6493 $titlealt = $langs->trans(
'Error');
6506function img_next($titlealt =
'default', $moreatt =
'')
6510 if ($titlealt ==
'default') {
6511 $titlealt = $langs->trans(
'Next');
6515 return '<span class="fa fa-chevron-right paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6525function img_previous($titlealt =
'default', $moreatt =
'')
6529 if ($titlealt ==
'default') {
6530 $titlealt = $langs->trans(
'Previous');
6534 return '<span class="fa fa-chevron-left paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6545function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
6549 if ($titlealt ==
'default') {
6550 $titlealt = $langs->trans(
'Down');
6553 return img_picto($titlealt, ($selected ?
'1downarrow_selected' :
'1downarrow'),
'class="imgdown' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6564function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
6568 if ($titlealt ==
'default') {
6569 $titlealt = $langs->trans(
'Up');
6572 return img_picto($titlealt, ($selected ?
'1uparrow_selected' :
'1uparrow'),
'class="imgup' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6583function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
6587 if ($titlealt ==
'default') {
6588 $titlealt = $langs->trans(
'Left');
6591 return img_picto($titlealt, ($selected ?
'1leftarrow_selected' :
'1leftarrow'), $moreatt);
6602function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
6606 if ($titlealt ==
'default') {
6607 $titlealt = $langs->trans(
'Right');
6610 return img_picto($titlealt, ($selected ?
'1rightarrow_selected' :
'1rightarrow'), $moreatt);
6620function img_allow($allow, $titlealt =
'default')
6624 if ($titlealt ==
'default') {
6625 $titlealt = $langs->trans(
'Active');
6642function img_credit_card($brand, $morecss =
'fa-2x inline-block valignmiddle')
6644 if (is_null($morecss)) {
6648 if ($brand ==
'visa' || $brand ==
'Visa') {
6650 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
6651 $brand =
'cc-mastercard';
6652 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
6654 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
6655 $brand =
'cc-discover';
6656 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
6658 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
6659 $brand =
'cc-diners-club';
6660 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
6661 $brand =
'credit-card';
6664 return '<span class="fa fa-' . $brand .
' fa-fw' . ($morecss ?
' ' . $morecss :
'') .
'"></span>';
6675function img_mime($file, $titlealt =
'', $morecss =
'')
6677 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
6683 if (empty($titlealt)) {
6684 $titlealt =
'Mime type: ' . $mimetype;
6688 return '<i class="fa fa-' . $mimefa .
' ' . (preg_match(
'/pictofixedwidth/', $morecss) ?
'' :
'paddingright ') . ($morecss ?
' ' . $morecss :
'') .
'"' . ($titlealt ?
' title="' .
dolPrintHTMLForAttribute($titlealt) .
'"' :
'') .
'></i>';
6699function img_search($titlealt =
'default', $other =
'')
6703 if ($titlealt ==
'default') {
6704 $titlealt = $langs->trans(
'Search');
6707 $img =
img_picto($titlealt,
'search', $other, 0, 1);
6709 $input =
'<input type="image" class="liste_titre" name="button_search" src="' . $img .
'" ';
6726 if ($titlealt ==
'default') {
6727 $titlealt = $langs->trans(
'Search');
6730 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
6732 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="' . $img .
'" ';
6750function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
6752 global $conf, $langs;
6754 if ($infoonimgalt) {
6755 $result =
img_picto($text,
'info',
'class="' . ($morecss ?
' ' . $morecss :
'') .
'"');
6757 if (empty($conf->use_javascript_ajax)) {
6758 $textfordropdown =
'';
6761 $class = (empty($admin) ?
'undefined' : ((string) $admin ==
'1' ?
'info' : $admin));
6762 $fa =
'info-circle';
6763 if ($picto ==
'warning') {
6764 $fa =
'exclamation-triangle';
6766 $result = ($nodiv ?
'' :
'<div class="wordbreak ' . $class . ($morecss ?
' ' . $morecss :
'') . ($textfordropdown ?
' hidden' :
'') .
'">');
6767 $result .=
img_picto((
string) $admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note'), $fa);
6770 $result .= ($nodiv ?
'' :
'</div>');
6772 if ($textfordropdown) {
6773 $tmpresult =
'<span class="' . $class .
'text opacitymedium cursorpointer">' . $langs->trans($textfordropdown) .
' ' .
img_picto($langs->trans($textfordropdown),
'1downarrow') .
'</span>';
6774 $tmpresult .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">
6775 jQuery(document).ready(function() {
6776 jQuery(".' . $class .
'text").click(function() {
6777 console.log("toggle text");
6778 jQuery(".' . $class .
'").toggle();
6783 $result = $tmpresult . $result;
6804 global $conf, $langs, $user, $argv;
6805 global $dolibarr_main_prod;
6812 require_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
6814 $langs->load(
"main");
6818 $langs->loadLangs(array(
'main',
'errors'));
6820 if ($_SERVER[
'DOCUMENT_ROOT']) {
6821 $out .= $langs->trans(
"DolibarrHasDetectedError") .
".<br>\n";
6823 $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";
6825 $out .= $langs->trans(
"InformationToHelpDiagnose") .
":<br>\n";
6827 $out .=
"<b>" . $langs->trans(
"Date") .
":</b> " .
dol_print_date(time(),
'dayhourlog') .
"<br>\n";
6828 $out .=
"<b>" . $langs->trans(
"Dolibarr") .
":</b> " . DOL_VERSION .
" - https://www.dolibarr.org<br>\n";
6829 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
6830 $out .=
"<b>" . $langs->trans(
"LevelOfFeature") .
":</b> " .
getDolGlobalInt(
'MAIN_FEATURES_LEVEL') .
"<br>\n";
6832 if ($user instanceof
User) {
6833 $out .=
"<b>" . $langs->trans(
"Login") .
":</b> " . $user->login .
"<br>\n";
6835 if (function_exists(
"phpversion")) {
6836 $out .=
"<b>" . $langs->trans(
"PHP") .
":</b> " . phpversion() .
"<br>\n";
6838 $out .=
"<b>" . $langs->trans(
"Server") .
":</b> " . (isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'') .
"<br>\n";
6839 if (function_exists(
"php_uname")) {
6840 $out .=
"<b>" . $langs->trans(
"OS") .
":</b> " . php_uname() .
"<br>\n";
6842 $out .=
"<b>" . $langs->trans(
"UserAgent") .
":</b> " . (isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'') .
"<br>\n";
6844 $out .=
"<b>" . $langs->trans(
"RequestedUrl") .
":</b> " . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT) :
'') .
"<br>\n";
6845 $out .=
"<b>" . $langs->trans(
"Referer") .
":</b> " . (isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'') .
"<br>\n";
6846 $out .=
"<b>" . $langs->trans(
"MenuManager") .
":</b> " . (isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'') .
"<br>\n";
6848 $syslog .=
"url=" . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_escape_htmltag($_SERVER[
"REQUEST_URI"]) :
'');
6849 $syslog .=
", query_string=" . (isset($_SERVER[
"QUERY_STRING"]) ?
dol_escape_htmltag($_SERVER[
"QUERY_STRING"]) :
'');
6851 $out .=
'> ' . $langs->transnoentities(
"ErrorInternalErrorDetected") .
":\n" . $argv[0] .
"\n";
6855 if (!empty($conf->modules)) {
6856 $out .=
"<b>" . $langs->trans(
"Modules") .
":</b> " . implode(
', ', $conf->modules) .
"<br>\n";
6859 if (is_object($db)) {
6860 if ($_SERVER[
'DOCUMENT_ROOT']) {
6861 $out .=
"<b>" . $langs->trans(
"DatabaseTypeManager") .
":</b> " . $db->type .
"<br>\n";
6862 $lastqueryerror = $db->lastqueryerror();
6864 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6866 $out .=
"<b>" . $langs->trans(
"RequestLastAccessInError") .
":</b> " . ($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6867 $out .=
"<b>" . $langs->trans(
"ReturnCodeLastAccessInError") .
":</b> " . ($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6868 $out .=
"<b>" . $langs->trans(
"InformationLastAccessInError") .
":</b> " . ($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6872 $out .=
'> ' . $langs->transnoentities(
"DatabaseTypeManager") .
":\n" . $db->type .
"\n";
6873 $out .=
'> ' . $langs->transnoentities(
"RequestLastAccessInError") .
":\n" . ($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6874 $out .=
'> ' . $langs->transnoentities(
"ReturnCodeLastAccessInError") .
":\n" . ($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6875 $out .=
'> ' . $langs->transnoentities(
"InformationLastAccessInError") .
":\n" . ($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6877 $syslog .=
", sql=" . $db->lastquery();
6878 $syslog .=
", db_error=" . $db->lasterror();
6881 if ($error || $errors) {
6883 if (is_array($error) && is_array($errors)) {
6884 $errors = array_merge($error, $errors);
6885 } elseif (is_array($error)) {
6887 } elseif (is_array($errors) && !empty($error)) {
6888 $errors = array_merge(array($error), $errors);
6889 } elseif (!empty($error)) {
6890 $errors = array_merge(array($error), array($errors));
6893 $langs->load(
"errors");
6895 foreach ($errors as $msg) {
6899 if ($_SERVER[
'DOCUMENT_ROOT']) {
6900 $out .=
"<b>" . $langs->trans(
"Message") .
":</b> " .
dol_escape_htmltag($msg) .
"<br>\n";
6902 $out .=
'> ' . $langs->transnoentities(
"Message") .
":\n" . $msg .
"\n";
6904 $syslog .=
", msg=" . $msg;
6907 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
6908 xdebug_print_function_stack();
6909 $out .=
'<b>XDebug information:</b>' .
"<br>\n";
6910 $out .=
'File: ' . xdebug_call_file() .
"<br>\n";
6911 $out .=
'Line: ' . xdebug_call_line() .
"<br>\n";
6912 $out .=
'Function: ' . xdebug_call_function() .
"<br>\n";
6917 if (!headers_sent()) {
6918 if (function_exists(
'top_httphead')) {
6922 http_response_code(202);
6925 if (empty($dolibarr_main_prod)) {
6928 if (empty($langs->defaultlang)) {
6929 $langs->setDefaultLang();
6931 $langs->loadLangs(array(
"main",
"errors"));
6933 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";
6934 print $langs->trans(
"DolibarrHasDetectedError") .
'. ';
6935 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6936 if (!defined(
"MAIN_CORE_ERROR")) {
6937 define(
"MAIN_CORE_ERROR", 1);
6954function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6958 if (empty($email)) {
6962 $langs->load(
"errors");
6965 print
'<br><div class="center login_main_message"><div class="' . $morecss .
'">';
6966 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode .
'-' .
dol_print_date($now,
'%Y%m%d%H%M%S'));
6967 if ($errormessage) {
6968 print
'<br><br>' . $errormessage;
6970 if (is_array($errormessages) && count($errormessages)) {
6971 foreach ($errormessages as $mesgtoshow) {
6972 print
'<br><br>' . $mesgtoshow;
6975 print
'</div></div>';
6994function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $param =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6996 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $param, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
7017function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
7019 global $langs, $form;
7022 if ($moreattrib ==
'class="right"') {
7023 $prefix .=
'right ';
7026 $tooltip = (string) $tooltip;
7028 $sortorder = strtoupper((
string) $sortorder);
7037 $tmpsortfield = explode(
',', (
string) $sortfield);
7038 $sortfield1 = trim($tmpsortfield[0]);
7039 $tmpfield = explode(
',', $field);
7040 $field1 = trim($tmpfield[0]);
7042 if (strpos((
string) $tooltip,
':') !==
false) {
7043 $tmptooltip = explode(
':', (
string) $tooltip);
7045 $tmptooltip = array($tooltip);
7048 $wrapcolumntitle = (empty($forcenowrapcolumntitle) || (!empty($tmptooltip[2]) && $tmptooltip[2] ==
'-1'));
7050 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && $wrapcolumntitle) {
7051 $prefix =
'wrapcolumntitle ' . $prefix;
7057 $liste_titre =
'liste_titre';
7058 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
7059 $liste_titre =
'liste_titre_sel';
7062 $tagstart =
'<' . $tag .
' class="' . $prefix . $liste_titre .
'" ' . $moreattrib;
7067 if (empty($thead) && $field && empty($disablesortlink)) {
7068 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7069 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7070 $options = preg_replace(
'/&+/i',
'&', $options);
7071 if (!preg_match(
'/^&/', $options)) {
7072 $options =
'&' . $options;
7075 $sortordertouseinlink =
'';
7076 if ($field1 != $sortfield1) {
7077 if (preg_match(
'/^DESC/i', $sortorder)) {
7078 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7080 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7083 if (preg_match(
'/^ASC/i', $sortorder)) {
7084 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7086 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7089 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
7090 $out .=
'<a class="reposition" href="' .
dolBuildUrl($file, [
'sortfield' => $field,
'sortorder' => $sortordertouseinlink,
'begin' => $begin]) . $options .
'"';
7094 if ($tooltip && $tmptooltip[0]) {
7096 $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]));
7098 $out .= $langs->trans((
string) $name);
7101 if (empty($thead) && $field && empty($disablesortlink)) {
7105 if (empty($thead) && $field) {
7106 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7107 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7108 $options = preg_replace(
'/&+/i',
'&', $options);
7109 if (!preg_match(
'/^&/', $options)) {
7110 $options =
'&' . $options;
7113 if (!$sortorder || ($field1 != $sortfield1)) {
7116 if (preg_match(
'/^DESC/', $sortorder)) {
7117 $sortimg .=
'<span class="nowrap">' .
img_up(
"Z-A", 0,
'paddingright') .
'</span>';
7119 if (preg_match(
'/^ASC/', $sortorder)) {
7120 $sortimg .=
'<span class="nowrap">' .
img_down(
"A-Z", 0,
'paddingright') .
'</span>';
7125 $tagend =
'</' . $tag .
'>';
7127 $out = $tagstart . $sortimg . $out . $tagend;
7142 dol_syslog(__FUNCTION__ .
" is deprecated", LOG_WARNING);
7144 print
'<div class="titre">' . $title .
'</div>';
7158function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
7177function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'', $morecssonpicto =
'widthpictotitle')
7181 if ($picto ==
'setup') {
7186 $return .=
'<table ' . (
$id ?
'id="' .
$id .
'" ' :
'') .
'class="centpercent notopnoleftnoright table-fiche-title' . ($morecssontable ?
' ' . $morecssontable :
'') .
'">';
7187 $return .=
'<tr class="toptitle">';
7189 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">' .
img_picto(
'', $picto,
'class="valignmiddle pictotitle'.($morecssonpicto ?
' '.$morecssonpicto :
'').
'"', $pictoisfullpath) .
'</td>';
7191 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
7192 $return .=
'<div class="titre inline-block">';
7193 $return .=
'<span class="inline-block valignmiddle">' . $title .
'</span>';
7194 $return .=
'</div>';
7197 $return .=
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7200 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">' . $morehtmlright .
'</td>';
7202 $return .=
'</tr></table>' .
"\n";
7230function 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 =
'')
7232 global $conf, $langs;
7235 $savtotalnboflines = $totalnboflines;
7236 if (is_numeric($totalnboflines)) {
7237 $totalnboflines = abs($totalnboflines);
7242 $tmparray = preg_split(
'/<br>/i', $title, 2);
7243 if (!empty($tmparray[1])) {
7244 $title = $tmparray[0];
7245 $subtitle = $tmparray[1];
7248 $page = (int) $page;
7250 if ($picto ==
'setup') {
7251 $picto =
'title_setup';
7253 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
7254 $picto =
'title.gif';
7257 $limit = $conf->liste_limit;
7260 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
7268 print
"<!-- Begin print_barre_liste -->\n";
7269 print
'<table class="centpercent notopnoleftnoright table-fiche-title' . ($morecss ?
' ' . $morecss :
'') .
'">';
7270 print
'<tr class="toptitle">';
7274 if ($picto && $title) {
7275 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
7276 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
7280 print
'<td class="nobordernopadding valignmiddle col-title">';
7281 print
'<div class="titre inline-block">';
7282 print
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7283 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'' && $totalnboflines > 0) {
7284 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="' . $langs->trans(
"NbRecordQualified") .
'">(' . $totalnboflines .
')</span>';
7287 if (!empty($subtitle)) {
7288 print
'<br><div class="subtitle inline-block hideonsmartphone">' . $subtitle .
'</div>';
7293 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
7294 print
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7298 print
'<td class="nobordernopadding valignmiddle right col-right">';
7299 print
'<input type="hidden" name="pageplusoneold" value="' . ((int) $page + 1) .
'">';
7301 parse_str($options, $query);
7303 $query += [
'sortfield' => $sortfield];
7306 $query += [
'sortorder' => $sortorder];
7309 $options =
'&' . http_build_query($query);
7311 $query = array_merge($query, [
'page' => $page]);
7315 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
7316 if ($totalnboflines) {
7318 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
7321 $nbpages = ceil($totalnboflines / $limit);
7325 $cpt = ($page - $maxnbofpage);
7331 if (empty($pagenavastextinput)) {
7333 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">1</a></li>';
7335 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7336 } elseif ($cpt == 2) {
7338 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">2</a></li>';
7344 if ($pagenavastextinput) {
7345 if ($cpt == $page) {
7346 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="' . ($totalnboflines > 100 ?
'width40' :
'width25') .
' center pageplusone heightofcombo" name="pageplusone" value="' . ($page + 1) .
'"></li>';
7350 if ($cpt == $page) {
7351 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
'</span></li>';
7353 $query[
'page'] = $cpt;
7354 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($cpt + 1) .
'</a></li>';
7358 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
7360 if (empty($pagenavastextinput)) {
7361 if ($cpt < $nbpages) {
7362 if ($cpt < $nbpages - 2) {
7363 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7364 } elseif ($cpt == $nbpages - 2) {
7365 $query[
'page'] = ($nbpages - 2);
7366 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($nbpages - 1) .
'</a></li>';
7368 $query[
'page'] = ($nbpages - 1);
7369 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7372 $query[
'page'] = ($nbpages - 1);
7373 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7376 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
"</li>";
7380 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
7381 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
7385 if ($pagenavastextinput) {
7395 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
7396 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">' . $morehtmlcenter .
'</div>';
7399 print
"<!-- End title -->\n\n";
7418function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
7420 global $conf, $langs;
7422 print
'<div class="pagination"><ul>';
7423 if ($beforearrows) {
7424 print
'<li class="paginationbeforearrows">';
7425 print $beforearrows;
7429 if (empty($hidenavigation)) {
7430 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
7431 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
7432 $pagesizechoices .=
',5000:5000';
7442 print
'<li class="pagination">';
7443 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 .
'">';
7444 print
'<datalist id="limitlist">';
7446 print
'<li class="paginationcombolimit valignmiddle">';
7447 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")) .
'">';
7449 $tmpchoice = explode(
',', $pagesizechoices);
7450 $tmpkey = $limit .
':' . $limit;
7451 if (!in_array($tmpkey, $tmpchoice)) {
7452 $tmpchoice[$tmpkey] = $tmpkey;
7454 $tmpkey = $conf->liste_limit .
':' . $conf->liste_limit;
7455 if (!in_array($tmpkey, $tmpchoice)) {
7456 $tmpchoice[$tmpkey] = $tmpkey;
7458 asort($tmpchoice, SORT_NUMERIC);
7459 foreach ($tmpchoice as $val) {
7461 $tmp = explode(
':', $val);
7464 if ($key !=
'' && $val !=
'') {
7465 if ((
int) $key == (
int) $limit) {
7466 $selected =
' selected="selected"';
7468 print
'<option name="' . $key .
'"' . $selected .
'>' .
dol_escape_htmltag($val) .
'</option>' .
"\n";
7472 print
'</datalist>';
7475 print
ajax_combobox(
"limit" . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
7479 if ($conf->use_javascript_ajax) {
7480 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
7482 jQuery(document).ready(function () {
7483 jQuery(".selectlimit").change(function() {
7484 console.log("We change limit so we submit the form");
7485 $(this).parents(\'form:first\').submit();
7494 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>';
7496 if ($betweenarrows) {
7497 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
7498 print $betweenarrows;
7499 print
'<!--</div>-->';
7501 if ($nextpage > 0) {
7502 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>';
7505 print
'<li class="paginationafterarrows">';
7510 print
'</ul></div>' .
"\n";
7525function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
7529 if (preg_match(
'/%/', $rate)) {
7530 $rate = str_replace(
'%',
'', $rate);
7534 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
7535 $morelabel =
' (' . $reg[1] .
')';
7536 $rate = preg_replace(
'/\s*' . preg_quote($morelabel,
'/') .
'/',
'', $rate);
7537 $morelabel =
' ' . ($html ?
'<span class="opacitymedium">' :
'') .
'(' . $reg[1] .
')' . ($html ?
'</span>' :
'');
7539 if (preg_match(
'/\*/', $rate)) {
7540 $rate = str_replace(
'*',
'', $rate);
7545 if (!preg_match(
'/\//', $rate)) {
7546 $ret =
price($rate, 0,
'', 0, 0) . ($addpercent ?
'%' :
'');
7549 $ret = $rate . ($addpercent ?
'%' :
'');
7551 if (($info_bits & 1) && $usestarfornpr >= 0) {
7574function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
7576 global $langs, $conf;
7579 if (empty($amount)) {
7582 $amount = (is_numeric($amount) ? $amount : 0);
7583 if ($rounding == -1) {
7586 $nbdecimal = $rounding;
7588 if ($outlangs ===
'none') {
7598 if (!($outlangs instanceof
Translate)) {
7602 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7603 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
7605 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7606 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
7608 if ($thousand ==
'None') {
7610 } elseif ($thousand ==
'Space') {
7617 $amount = str_replace(
',',
'.', $amount);
7619 $data = explode(
'.', $amount);
7620 $decpart = isset($data[1]) ? $data[1] :
'';
7621 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
7631 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
7632 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
7633 $nbdecimal = $nbdecimalmaxshown;
7641 if ((
string) $forcerounding !=
'-1' && (string) $forcerounding !=
'') {
7642 if ($forcerounding ===
'MU') {
7644 } elseif ($forcerounding ===
'MT') {
7646 } elseif ($forcerounding >= 0) {
7647 $nbdecimal = (int) $forcerounding;
7652 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
7654 $cursymbolbefore = $cursymbolafter =
'';
7655 if ($currency_code && is_object($outlangs)) {
7656 if ($currency_code ==
'auto') {
7657 $currency_code = $conf->currency;
7660 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
7661 $listoflanguagesbefore = array(
'nl_NL');
7662 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
7663 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
7665 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
7666 $cursymbolafter .= ($tmpcur == $currency_code ?
' ' . $tmpcur : $tmpcur);
7669 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' ' :
'') . $cursymbolafter;
7671 $output = preg_replace(
'/\s/',
' ', $output);
7672 $output = preg_replace(
'/\'/',
''', $output);
7703function price2num($amount, $rounding =
'', $option = 0)
7708 if (is_null($amount)) {
7717 if (is_null($langs)) {
7721 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7722 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
7724 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7725 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
7728 if ($thousand ==
'None') {
7730 } elseif ($thousand ==
'Space') {
7738 if (!is_numeric($amount)) {
7739 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
7742 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
7743 $amount = str_replace($thousand,
'', $amount);
7749 if (is_numeric($amount)) {
7751 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7752 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7754 $amount = number_format($amount, $nbofdec, $dec, $thousand);
7760 if ($thousand !=
',' && $thousand !=
'.') {
7773 if (preg_match(
'/^(?<int>[^,]*,|[^.]*\.)(?<dec>[^.,]*)$/u', $amount, $matches)) {
7774 $intPart = $matches[
'int'];
7775 $decPart = $matches[
'dec'];
7778 $intPart = str_replace([
'.',
','],
'', $intPart);
7781 $amount = $intPart . $dec . $decPart;
7785 $amount = str_replace(
' ',
'', $amount);
7786 $amount = str_replace($thousand,
'', $amount);
7787 $amount = str_replace($dec,
'.', $amount);
7789 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7795 $nbofdectoround =
'';
7796 if ($rounding ==
'MU') {
7798 } elseif ($rounding ==
'MT') {
7800 } elseif ($rounding ==
'MS') {
7802 } elseif ($rounding ==
'CU') {
7804 } elseif ($rounding ==
'CT') {
7806 } elseif (is_numeric($rounding)) {
7807 $nbofdectoround = (int) $rounding;
7812 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7814 return 'ErrorBadParameterProvidedToFunction';
7820 if (is_numeric($amount)) {
7822 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7823 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7825 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7831 if ($thousand !=
',' && $thousand !=
'.') {
7832 $amount = str_replace(
',',
'.', $amount);
7835 $amount = str_replace(
' ',
'', $amount);
7836 $amount = str_replace($thousand,
'', $amount);
7837 $amount = str_replace($dec,
'.', $amount);
7839 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7857function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7859 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
7861 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7862 $dimension *= 1000000;
7864 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7867 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7868 $dimension /= 1000000;
7870 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
7887 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
7907function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
7909 global $db, $conf,
$mysoc;
7911 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
7912 $thirdparty_seller =
$mysoc;
7915 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);
7917 $vatratecleaned = $vatrate;
7919 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
7920 $vatratecleaned = trim($reg[1]);
7921 $vatratecode = $reg[2];
7930 if (
$mysoc->country_code ==
'ES') {
7932 if (!
$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
7935 if ($thirdparty_seller->id ==
$mysoc->id) {
7936 if (!$thirdparty_buyer->localtax1_assuj) {
7940 if (!$thirdparty_seller->localtax1_assuj) {
7948 if (!
$mysoc->localtax2_assuj) {
7951 if ($thirdparty_seller->id ==
$mysoc->id) {
7952 if (!$thirdparty_buyer->localtax2_assuj) {
7956 if (!$thirdparty_seller->localtax2_assuj) {
7962 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
7965 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
7971 if (in_array(
$mysoc->country_code, array(
'ES'))) {
7972 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
7978 if ($thirdparty_seller !=
$mysoc) {
7980 return $thirdparty_seller->localtax1_value;
7989 if ($thirdparty_seller !=
$mysoc) {
7992 return $thirdparty_seller->localtax2_value;
7995 if (in_array(
$mysoc->country_code, array(
'ES'))) {
7996 return $thirdparty_buyer->localtax2_value;
8005 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
8006 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8007 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($thirdparty_seller->country_code) .
"'";
8008 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8009 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8010 if (!empty($vatratecode)) {
8011 $sql .=
" AND t.code ='" . $db->escape($vatratecode) .
"'";
8013 $sql .=
" AND t.recuperableonly = '" . $db->escape((
string) $vatnpr) .
"'";
8016 $resql = $db->query($sql);
8019 $obj = $db->fetch_object($resql);
8022 return $obj->localtax1;
8023 } elseif ($local == 2) {
8024 return $obj->localtax2;
8045 $valors = explode(
":", $tax);
8047 if (count($valors) > 1) {
8064 $sql =
" SELECT t.localtax" . $local .
" as localtax";
8065 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t INNER JOIN " . MAIN_DB_PREFIX .
"c_country as c ON c.rowid = t.fk_pays";
8066 $sql .=
" WHERE c.code = '" . $db->escape(
$mysoc->country_code) .
"' AND t.active = 1 AND t.entity IN (" .
getEntity(
'c_tva') .
") AND t.taux = (";
8067 $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";
8068 $sql .=
" WHERE c.code = '" . $db->escape(
$mysoc->country_code) .
"' AND t.entity IN (" .
getEntity(
'c_tva') .
") AND tt.active = 1)";
8069 $sql .=
" AND t.localtax" . $local .
"_type <> '0'";
8070 $sql .=
" ORDER BY t.rowid DESC";
8072 $resql = $db->query($sql);
8074 $obj = $db->fetch_object($resql);
8076 return $obj->localtax;
8097function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
8101 dol_syslog(
"getTaxesFromId vat id or rate = " . $vatrate);
8104 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
8105 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
8106 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8107 if ($firstparamisid) {
8108 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8110 $vatratecleaned = $vatrate;
8113 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8114 $vatratecleaned = $reg[1];
8115 $vatratecode = $reg[2];
8118 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8121 $sql .=
" WHERE t.fk_pays = c.rowid";
8123 $sql .=
" AND c.code = '" . $db->escape($buyer->country_code) .
"'";
8125 $sql .=
" AND c.code = '" . $db->escape($seller->country_code) .
"'";
8127 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8128 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8130 $sql .=
" AND t.code = '" . $db->escape($vatratecode) .
"'";
8134 $resql = $db->query($sql);
8136 $obj = $db->fetch_object($resql);
8139 'rowid' => $obj->rowid,
8140 'code' => $obj->code,
8141 'rate' => $obj->rate,
8142 'localtax1' => $obj->localtax1,
8143 'localtax1_type' => $obj->localtax1_type,
8144 'localtax2' => $obj->localtax2,
8145 'localtax2_type' => $obj->localtax2_type,
8147 'accountancy_code_sell' => $obj->accountancy_code_sell,
8148 'accountancy_code_buy' => $obj->accountancy_code_buy
8180 dol_syslog(
"getLocalTaxesFromRate vatrate=" . $vatrate .
" local=" . $local);
8183 $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";
8184 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8185 if ($firstparamisid) {
8186 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8188 $vatratecleaned = $vatrate;
8191 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8192 $vatratecleaned = $reg[1];
8193 $vatratecode = $reg[2];
8196 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8198 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ?
$mysoc->country_code : $buyer->country_code);
8199 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($countrycodetouse) .
"'";
8201 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ?
$mysoc->country_code : $seller->country_code);
8202 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" . $db->escape($countrycodetouse) .
"'";
8204 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8206 $sql .=
" AND t.code = '" . $db->escape($vatratecode) .
"'";
8210 $resql = $db->query($sql);
8212 $obj = $db->fetch_object($resql);
8215 $vateratestring = $obj->rate . ($obj->code ?
' (' . $obj->code .
')' :
'');
8218 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8219 } elseif ($local == 2) {
8220 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8222 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);
8244 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8252 $product->fetch($idprod);
8254 if ((
$mysoc->country_code == $thirdpartytouseforcountry->country_code)
8255 || (in_array(
$mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouseforcountry->country_code, array(
'FR',
'MC')))
8256 || (in_array(
$mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouseforcountry->country_code, array(
'MQ',
'GP')))
8259 if ($idprodfournprice > 0) {
8260 $result = $product->get_buyprice($idprodfournprice, 0, 0,
'');
8262 $ret = $product->vatrate_supplier;
8263 if ($product->default_vat_code_supplier) {
8264 $ret .=
' (' . $product->default_vat_code_supplier .
')';
8270 $ret = $product->tva_tx;
8271 if ($product->default_vat_code) {
8272 $ret .=
' (' . $product->default_vat_code .
')';
8285 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
8286 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8287 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '" . $db->escape($thirdpartytouseforcountry->country_code) .
"'";
8288 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8289 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8290 $sql .= $db->plimit(1);
8292 $resql = $db->query($sql);
8294 $obj = $db->fetch_object($resql);
8296 $ret = $obj->vat_rate;
8297 if ($obj->default_vat_code) {
8298 $ret .=
' (' . $obj->default_vat_code .
')';
8322 dol_syslog(
"get_product_vat_for_country: ret=" . $ret);
8340 if (!class_exists(
'Product')) {
8341 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8350 $result = $product->fetch($idprod);
8352 if (
$mysoc->country_code == $thirdpartytouseforcountry->country_code) {
8366 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
8367 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8368 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='" . $db->escape($thirdpartytouseforcountry->country_code) .
"'";
8369 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8370 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
8371 $sql .= $db->plimit(1);
8373 $resql = $db->query($sql);
8375 $obj = $db->fetch_object($resql);
8378 $ret = $obj->localtax1;
8379 } elseif ($local == 2) {
8380 $ret = $obj->localtax2;
8388 dol_syslog(
"get_product_localtax_for_country: ret=" . $ret);
8412 global
$mysoc, $db, $hookmanager;
8414 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
8417 $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;
8419 if (empty($thirdparty_seller->country_code)) {
8420 $thirdparty_seller->country_code =
$mysoc->country_code;
8422 $seller_country_code = $thirdparty_seller->country_code;
8423 $seller_in_cee =
isInEEC($thirdparty_seller);
8425 if (empty($thirdparty_buyer->country_code)) {
8426 $thirdparty_buyer->country_code =
$mysoc->country_code;
8428 $buyer_country_code = $thirdparty_buyer->country_code;
8429 $buyer_in_cee =
isInEEC($thirdparty_buyer);
8431 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'));
8439 if ($seller_in_cee && $buyer_in_cee) {
8440 $isacompany = $thirdparty_buyer->
isACompany();
8441 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8442 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8450 $vatrule =
'VATRULE 0';
8456 if (empty($vatrule) && !$seller_use_vat) {
8464 $vatrule =
'VATRULE 1';
8468 if (empty($vatrule) && !empty($thirdparty_buyer->state_id)) {
8469 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
8470 $sql .=
" FROM " . $db->prefix() .
"c_tva as t";
8471 $sql .=
" INNER JOIN " . $db->prefix() .
"c_departements as d ON t.fk_department_buyer = d.rowid";
8472 $sql .=
" WHERE d.rowid = " . ((int) $thirdparty_buyer->state_id);
8473 $sql .=
" AND t.active > 0";
8474 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
8475 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8477 $res = $db->query($sql);
8479 if ($db->num_rows($res)) {
8480 $obj = $db->fetch_object($res);
8482 $vatvalue = $obj->vat_default_rate .
' (' . $obj->vat_default_code .
')';
8483 $vatrule =
'VATRULE 2';
8490 if (empty($vatrule) && (
8491 ($seller_country_code == $buyer_country_code)
8492 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
8493 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
8498 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
8502 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
8504 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
8505 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
8507 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
8511 $vatvalue = $tmpvat;
8512 $vatrule =
'VATRULE 3b';
8520 if (empty($vatrule) && ($seller_in_cee && $buyer_in_cee)) {
8521 $isacompany = $thirdparty_buyer->
isACompany();
8522 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8523 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8532 $vatrule =
'VATRULE 5';
8539 $vatrule =
'VATRULE 6';
8545 if (empty($vatrule) &&
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
8546 $isacompany = $thirdparty_buyer->
isACompany();
8549 $vatrule =
'VATRULE extra';
8562 $parameters = array(
'vatvalue' => $vatvalue,
'vatrule' => $vatrule);
8566 $reshook = $hookmanager->executeHooks(
'get_default_tva', $parameters, $tmpobject, $tmpaction);
8567 if ($reshook > 0 && !empty($hookmanager->resArray[
'vatvalue'])) {
8568 $vatvalue = $hookmanager->resArray[
'vatvalue'];
8569 $vatrule = $hookmanager->resArray[
'vatrule'];
8590 if ($idprodfournprice > 0) {
8591 if (!class_exists(
'ProductFournisseur')) {
8592 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
8595 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
8596 return $prodprice->fourn_tva_npr;
8597 } elseif ($idprod > 0) {
8598 if (!class_exists(
'Product')) {
8599 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8602 $prod->fetch($idprod);
8603 return $prod->tva_npr;
8626 if (!is_object($thirdparty_seller)) {
8629 if (!is_object($thirdparty_buyer)) {
8633 if (empty($thirdparty_seller->country_code)) {
8634 $thirdparty_seller->country_code =
$mysoc->country_code;
8636 $seller_country_code = $thirdparty_seller->country_code;
8639 if (empty($thirdparty_buyer->country_code)) {
8640 $thirdparty_buyer->country_code =
$mysoc->country_code;
8642 $buyer_country_code = $thirdparty_buyer->country_code;
8646 if (
$mysoc->country_code ==
'ES') {
8647 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
8652 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
8655 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
8659 } elseif ($local == 2) {
8661 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
8664 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
8669 if ($seller_country_code == $buyer_country_code) {
8684function yn($yesno, $format = 1, $color = 0)
8688 $result =
'unknown';
8690 if ($yesno ===
true || (
int) $yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
8691 $result = $langs->trans(
'yes');
8692 if ($format == 1 || $format == 3) {
8693 $result = $langs->trans(
"Yes");
8696 $result =
'<input type="checkbox" value="1" checked disabled>';
8699 $result =
'<input type="checkbox" value="1" checked disabled> ' . $result;
8701 if ($format == 4 || !is_numeric($format)) {
8702 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
8707 $result = $langs->trans(
"no");
8708 if ($format == 1 || $format == 3) {
8709 $result = $langs->trans(
"No");
8712 $result =
'<input type="checkbox" value="0" disabled>';
8715 $result =
'<input type="checkbox" value="0" disabled> ' . $result;
8717 if ($format == 4 || !is_numeric($format)) {
8718 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
8724 $classname =
'error';
8728 return '<span class="' . $classname .
'">' . $result .
'</span>';
8751function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
8753 if (empty($modulepart) && is_object(
$object)) {
8754 if (!empty(
$object->module)) {
8755 $modulepart =
$object->module;
8756 } elseif (!empty(
$object->element)) {
8757 $modulepart =
$object->element;
8764 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
8766 $arrayforoldpath[
'product'] = 2;
8769 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8770 $level = $arrayforoldpath[$modulepart];
8772 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8774 if (empty($num) && is_object(
$object)) {
8777 if (empty($alpha)) {
8778 $num = preg_replace(
'/([^0-9])/i',
'', $num);
8780 $num = preg_replace(
'/^.*\-/i',
'', $num);
8782 $num = substr(
"000" . $num, -$level);
8784 $path = substr($num, 0, 1);
8787 $path = substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8790 $path = substr($num, 2, 1) .
'/' . substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8796 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceof
Societe) {
8804 if (empty($withoutslash) && !empty($path)) {
8819function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
8821 dol_syslog(
"functions.lib::dol_mkdir: dir=" . $dir, LOG_INFO);
8826 if (@is_dir($dir_osencoded)) {
8834 if (!empty($dataroot)) {
8836 $dir = str_replace($dataroot .
'/',
'', $dir);
8837 $ccdir = $dataroot .
'/';
8840 $cdir = explode(
"/", $dir);
8841 $num = count($cdir);
8842 for ($i = 0; $i < $num; $i++) {
8844 $ccdir .=
'/' . $cdir[$i];
8846 $ccdir .= $cdir[$i];
8849 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
8857 if (!@is_dir($ccdir_osencoded)) {
8858 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' is not found (does not exists or is outside open_basedir PHP setting).", LOG_DEBUG);
8861 $dirmaskdec = octdec((
string) $newmask);
8862 if (empty($newmask)) {
8865 $dirmaskdec |= octdec(
'0111');
8866 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
8868 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '" . $ccdir .
"' (no permission to write into parent or directory already exists).", LOG_WARNING);
8871 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' created", LOG_DEBUG);
8880 return ($nberr ? -$nberr : $nbcreated);
8891function dolChmod($filepath, $newmask =
'')
8893 if (!empty($newmask)) {
8894 @chmod($filepath, octdec($newmask));
8908 return '<span class="fieldrequired">*</span>';
8928function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
8930 if (is_null($stringtoclean)) {
8934 if ($removelinefeed == 2) {
8935 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
8937 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
8942 $temp = str_replace(
'< ',
'__ltspace__', $temp);
8943 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
8946 $temp = strip_tags($temp);
8949 $pattern =
"/<[^<>]+>/";
8956 $tempbis = str_replace(
'<>',
'', $temp);
8957 $tempbis = preg_replace($pattern,
'', $tempbis);
8959 }
while ($tempbis != $temp);
8964 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
8970 if ($removelinefeed == 1) {
8971 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
8975 if ($removedoublespaces) {
8976 while (strpos($temp,
" ") !==
false) {
8977 $temp = str_replace(
" ",
" ", $temp);
8981 $temp = str_replace(
'__ltspace__',
'< ', $temp);
8982 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
9006function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
9008 if (empty($allowed_tags)) {
9009 $allowed_tags = array(
9066 $allowed_tags[] =
"comment";
9068 if (!in_array(
'iframe', $allowed_tags)) {
9069 $allowed_tags[] =
"iframe";
9073 if (!in_array(
'link', $allowed_tags)) {
9074 $allowed_tags[] =
"link";
9076 if (!in_array(
'meta', $allowed_tags)) {
9077 $allowed_tags[] =
"meta";
9081 if (!in_array(
'script', $allowed_tags)) {
9082 $allowed_tags[] =
"script";
9086 if (!in_array(
'style', $allowed_tags)) {
9087 $allowed_tags[] =
"style";
9091 $allowed_tags_string = implode(
"><", $allowed_tags);
9092 $allowed_tags_string =
'<' . $allowed_tags_string .
'>';
9094 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
9099 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
9102 $allowed_tags[] =
"commentphp";
9103 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
9104 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
9107 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
9108 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
9111 $temp = strip_tags($stringtoclean, $allowed_tags_string);
9113 if ($cleanalsosomestyles) {
9114 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
9116 if ($removeclassattribute) {
9117 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
9122 if ($cleanalsojavascript) {
9123 $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);
9126 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
9129 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
9132 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
9153 if (is_null($allowed_attributes)) {
9154 $allowed_attributes = array(
9188 if (!in_array(
"content", $allowed_attributes)) {
9189 $allowed_attributes[] =
"content";
9191 if (!in_array(
"http-equiv", $allowed_attributes)) {
9192 $allowed_attributes[] =
"http-equiv";
9195 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
9197 $stringtoclean =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $stringtoclean .
'</body></html>';
9200 $dom =
new DOMDocument(
'',
'UTF-8');
9202 $savwarning = error_reporting();
9203 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
9204 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
9205 error_reporting($savwarning);
9207 if ($dom instanceof DOMDocument) {
9208 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
9209 $el = $els->item($i);
9210 if (!$el instanceof DOMElement) {
9213 $attrs = $el->attributes;
9214 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
9216 if (!empty($attrs->item($ii)->name)) {
9217 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
9219 $els->item($i)->removeAttribute($attrs->item($ii)->name);
9220 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
9222 $valuetoclean = $attrs->item($ii)->value;
9224 if (isset($valuetoclean)) {
9226 $oldvaluetoclean = $valuetoclean;
9227 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
9228 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
9229 if ($els->item($i)->tagName ==
'a') {
9230 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
9231 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
9232 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
9236 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
9237 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
9238 }
while ($oldvaluetoclean != $valuetoclean);
9241 $attrs->item($ii)->value = $valuetoclean;
9248 $dom->encoding =
'UTF-8';
9250 $return = $dom->saveHTML();
9254 $return = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]*' . preg_quote(
'></head><body>',
'/') .
'/',
'', $return);
9255 $return = preg_replace(
'/' . preg_quote(
'</body></html>',
'/') .
'$/',
'', trim($return));
9257 return trim($return);
9259 return $stringtoclean;
9276 $temp = $stringtoclean;
9277 foreach ($disallowed_tags as $tagtoremove) {
9278 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'>/',
'', $temp);
9279 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'\s+[^>]*>/',
'', $temp);
9282 if ($cleanalsosomestyles) {
9283 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
9301 if (!is_string($text) || $text ===
'') {
9306 $selfclosing = array(
'br',
'hr',
'img',
'input',
'meta',
'link',
'source',
'col',
'area',
'base',
'embed',
'param',
'track',
'wbr');
9309 if (preg_match_all(
'/<\s*(\/?)([a-zA-Z][a-zA-Z0-9]*)[^>]*?(\/?)\s*>/', $text, $matches, PREG_SET_ORDER)) {
9310 foreach ($matches as $match) {
9311 $tag = strtolower($match[2]);
9312 if (in_array($tag, $selfclosing) || !empty($match[3])) {
9315 if (empty($match[1])) {
9319 $idx = array_search($tag, array_reverse($opened,
true),
true);
9320 if ($idx !==
false) {
9321 unset($opened[$idx]);
9327 foreach (array_reverse($opened) as $tag) {
9328 $text .=
'</'.$tag.
'>';
9345 if ($nboflines == 1) {
9347 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
9348 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
9351 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
9356 return $firstline . (isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
9360 $text = preg_replace(
'/\n/',
'', $text);
9362 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9364 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9367 $text = strtr($text, $repTable);
9368 if ($charset ==
'UTF-8') {
9369 $pattern =
'/(<br[^>]*>)/Uu';
9372 $pattern =
'/(<br[^>]*>)/U';
9374 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9379 $lastaddediscontent = 1;
9380 while ($countline < $nboflines && isset($a[$i])) {
9381 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
9382 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
9383 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
9385 if (!$lastaddediscontent) {
9388 $lastaddediscontent = 0;
9391 $firstline .= $a[$i];
9392 $lastaddediscontent = 1;
9398 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
9400 $ret = $firstline . ($adddots ?
'...' :
'');
9418function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
9420 if (is_null($stringtoencode)) {
9425 return nl2br($stringtoencode, $forxml);
9427 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
9441function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
9443 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
9448 return $stringtoencode;
9450 $out = $stringtoencode;
9454 $oldstringtoclean = $out;
9462 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
9464 libxml_use_internal_errors(
false);
9465 if (LIBXML_VERSION < 20900) {
9469 libxml_disable_entity_loader(
true);
9472 $dom =
new DOMDocument();
9480 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">' . $out .
'</div></body></html>';
9484 $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>';
9490 $out = preg_replace_callback(
9491 '/__\[([0-9a-zA-Z_]+)\]__/',
9497 return '__BRACKETSTART' . $m[1] .
'BRACKETEND__';
9502 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
9504 $dom->encoding =
'UTF-8';
9506 $out = trim($dom->saveHTML());
9509 $out = preg_replace_callback(
9510 '/__BRACKETSTART([0-9a-zA-Z_]+)BRACKETEND__/',
9516 return '__[' . $m[1] .
']__';
9523 $out = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]+' . preg_quote(
'></head><body><div class="tricktoremove">',
'/') .
'/',
'', $out);
9524 $out = preg_replace(
'/' . preg_quote(
'</div></body></html>',
'/') .
'$/',
'', trim($out));
9529 $out = str_replace(
'<br>',
'', $out);
9534 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9541 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript')) && $outishtml) {
9547 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
9554 'quote-marks' =>
false,
9555 'doctype' =>
'strict',
9556 'show-body-only' =>
true,
9557 "indent-attributes" =>
false,
9558 "vertical-space" =>
false,
9561 'preserve-entities' =>
true
9571 $out = $tidy->repairString($out, $config,
'utf8');
9580 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9586 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
9589 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
9593 $out = preg_replace(
'/'/i',
''', $out);
9598 if (function_exists(
'realCharForNumericEntities')) {
9599 $out = preg_replace_callback(
9600 '/&#(x?[0-9][0-9a-f]+;?)/i',
9605 static function ($m) {
9613 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
9616 if ($check ==
'restricthtmlallowlinkscript') {
9618 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
9620 } elseif ($check ==
'restricthtmlallowiframe') {
9633 $out = preg_replace(
'/'/i',
"'", $out);
9637 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
9638 $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);
9639 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
9640 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
9641 $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);
9642 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
9644 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
9645 }
while ($oldstringtoclean != $out);
9652 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
9653 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
9654 $nblinks = count($reg[0]);
9655 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
9656 $out =
'ErrorTooManyLinksIntoHTMLString';
9659 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
9661 $out =
'ErrorHTMLLinksNotAllowed';
9663 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
9668 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
9673 if (preg_match_all($pattern, $out, $matches)) {
9676 foreach ($matches[1] as $tmpval) {
9677 if (!empty($tmpval)) {
9681 foreach ($matches[2] as $tmpval) {
9682 if (!empty($tmpval)) {
9690 foreach ($urls as $url) {
9692 $parsedurl = parse_url($url);
9693 if (!empty($parsedurl)) {
9702 if (empty($firstexturl)) {
9703 $firstexturl = $url;
9704 } elseif (empty($secondexturl)) {
9705 $secondexturl = $url;
9711 $out =
'ErrorHTMLExternalLinksNotAllowed (Example: '.$firstexturl.($secondexturl ?
' '.$secondexturl :
'').
')';
9740function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
9742 if (is_null($stringtoencode)) {
9746 $newstring = $stringtoencode;
9748 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
9749 if ($removelasteolbr) {
9750 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
9752 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
9753 $newstring = strtr($newstring, array(
'&' =>
'__PROTECTand__',
'<' =>
'__PROTECTlt__',
'>' =>
'__PROTECTgt__',
'"' =>
'__PROTECTdquot__'));
9755 $newstring = strtr($newstring, array(
'__PROTECTand__' =>
'&',
'__PROTECTlt__' =>
'<',
'__PROTECTgt__' =>
'>',
'__PROTECTdquot__' =>
'"'));
9757 if ($removelasteolbr) {
9758 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
9777 $ret = preg_replace(
'/' .
"\r\n" .
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
9778 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\r\n" .
'/i',
"\r\n", $ret);
9779 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\n" .
'/i',
"\n", $ret);
9780 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
9792 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
9793 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|' .
"\n" .
'|' .
"\r" .
')+$/i',
"", $ret);
9809 if ($keepsomeentities) {
9810 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
9812 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string)
$c);
9813 if ($keepsomeentities) {
9814 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
9830function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
9832 return htmlentities($string, $flags, $encoding, $double_encode);
9851 for ($scursor = 0; $scursor < $len; $scursor++) {
9852 $ordchar = ord($s[$scursor]);
9854 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
9857 } elseif ($ordchar > 126 && $ordchar < 160) {
9861 $out .= $s[$scursor];
9883 $arraystring = explode(
"\n", $s);
9884 $nb = count($arraystring);
9901 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9903 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9906 $text = strtr($text, $repTable);
9907 if ($charset ==
'UTF-8') {
9908 $pattern =
'/(<br[^>]*>)/Uu';
9911 $pattern =
'/(<br[^>]*>)/U';
9913 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9915 $nblines = (int) floor((count($a) + 1) / 2);
9918 foreach ($a as $line) {
9921 $line_dec = html_entity_decode($line);
9923 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
9924 $nblines += substr_count($line_dec,
'\n');
9944 if (is_null($msg)) {
9949 if (preg_match(
'/<(html|link|script)/i', $msg)) {
9951 } elseif (preg_match(
'/<body/i', $msg)) {
9953 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9955 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9957 } elseif (preg_match(
'/<br/i', $msg)) {
9963 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
9964 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
9966 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
9968 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
9970 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
9972 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
9974 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
9976 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
9978 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
9980 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
9982 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
9985 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
9987 } elseif (preg_match(
'/&#x[a-f0-9][a-f0-9];/i', $msg)) {
10009function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
10011 if (!empty($invert)) {
10019 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
10034 return $text1.$text2;
10050function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude =
null,
$object =
null, $include =
null)
10052 global $db, $conf,
$mysoc, $user, $extrafields;
10054 $substitutionarray = array();
10056 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
10060 $emailsendersignature = $user->signature;
10061 $usersignature = $user->signature;
10062 $substitutionarray = array_merge($substitutionarray, array(
10063 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
10067 if (is_object($user) && ($user instanceof
User)) {
10068 $substitutionarray = array_merge($substitutionarray, array(
10069 '__USER_ID__' => (
string) $user->id,
10070 '__USER_LOGIN__' => (
string) $user->login,
10071 '__USER_EMAIL__' => (
string) $user->email,
10072 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
10073 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10074 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10075 '__USER_FAX__' => (
string) $user->office_fax,
10076 '__USER_LASTNAME__' => (
string) $user->lastname,
10077 '__USER_FIRSTNAME__' => (
string) $user->firstname,
10078 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
10079 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
10080 '__USER_JOB__' => (string) $user->job,
10082 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
10086 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object(
$mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
10087 $substitutionarray = array_merge($substitutionarray, array(
10088 '__MYCOMPANY_NAME__' =>
$mysoc->name,
10089 '__MYCOMPANY_EMAIL__' =>
$mysoc->email,
10090 '__MYCOMPANY_URL__' =>
$mysoc->url,
10092 '__MYCOMPANY_PHONEMOBILE__' =>
dol_print_phone(
$mysoc->phone_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10094 '__MYCOMPANY_PROFID1__' =>
$mysoc->idprof1,
10095 '__MYCOMPANY_PROFID2__' =>
$mysoc->idprof2,
10096 '__MYCOMPANY_PROFID3__' =>
$mysoc->idprof3,
10097 '__MYCOMPANY_PROFID4__' =>
$mysoc->idprof4,
10098 '__MYCOMPANY_PROFID5__' =>
$mysoc->idprof5,
10099 '__MYCOMPANY_PROFID6__' =>
$mysoc->idprof6,
10100 '__MYCOMPANY_PROFID7__' =>
$mysoc->idprof7,
10101 '__MYCOMPANY_PROFID8__' =>
$mysoc->idprof8,
10102 '__MYCOMPANY_PROFID9__' =>
$mysoc->idprof9,
10103 '__MYCOMPANY_PROFID10__' =>
$mysoc->idprof10,
10104 '__MYCOMPANY_CAPITAL__' =>
$mysoc->capital,
10105 '__MYCOMPANY_FULLADDRESS__' => (method_exists(
$mysoc,
'getFullAddress') ?
$mysoc->getFullAddress(1,
', ') :
''),
10107 '__MYCOMPANY_VATNUMBER__' =>
$mysoc->tva_intra,
10108 '__MYCOMPANY_ZIP__' =>
$mysoc->zip,
10109 '__MYCOMPANY_TOWN__' =>
$mysoc->town,
10110 '__MYCOMPANY_STATE__' =>
$mysoc->state,
10111 '__MYCOMPANY_COUNTRY__' =>
$mysoc->country,
10112 '__MYCOMPANY_COUNTRY_ID__' =>
$mysoc->country_id,
10113 '__MYCOMPANY_COUNTRY_CODE__' =>
$mysoc->country_code,
10114 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
10118 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
10120 $substitutionarray[
'__ID__'] =
'__ID__';
10121 $substitutionarray[
'__REF__'] =
'__REF__';
10122 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
10123 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
10124 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
10125 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
10126 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
10127 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
10128 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
10131 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
10132 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
10133 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
10134 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
10135 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
10136 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
10138 $substitutionarray[
'__THIRDPARTY_URL__'] =
'__THIRDPARTY_URL__';
10140 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
10141 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
10142 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
10143 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
10144 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
10145 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
10146 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
10147 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
10148 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
10149 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
10150 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
10151 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
10152 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
10153 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
10154 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
10155 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
10156 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
10157 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
10158 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
10160 if (
isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
10161 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
10162 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
10163 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
10164 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
10165 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
10170 if (
isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
10171 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
10172 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
10173 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
10174 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
10175 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
10176 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
10177 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
10178 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
10179 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
10182 if (
isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
10183 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
10184 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
10185 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
10187 if (
isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
10188 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
10189 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
10190 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
10194 if (
isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
10195 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
10196 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
10197 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
10198 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
10200 if (
isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
10201 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
10203 if (
isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
10204 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
10206 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
10207 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
10208 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
10209 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
10210 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
10211 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
10212 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
10214 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
10215 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
10216 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
10217 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
10218 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
10221 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
10222 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
10223 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
10226 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
10227 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
10230 '@phan-var-force Adherent|Delivery $object';
10232 $substitutionarray[
'__ID__'] =
$object->id;
10233 $substitutionarray[
'__REF__'] =
$object->ref;
10234 $substitutionarray[
'__NEWREF__'] =
$object->newref;
10236 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10237 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10238 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
10239 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
10241 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
10242 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
10243 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
10246 $date_delivery =
null;
10247 if (property_exists(
$object,
'date_delivery')) {
10248 $date_delivery =
$object->date_delivery;
10249 } elseif (property_exists(
$object,
'delivery_date')) {
10250 $date_delivery =
$object->delivery_date;
10252 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10253 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
10254 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
10255 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
10256 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
10257 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
10258 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
10259 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
10260 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
10263 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10264 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10266 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10267 $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 :
'')) :
'');
10271 '@phan-var-force Adherent $object';
10275 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
10276 if (method_exists(
$object,
'getCivilityLabel')) {
10277 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
10279 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
10280 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
10281 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
10282 if (method_exists(
$object,
'getFullName')) {
10283 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
10285 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
10286 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
10287 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
10288 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
10289 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
10290 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
10291 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
10292 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
10293 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
10294 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
10295 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
10299 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
10300 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
10302 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
10303 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
10304 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
10305 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
10306 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
10307 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
10308 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
10309 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
10310 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
10311 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
10312 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
10317 '@phan-var-force Societe $object';
10318 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->id ??
'';
10319 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->name ??
'';
10320 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->name_alias ??
'';
10321 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->code_client ??
'';
10322 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->code_fournisseur ??
'';
10323 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->email ??
'';
10324 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->email ??
'');
10325 $substitutionarray[
'__THIRDPARTY_URL__'] =
$object->url ??
'';
10326 $substitutionarray[
'__THIRDPARTY_URL_URLENCODED__'] = urlencode(
$object->url ??
'');
10329 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->address ??
'';
10330 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->zip ??
'';
10331 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->town ??
'';
10332 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->state ??
'';
10333 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->country_id > 0 ?:
'');
10334 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->country_code ??
'';
10335 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->idprof1 ??
'';
10336 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->idprof2 ??
'';
10337 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->idprof3 ??
'';
10338 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->idprof4 ??
'';
10339 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->idprof5 ??
'';
10340 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->idprof6 ??
'';
10341 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->tva_intra ??
'';
10344 } elseif (is_object(
$object) && is_object(
$object->thirdparty)) {
10345 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->thirdparty->id ??
'';
10346 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->thirdparty->name ??
'';
10347 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->thirdparty->name_alias ??
'';
10348 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->thirdparty->code_client ??
'';
10349 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->thirdparty->code_fournisseur ??
'';
10350 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->thirdparty->email ??
'';
10351 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->thirdparty->email ??
'');
10354 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->thirdparty->address ??
'';
10355 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->thirdparty->zip ??
'';
10356 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->thirdparty->town ??
'';
10357 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->thirdparty->state ??
'';
10358 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->thirdparty->country_id > 0 ?:
'');
10359 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->thirdparty->country_code ??
'';
10360 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->thirdparty->idprof1 ??
'';
10361 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->thirdparty->idprof2 ??
'';
10362 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->thirdparty->idprof3 ??
'';
10363 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->thirdparty->idprof4 ??
'';
10364 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->thirdparty->idprof5 ??
'';
10365 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->thirdparty->idprof6 ??
'';
10366 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->thirdparty->tva_intra ??
'';
10371 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
10372 '@phan-var-force RecruitmentCandidature $object';
10374 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
10375 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10376 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10378 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
10379 '@phan-var-force ConferenceOrBoothAttendee $object';
10381 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
10382 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10383 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10387 '@phan-var-force Project $object';
10389 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
10390 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
10391 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
10392 } elseif (is_object(
$object)) {
10394 if (!empty(
$object->project)) {
10397 if (!is_null($project) && is_object($project)) {
10398 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
10399 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
10400 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
10405 $project_id =
$object->fk_project;
10406 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
10407 $project_id =
$object->fk_project;
10409 if ($project_id > 0) {
10411 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10412 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10413 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10419 '@phan-var-force Facture $object';
10421 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
10424 '@phan-var-force Expedition $object';
10426 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
10427 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
10428 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
10431 '@phan-var-force Reception $object';
10433 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
10434 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
10438 '@phan-var-force Contrat $object';
10440 $dateplannedstart =
'';
10441 $datenextexpiration =
'';
10442 foreach (
$object->lines as $line) {
10443 if ($line->date_start > $dateplannedstart) {
10444 $dateplannedstart = $line->date_start;
10446 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
10447 $datenextexpiration = $line->date_end;
10450 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
10451 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
10452 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
10454 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
10455 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
10456 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
10460 '@phan-var-force Ticket $object';
10462 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
10463 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
10464 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
10465 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
10466 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
10467 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
10468 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
10469 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
10470 $userstat =
new User($db);
10471 if (
$object->fk_user_assign > 0) {
10472 $userstat->fetch(
$object->fk_user_assign);
10473 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10476 if (
$object->fk_user_create > 0) {
10477 $userstat->fetch(
$object->fk_user_create);
10478 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10484 if (!is_object($extrafields)) {
10487 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
10489 if (
$object->fetch_optionals() > 0) {
10490 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
10491 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
10492 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
10493 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day');
10494 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day',
'tzserver', $outputlangs);
10495 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'dayrfc');
10496 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
10497 $datetime =
$object->array_options[
'options_' . $key];
10498 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
10499 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
10500 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
10501 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
10502 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
10503 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_phone(
$object->array_options[
'options_' . $key]);
10504 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
10505 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
$object->array_options[
'options_' . $key];
10506 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATED__'] =
price(
$object->array_options[
'options_' . $key]);
10507 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATTED__'] =
price(
$object->array_options[
'options_' . $key]);
10508 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
10509 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10517 if (empty($substitutionarray[
'__REF__'])) {
10521 require_once DOL_DOCUMENT_ROOT .
'/core/lib/payments.lib.php';
10522 $outputlangs->loadLangs(array(
'paypal',
'other'));
10525 $typeforonlinepayment =
'free';
10527 $typeforonlinepayment =
'order';
10530 $typeforonlinepayment =
'invoice';
10533 $typeforonlinepayment =
'member';
10534 if (!empty(
$object->last_subscription_amount)) {
10535 $amounttouse =
$object->last_subscription_amount;
10539 $typeforonlinepayment =
'contract';
10542 $typeforonlinepayment =
'ficheinter';
10545 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], (
float) $amounttouse);
10546 $paymenturl = $url;
10550 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
10551 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
10555 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
10560 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10562 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
10565 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10567 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
10570 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10572 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
10575 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
10577 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
10580 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
10582 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
10585 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10587 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
10591 '@phan-var-force Propal $object';
10593 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/comm/propal/card.php?id=" .
$object->id;
10594 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10595 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
10598 '@phan-var-force Commande $object';
10600 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT .
"/commande/card.php?id=" .
$object->id;
10603 '@phan-var-force Facture $object';
10605 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/compta/facture/card.php?id=" .
$object->id;
10608 '@phan-var-force Contrat $object';
10610 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT .
"/contrat/card.php?id=" .
$object->id;
10611 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10612 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
10615 '@phan-var-force Fichinter $object';
10617 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT .
"/fichinter/card.php?id=" .
$object->id;
10618 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10619 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
10621 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
10622 '@phan-var-force SupplierProposal $object';
10624 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/supplier_proposal/card.php?id=" .
$object->id;
10626 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
10627 '@phan-var-force FactureFournisseur $object';
10629 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/fourn/facture/card.php?id=" .
$object->id;
10631 if (is_object(
$object) &&
$object->element ==
'payment_supplier') {
10632 '@phan-var-force PaiementFourn $object';
10635 $liste_factures = [];
10638 $sql =
'SELECT f.ref,f.multicurrency_code as f_mccode, pf.*
10639 FROM '.MAIN_DB_PREFIX.
'paiementfourn_facturefourn as pf
10640 JOIN '.MAIN_DB_PREFIX.
'facture_fourn as f ON pf.fk_facturefourn = f.rowid
10641 WHERE pf.fk_paiementfourn = '.((int)
$object->id);
10643 $resql = $db->query($sql);
10645 while ($objp = $db->fetch_object($resql)) {
10646 $liste_factures[] =
' - '.$outputlangs->trans(
'Invoice').
' '. $objp->ref.
' '.$outputlangs->trans(
'AmountPayed').
' '.
price($objp->multicurrency_amount, 0, $outputlangs, 0, -1, -1, $objp->multicurrency_code);
10649 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_LIST__'] = implode(
"\n", $liste_factures);
10651 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_TOTAL__'] =
price(
$object->multicurrency_amount, 0, $outputlangs, 0, -1, -1,
$object->multicurrency_code ?
$object->multicurrency_code : $conf->currency);
10654 '@phan-var-force Expedition $object';
10656 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT .
"/expedition/card.php?id=" .
$object->id;
10661 '@phan-var-force ActionComm $object';
10663 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
10664 $substitutionarray[
'__EVENT_DESCRIPTION__'] =
$object->note;
10665 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action" .
$object->type_code);
10666 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date(
$object->datep,
'day',
'auto', $outputlangs);
10667 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
10668 $substitutionarray[
'__EVENT_DATE_TZUSER__'] =
dol_print_date(
$object->datep,
'day',
'tzuserrel', $outputlangs);
10669 $substitutionarray[
'__EVENT_TIME_TZUSER__'] =
dol_print_date(
$object->datep,
'hour',
'tzuserrel', $outputlangs);
10674 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
10675 '@phan-var-force Facture|FactureRec $object';
10677 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functionsnumtoword.lib.php';
10680 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
10682 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
10684 $already_payed_all = 0;
10689 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
10691 $substitutionarray[
'__AMOUNT_EXCL_TAX_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ht, $outputlangs, $conf->currency,
true) :
'';
10693 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
10695 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
10697 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
10699 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10703 $mysocuselocaltax1 =
false;
10704 $mysocuselocaltax2 =
false;
10706 $tmparray =
$mysoc->useLocalTax(-1);
10707 $mysocuselocaltax1 = $tmparray[1];
10708 $mysocuselocaltax2 = $tmparray[2];
10712 if ($onlykey != 2 || $mysocuselocaltax1) {
10713 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
10715 if ($onlykey != 2 || $mysocuselocaltax2) {
10716 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
10720 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10721 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10722 $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) :
'';
10723 $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)) :
'';
10724 if ($onlykey != 2 || $mysocuselocaltax1) {
10725 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10727 if ($onlykey != 2 || $mysocuselocaltax2) {
10728 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
10731 if ($onlykey != 2) {
10732 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
10733 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
10734 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
10735 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
10736 if ($mysocuselocaltax1) {
10737 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
10739 if (
$mysoc->useLocalTax2) {
10740 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
10744 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
10745 $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) :
'';
10746 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
10747 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
10748 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
10752 if ($onlykey != 2) {
10753 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
10754 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
10755 $substitutionarray[
'__TOTAL_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10760 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
10761 include_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
10771 $daytext = $outputlangs->trans(
'Day' . $tmp[
'wday']);
10773 $substitutionarray = array_merge($substitutionarray, array(
10774 '__NOW_TMS__' => (
string) $now,
10775 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
10776 '__DAY__' => (
string) $tmp[
'mday'],
10777 '__DAY_TEXT__' => $daytext,
10778 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
10779 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
10780 '__MONTH__' => (
string) $tmp[
'mon'],
10781 '__MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp[
'mon'])),
10782 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp[
'mon'])),
10783 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp[
'mon'])),
10784 '__YEAR__' => (
string) $tmp[
'year'],
10785 '__YEAR_PREVIOUS_MONTH__' => (
string) $tmp3[
'year'],
10786 '__YEAR_NEXT_MONTH__' => (
string) $tmp5[
'year'],
10787 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
10788 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
10789 '__PREVIOUS_MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp3[
'month'])),
10790 '__PREVIOUS_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp3[
'month'])),
10791 '__PREVIOUS_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp3[
'month'])),
10792 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
10793 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
10794 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
10795 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month' . sprintf(
"%02d", $tmp5[
'month'])),
10796 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort' . sprintf(
"%02d", $tmp5[
'month'])),
10797 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort' . sprintf(
"%02d", $tmp5[
'month'])),
10798 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
10803 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
10805 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
10806 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
10807 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
10808 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey') .
' (load also language file before)';
10809 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
10814 return $substitutionarray;
10833function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
10835 global $db, $langs;
10837 if (!is_array($substitutionarray)) {
10838 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
10841 if (empty($outputlangs)) {
10842 $outputlangs = $langs;
10852 if (is_object($outputlangs)) {
10854 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
10856 $tmp = explode(
'|', $reg[1]);
10857 if (!empty($tmp[1])) {
10858 $outputlangs->load($tmp[1]);
10861 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
10863 if (empty($converttextinhtmlifnecessary)) {
10865 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10867 if (! $msgishtml) {
10871 if ($valueishtml) {
10879 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $value, $text);
10887 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
10888 $originalkeyfound = $reg[1];
10889 $keyfound = preg_replace(
'/\|urlencode$/',
'', $originalkeyfound);
10892 $value =
'*****forbidden*****';
10896 if (preg_match(
'/\|urlencode$/', $originalkeyfound)) {
10897 $value = urlencode($value);
10901 if (empty($converttextinhtmlifnecessary)) {
10903 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
10905 if (! $msgishtml) {
10908 if ($valueishtml) {
10916 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $value, $text);
10921 foreach ($substitutionarray as $key => $value) {
10922 if (!isset($value)) {
10926 if (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN') && ($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__')) {
10930 if (empty($converttextinhtmlifnecessary)) {
10931 $text = str_replace((
string) $key, (
string) $value, $text);
10933 if (! $msgishtml) {
10936 if ($valueishtml) {
10943 $text = str_replace((
string) $key, (
string) $value, $text);
10959 $memory_object_list = array();
10960 foreach ($substitutionarray as $key => $value) {
10961 $lazy_load_arr = array();
10962 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
10963 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
10964 $key_to_substitute = $lazy_load_arr[1];
10965 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
10966 $param_arr = explode(
':', (
string) $value);
10968 if (count($param_arr) == 4) {
10969 $path = $param_arr[0];
10970 $class = $param_arr[1];
10971 $method = $param_arr[2];
10972 $id = (int) $param_arr[3];
10975 if (!isset($memory_object_list[$class])) {
10977 require_once DOL_DOCUMENT_ROOT . $path;
10978 if (class_exists($class)) {
10979 $memory_object_list[$class] = array(
10987 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
10988 if (method_exists($class, $method)) {
10989 if (!isset($memory_object_list[$class][
'list'][
$id])) {
10990 $tmpobj =
new $class($db);
10992 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
10993 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
10996 $tmpobj = $memory_object_list[$class][
'list'][
$id];
10998 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
11001 $text = str_replace((
string) $key_to_substitute, (
string) $valuetouseforsubstitution, $text);
11027 global $conf, $user;
11029 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
11034 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
11036 foreach ($dirsubstitutions as $reldir) {
11044 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
11045 foreach ($substitfiles as $substitfile) {
11047 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
11050 dol_syslog(
"Library " . $substitfile[
'name'] .
" found into " . $dir);
11052 require_once $dir . $substitfile[
'name'];
11054 $function_name = $module .
"_" . $callfunc;
11055 if (function_exists($function_name)) {
11056 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
11064 foreach ($substitutionarray as $key => $value) {
11065 $tags .=
'{' . $key .
'} => ' . $value .
"\n";
11067 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
11080function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
11082 print
get_date_range($date_start, $date_end, $format, $outputlangs);
11095function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
11101 if (!is_object($outputlangs)) {
11102 $outputlangs = $langs;
11105 if ($date_start && $date_end) {
11106 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format, false, $outputlangs),
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11108 if ($date_start && !$date_end) {
11109 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11111 if (!$date_start && $date_end) {
11112 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11130 if ($nameorder < 0) {
11133 if ($nameorder == 1) {
11134 $ret .= $firstname;
11135 if ($firstname && $lastname) {
11139 } elseif ($nameorder == 2 || $nameorder == 3) {
11140 $ret .= $firstname;
11141 if (empty($ret) && $nameorder == 3) {
11146 if (empty($ret) && $nameorder == 5) {
11147 $ret .= $firstname;
11149 if ($nameorder == 0) {
11150 if ($firstname && $lastname) {
11153 $ret .= $firstname;
11172function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
11175 if (!is_array($mesgs)) {
11176 $mesgs = trim((
string) $mesgs);
11179 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
11183 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11185 $_SESSION[
'dol_events'][$style][] = $mesgs;
11190 foreach ($mesgs as $mesg) {
11191 $mesg = trim((
string) $mesg);
11193 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
11197 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11199 $_SESSION[
'dol_events'][$style][] = $mesg;
11219function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
11221 if (empty($mesg) && empty($mesgs)) {
11229 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE" . $messagekey])) {
11230 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
11231 dol_print_error(
null,
'Bad parameter style=' . $style .
' for setEventMessages');
11233 if (empty($mesgs)) {
11236 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
11257 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
11258 if (empty($disabledoutputofmessages)) {
11261 unset($_SESSION[
'dol_events'][
'mesgs']);
11264 if (isset($_SESSION[
'dol_events'][
'errors'])) {
11265 if (empty($disabledoutputofmessages)) {
11268 unset($_SESSION[
'dol_events'][
'errors']);
11272 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
11273 if (empty($disabledoutputofmessages)) {
11276 unset($_SESSION[
'dol_events'][
'warnings']);
11294function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
11296 global $conf, $langs;
11301 $divstart = $divend =
'';
11304 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
11305 $divstart =
'<div class="' . $style .
' clearboth">';
11306 $divend =
'</div>';
11309 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
11310 $langs->load(
"errors");
11312 if (is_array($mesgarray) && count($mesgarray)) {
11313 foreach ($mesgarray as $message) {
11315 $out .= $langs->trans($message);
11316 if ($ret < count($mesgarray)) {
11323 $out .= $langs->trans($mesgstring);
11329 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
11330 $return =
'<script nonce="' .
getNonce() .
'">
11331 $(document).ready(function() {
11332 /* jnotify(message, preset of message type, keepmessage) */
11333 $.jnotify("' .
dol_escape_js($out) .
'", "' . ($style ==
"ok" ? 3000 : $style) .
'", ' . ($style ==
"ok" ?
"false" :
"true") .
',{ remove: function (){} } );
11373function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
11375 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
11381 if (is_array($mesgarray)) {
11382 foreach ($mesgarray as $val) {
11383 if ($val && preg_match(
'/class="error"/i', $val)) {
11387 if ($val && preg_match(
'/class="warning"/i', $val)) {
11392 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
11394 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
11397 if ($style ==
'error' || $style ==
'errors') {
11400 if ($style ==
'warning' || $style ==
'warnings') {
11404 if ($iserror || $iswarning) {
11406 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
11407 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
11408 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
11410 if (is_array($mesgarray)) {
11411 $newmesgarray = array();
11412 foreach ($mesgarray as $val) {
11413 if (is_string($val)) {
11414 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
11415 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
11416 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
11417 $newmesgarray[] = $tmpmesgstring;
11419 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
11422 $mesgarray = $newmesgarray;
11424 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
11466function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
11469 $order = strtolower($order);
11471 if (is_array($array)) {
11472 $sizearray = count($array);
11473 if ($sizearray > 0) {
11476 foreach (array_keys($array) as $key) {
11477 $tmpmultikey = explode(
',', $index);
11478 $newindex = $tmpmultikey[0];
11479 if (is_object($array[$key])) {
11480 $temp[$key] = empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex;
11482 if (!empty($tmpmultikey[1])) {
11483 $newindex = $tmpmultikey[1];
11484 $temp[$key] .=
'__' . (empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex);
11488 $temp[$key] = empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex];
11490 if (!empty($tmpmultikey[1])) {
11491 $newindex = $tmpmultikey[1];
11493 $temp[$key] .=
'__' . (empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex]);
11496 if ($natsort == -1) {
11497 $temp[$key] =
'___' . $temp[$key];
11500 if (empty($natsort) || $natsort == -1) {
11501 if ($order ==
'asc') {
11507 if ($case_sensitive) {
11510 natcasesort($temp);
11512 if ($order !=
'asc') {
11513 $temp = array_reverse($temp,
true);
11519 foreach (array_keys($temp) as $key) {
11520 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
11539 $str = (string) $str;
11542 $strLength = strlen($str);
11543 for ($i = 0; $i < $strLength; $i++) {
11544 if (ord($str[$i]) < 0x80) {
11546 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
11548 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
11550 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
11552 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
11554 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
11559 for ($j = 0; $j < $n; $j++) {
11560 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
11581 return preg_match(
'//u', $str) ? true :
false;
11593 if (function_exists(
'mb_check_encoding')) {
11595 if (!mb_check_encoding($str,
'ASCII')) {
11599 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
11617 $tmp = ini_get(
"unicode.filesystem_encoding");
11618 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
11619 $tmp =
'iso-8859-1';
11628 if ($tmp ==
'iso-8859-1') {
11629 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
11650function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
11660 if ($useCache && isset($conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
11661 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
11664 dol_syslog(
'dol_getIdFromCode (value for field ' . $fieldid .
' from key ' . $key .
' not found into cache)', LOG_DEBUG);
11666 $sql =
"SELECT " . $fieldid .
" as valuetoget";
11667 $sql .=
" FROM " . MAIN_DB_PREFIX . $tablename;
11668 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
11669 $sql .=
" WHERE " . $fieldkey .
" = " . ((int) $key);
11671 $sql .=
" WHERE " . $fieldkey .
" = '" . $db->escape($key) .
"'";
11673 if (!empty($entityfilter)) {
11674 $sql .=
" AND entity IN (" .
getEntity($tablename) .
")";
11680 $resql = $db->query($sql);
11682 $obj = $db->fetch_object($resql);
11685 $valuetoget = $obj->valuetoget;
11686 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
11688 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
11692 return $valuetoget;
11712 $regextext = preg_replace(
'#^/\^?#',
'', (
string) $regextext);
11713 $regextext = preg_replace(
'#\$?/[imsxuADSUXJ]*$#',
'', $regextext);
11715 if ($matchrule == 1) {
11716 if ($var ==
'mainmenu') {
11718 return (preg_match(
'/^' . $regextext .
'/', $mainmenu));
11719 } elseif ($var ==
'leftmenu') {
11721 return (preg_match(
'/^' . $regextext .
'/', $leftmenu));
11723 return 'This variable is not accessible with dol_eval';
11726 return 'This value '.$matchrule.
' for param $matchrule is not yet implemented';
11740function verifCond($strToEvaluate, $onlysimplestring =
'1')
11744 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
11747 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
11749 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
11769function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
11771 if ($returnvalue != 1) {
11772 dol_syslog(
"Use of dol_eval with parameter returnvalue = 0 is now forbidden. Please fix this", LOG_ERR);
11795 $db, $langs, $user, $website, $websitepage,
11796 $action, $mainmenu, $leftmenu,
11805 defined(
'T_COALESCE_EQUAL') || define(
'T_COALESCE_EQUAL', PHP_INT_MAX);
11806 defined(
'T_FN') || define(
'T_FN', PHP_INT_MAX);
11809 defined(
'T_ATTRIBUTE') || define(
'T_ATTRIBUTE', PHP_INT_MAX);
11810 defined(
'T_MATCH') || define(
'T_MATCH', PHP_INT_MAX);
11811 defined(
'T_NAME_FULLY_QUALIFIED') || define(
'T_NAME_FULLY_QUALIFIED', PHP_INT_MAX);
11812 defined(
'T_NAME_QUALIFIED') || define(
'T_NAME_QUALIFIED', PHP_INT_MAX);
11813 defined(
'T_NAME_RELATIVE') || define(
'T_NAME_RELATIVE', PHP_INT_MAX);
11816 defined(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11817 defined(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
11818 defined(
'T_ENUM') || define(
'T_ENUM', PHP_INT_MAX);
11819 defined(
'T_READONLY') || define(
'T_READONLY', PHP_INT_MAX);
11822 defined(
'T_PRIVATE_SET') || define(
'T_PRIVATE_SET', PHP_INT_MAX);
11823 defined(
'T_PROTECTED_SET') || define(
'T_PROTECTED_SET', PHP_INT_MAX);
11824 defined(
'T_PUBLIC_SET') || define(
'T_PUBLIC_SET', PHP_INT_MAX);
11826 $prohibited_token_ids = [
11833 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
11834 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
11884 'T_OPEN_TAG_WITH_ECHO',
11918 $prohibited_variables = [
11930 $prohibited_functions = [
11933 'override_function',
11935 'session_create_id',
11936 'session_regenerate_id',
11938 'call_user_func_array',
11947 'dol_eval_standard',
11955 'mb_eregi_replace',
11956 'dol_compress_dir',
11960 'dol_delete_dir_recursive',
11962 'archiveOrBackupFile',
11964 'file_put_contents',
11978 'filter_input_array',
11982 $prohibited_token_arrangements = [
11987 ' T_CONSTANT_ENCAPSED_STRING ( ',
11991 $tokens = token_get_all(
"<?php return {$s};", TOKEN_PARSE);
11993 $tokens_arrangement =
' ';
11995 for ($i = 2,
$c = count($tokens) - 1; $i <
$c; ++$i) {
11996 if (is_array($tokens[$i])) {
11997 $token_id = $tokens[$i][0];
11998 $token_value = $tokens[$i][1];
11999 $token_name = token_name($tokens[$i][0]);
12001 $token_id = $tokens[$i];
12002 $token_value = $tokens[$i];
12003 $token_name = $tokens[$i];
12007 if (T_WHITESPACE === $token_id) {
12012 $tokens_arrangement .=
"{$token_name} ";
12016 T_VARIABLE === $token_id
12017 && in_array($token_value, $prohibited_variables,
true)
12019 return "« {$token_value} » is prohibited in « {$s} »";
12024 T_STRING === $token_id
12025 && in_array($token_value, $prohibited_functions,
true)
12027 return "« {$token_value} » is prohibited in « {$s} »";
12032 $maxi = count($prohibited_token_ids);
12033 for ($i = 0; $i < $maxi; ++$i) {
12034 if (
false !== strpos($tokens_arrangement,
" {$prohibited_token_ids[$i]} ")) {
12035 return "« {$prohibited_token_ids[$i]} » is prohibited in « {$s} »";
12040 $maxi = count($prohibited_token_arrangements);
12041 for ($i = 0; $i < $maxi; ++$i) {
12042 if (
false !== strpos($tokens_arrangement, $prohibited_token_arrangements[$i])) {
12043 return "« {$prohibited_token_arrangements[$i]} » is prohibited in « {$s} »";
12049 return @eval(
"return {$s};") ??
'';
12050 }
catch (Throwable $ex) {
12051 return "Exception during evaluation: " . $s .
" - " . $ex->getMessage();
12074 global $db, $langs, $user, $website, $websitepage;
12075 global $action, $mainmenu, $leftmenu;
12077 global $objectoffield;
12085 $isObBufferActive =
false;
12086 if ($onlysimplestring ==
'0') {
12087 $onlysimplestring =
'1';
12089 if (!in_array($onlysimplestring, array(
'1',
'2'))) {
12090 return "Bad call of dol_eval. Parameter onlysimplestring must be '1' or '2'.";
12092 if (!is_scalar($s)) {
12093 return "Bad call of dol_eval. First parameter must be a string, found ".var_export($s,
true);
12097 global $dolibarr_main_restrict_eval_methods;
12100 if (!isset($dolibarr_main_restrict_eval_methods)) {
12101 $dolibarr_main_restrict_eval_methods =
'getDolGlobalString, getDolGlobalInt, getDolCurrency, getDolEntity, getDolDBType, fetchNoCompute, hasRight, isAdmin, isModEnabled, isStringVarMatching, abs, min, max, round, dol_now, preg_match';
12104 $dolibarr_main_restrict_eval_methods_array = explode(
',', str_replace(
" ",
"", $dolibarr_main_restrict_eval_methods));
12112 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
12113 if ($onlysimplestring ==
'2') {
12114 $specialcharsallowed .=
'<[]';
12116 global $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12117 if (!empty($dolibarr_main_allow_unsecured_special_chars_in_dol_eval)) {
12118 $specialcharsallowed .= (string) $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12120 if (preg_match(
'/[^a-z0-9\s' . preg_quote($specialcharsallowed,
'/') .
']/i', $s)) {
12121 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): ' . $s;
12133 if (strpos($s,
'/*') !==
false || strpos($s,
'//') !==
false) {
12134 return 'Bad string syntax to evaluate (The comment string /* and // are not allowed): ' . $s;
12138 $tmps = str_replace(
' ? ',
'__XXX__', $s);
12139 if (strpos($tmps,
'?') !==
false) {
12140 return 'Bad string syntax to evaluate (The char ? can be used only with a space before and after): ' . $s;
12144 if (preg_match(
'/<=?[^\s]/', $s)) {
12145 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found a < or <= without space after): ' . $s;
12149 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
12150 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;
12153 if (empty($dolibarr_main_restrict_eval_methods)) {
12159 while ($scheck && $savescheck != $scheck) {
12160 $savescheck = $scheck;
12161 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12162 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12163 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
12164 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
12165 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
12166 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12167 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12168 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
12169 $scheck = preg_replace(
'/\s!\(/',
' __NOTANDPARENTHESIS__', $scheck);
12170 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
12175 if (strpos($scheck,
'(') !==
false) {
12176 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found call of a function or method without using the direct name of the function): ' . $s;
12180 if (strpos($s,
'`') !==
false) {
12181 return 'Bad string syntax to evaluate (backtick char is forbidden): ' . $s;
12186 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
12187 return 'Bad string syntax to evaluate (dot char is forbidden if not strictly between 2 numbers): ' . $s;
12195 while ($scheck && $savescheck != $scheck) {
12196 $savescheck = $scheck;
12197 $scheck = preg_replace(
'/\$conf->[a-z\_]+->enabled/',
'__VARCONFENABLED__', $scheck);
12198 $scheck = preg_replace(
'/\$user->id/',
'__VARUSERID__', $scheck);
12199 $scheck = preg_replace(
'/\$user->hasRight/',
'__VARUSERHASRIGHT__', $scheck);
12200 $scheck = preg_replace(
'/\$user->rights/',
'__VARUSERHASRIGHT__', $scheck);
12201 $scheck = preg_replace(
'/\$user->admin/',
'__VARUSERISADMIN__', $scheck);
12202 $scheck = preg_replace(
'/\(\$db\)/',
'__VARDB__', $scheck);
12203 $scheck = preg_replace(
'/\$langs/',
'__VARLANGSTRANS__', $scheck);
12204 $scheck = preg_replace(
'/\$mysoc/',
'__VARMYSOC__', $scheck);
12205 $scheck = preg_replace(
'/\$action/',
'__VARACTION__', $scheck);
12206 $scheck = preg_replace(
'/\$mainmenu/',
'__VARMAINMENU__', $scheck);
12207 $scheck = preg_replace(
'/\$leftmenu/',
'__VARLEFTMENU__', $scheck);
12208 $scheck = preg_replace(
'/\$websitepage/',
'__VARWEBSITEPAGE__', $scheck);
12209 $scheck = preg_replace(
'/\$website/',
'__VARWEBSITE__', $scheck);
12210 $scheck = preg_replace(
'/\$objectoffield/',
'__VAROBJECTOFFIELD__', $scheck);
12211 $scheck = preg_replace(
'/\$object/',
'__VAROBJECT__', $scheck);
12212 $scheck = preg_replace(
'/\$var/',
'__VARVAR__', $scheck);
12215 $scheck = preg_replace(
'/\$soc->canvas/',
'__VARSOCCANVAS__', $scheck);
12216 $scheck = preg_replace(
'/\$obj->canvas/',
'__VAROBJCANVAS__', $scheck);
12219 if (strpos($scheck,
'$') !==
false) {
12220 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);
12221 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;
12226 $forbiddenphpstrings = array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_GLOBAL',
'_POST',
'_REQUEST',
'ReflectionFunction',
'SplFileObject',
'SplTempFileObject');
12228 if (empty($dolibarr_main_restrict_eval_methods)) {
12232 $forbiddenphpfunctions = array();
12233 $forbiddenphpmethods = array();
12235 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
12236 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
12237 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
12239 $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"));
12240 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
12241 $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"));
12242 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
12243 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
12245 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
12247 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
12248 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
12249 $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"));
12250 $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", ));
12251 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"putenv",
"dl",
"apache_child_terminate",
"apache_setenv"));
12252 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"posix_kill",
"posix_setuid",
"posix_setgid"));
12253 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"executeCLI",
"verifCond",
"GETPOST",
"dolEncrypt",
"dolDecrypt"));
12254 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
12255 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
12256 $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"));
12257 $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"));
12258 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
12261 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64" .
"_" .
"decode",
"rawurl" .
"decode",
"url" .
"decode",
"str" .
"_rot13",
"hex" .
"2bin",
"printf",
"sprintf"));
12262 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concat",
"dol_concatdesc"));
12271 $forbiddenphpmethods = array_merge($forbiddenphpmethods, array(
'invoke',
'invokeArgs'));
12279 $forbiddenphpregex =
'global\s*\$';
12280 $forbiddenphpregex .=
'|';
12281 $forbiddenphpregex .=
'\b(' . implode(
'|', $forbiddenphpfunctions) .
')\b';
12283 $forbiddenphpmethodsregex =
'->(' . implode(
'|', $forbiddenphpmethods) .
')';
12287 $oldstringtoclean = $s;
12288 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12289 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12290 $s = preg_replace(
'/' . $forbiddenphpmethodsregex .
'/i',
'__forbiddenstring__', $s);
12292 }
while ($oldstringtoclean != $s);
12294 if (strpos($s,
'__forbiddenstring__') !==
false) {
12295 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12296 return 'Bad string syntax to evaluate: ' . $s;
12300 if (!empty($dolibarr_main_restrict_eval_methods)) {
12303 $pattern =
'/([\s\w\'\]\"]+)\(/';
12305 $matches = array();
12306 preg_match_all($pattern, $s, $matches);
12308 if (count($matches)) {
12309 foreach ($matches[1] as $m) {
12315 if (!preg_match(
'/new ([A-Z][\w]+)/i', $m, $reg)) {
12316 if (!in_array($m, $dolibarr_main_restrict_eval_methods_array)) {
12317 if ($m !=
"'" && $m !=
'"') {
12318 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12319 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;
12323 if (!class_exists($reg[1])) {
12324 dol_syslog(
'Bad string syntax to evaluate: Class "'.$reg[1].
'" does not exist. ' . $s, LOG_WARNING);
12325 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" does not exist. ' . $s;
12327 $parents = class_parents($reg[1]);
12328 if (!in_array(
'CommonObject', $parents)) {
12329 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);
12330 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" is not allowed because only classes extended CommonObject can be used in dynamic evaluation. ' . $s;
12336 $forbiddenphpregex =
'global\s*\$';
12337 $forbiddenphpregex .=
'|';
12338 $forbiddenphpregex .=
'}\s*\[';
12339 $forbiddenphpregex .=
'|';
12340 $forbiddenphpregex .=
'\)\s*\(';
12344 $oldstringtoclean = $s;
12345 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12346 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12349 }
while ($oldstringtoclean != $s);
12351 if (strpos($s,
'__forbiddenstring__') !==
false) {
12352 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12353 return 'Bad string syntax to evaluate: ' . $s;
12359 $isObBufferActive =
true;
12360 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
12361 $tmpo = ob_get_clean();
12362 $isObBufferActive =
false;
12364 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
12367 }
catch (Error $e) {
12368 if ($isObBufferActive) {
12370 $tmpo = ob_get_clean();
12371 $isObBufferActive =
false;
12373 $error =
'dol_eval try/catch error : ';
12374 $error .= $e->getMessage();
12376 return 'Exception during evaluation: ' . $s;
12389 return (trim($element) !=
'');
12402 if (empty($codelang)) {
12406 if ($codelang ==
'auto') {
12407 return '<span class="fa fa-language"></span>';
12410 $langtocountryflag = array(
12412 'ca_ES' =>
'catalonia',
12416 'sw_SW' =>
'unknown',
12426 if (isset($langtocountryflag[$codelang])) {
12427 $flagImage = $langtocountryflag[$codelang];
12429 $tmparray = explode(
'_', $codelang);
12430 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
12435 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
12436 $morecss = $reg[1];
12441 return '<span class="flag-sprite ' . strtolower($flagImage) . ($morecss ?
' ' . $morecss :
'') .
'"' . ($moreatt ?
' ' . $moreatt :
'') . (!$notitlealt ?
' title="' . $codelang .
'"' :
'') .
'></span>';
12455 if (empty($countrycode)) {
12459 if (strtoupper($countrycode) ==
'MQ') {
12462 if (strtoupper($countrycode) ==
'SE') {
12465 if (strtoupper($countrycode) ==
'CH') {
12466 if (
$mysoc->country_code ==
'FR') {
12469 if (
$mysoc->country_code ==
'DE') {
12472 if (
$mysoc->country_code ==
'IT') {
12654 $buildprimarykeytotest = strtolower($countrycode) .
'-' . strtoupper($countrycode);
12655 if (in_array($buildprimarykeytotest, $locales)) {
12656 return strtolower($countrycode) .
'_' . strtoupper($countrycode);
12659 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
12660 foreach ($locales as $locale) {
12661 $locale_language = locale_get_primary_language($locale);
12662 $locale_region = locale_get_region($locale);
12663 if (strtoupper($countrycode) == $locale_region) {
12665 return strtolower($locale_language) .
'_' . strtoupper($locale_region);
12669 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
12707 global $hookmanager, $db;
12709 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
12710 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
12711 $values = explode(
':', $value);
12714 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
12715 if (count($values) !== 6) {
12716 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);
12723 if ($values[0] != $type) {
12731 $posstart = strpos($str,
'(');
12732 if ($posstart > 0) {
12733 $posend = strpos($str,
')');
12734 if ($posstart > 0) {
12735 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
12736 if (is_numeric($res1)) {
12737 $postab = (int) $res1;
12738 $values[1] =
'+' . substr($str, $posend + 1);
12743 global $objectoffield;
12751 if ($filterorigmodule) {
12752 if (strpos($values[3],
'@')) {
12753 if ($filterorigmodule !=
'external') {
12757 if ($filterorigmodule !=
'core') {
12762 $langs->load($values[3]);
12765 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
12767 $substitutionarray = array();
12772 $labeltemp = explode(
',', $values[2]);
12773 $label = $langs->trans($labeltemp[0]);
12775 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
12777 $classtoload = $labeltemp[1];
12778 if (class_exists($classtoload)) {
12779 $obj =
new $classtoload($db);
12780 $function = $labeltemp[3];
12781 if ($obj && $function && method_exists($obj, $function)) {
12783 $nbrec = $obj->$function(
$object->id, $obj);
12784 if (!empty($nbrec)) {
12785 $label .=
'<span class="badge marginleftonlyshort">' . $nbrec .
'</span>';
12791 $url = preg_replace(
'/__ID__/i', ((is_object(
$object) && !empty(
$object->id)) ?
$object->id :
''), $values[5]);
12792 $link = parse_url($url);
12794 if (isset($link[
'query'])) {
12795 parse_str($link[
'query'], $query);
12798 $newtab[1] = $label;
12799 $newtab[2] = str_replace(
'+',
'', $values[1]);
12803 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
12804 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
12805 if ($values[0] != $type) {
12808 $tabname = str_replace(
'-',
'', $values[1]);
12809 foreach ($head as $key => $val) {
12810 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
12812 if ($head[$key][2] == $tabname && $condition) {
12813 unset($head[$key]);
12822 if (!empty($hookmanager)) {
12823 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
12825 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
12826 if ($reshook > 0) {
12827 $head = $hookmanager->resArray;
12829 $head = array_merge($head, $hookmanager->resArray);
12848 global $conf, $hookmanager, $user, $langs;
12850 global $micro_start_time;
12852 if ($zone ==
'private') {
12853 print
"\n" .
'<!-- Common footer for private page -->' .
"\n";
12855 print
"\n" .
'<!-- Common footer for public page -->' .
"\n";
12859 print
"\n<!-- A div to store page_y POST parameter -->\n";
12860 print
'<div id="page_y" style="display: none;">' . (
GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'') .
'</div>' .
"\n";
12862 $parameters = array(
'zone' => $zone);
12865 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters, $tmpobject, $action);
12866 if (empty($reshook)) {
12872 if (!empty($conf->use_javascript_ajax)) {
12873 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
12874 print
'<script>' .
"\n";
12875 print
'jQuery(document).ready(function() {' .
"\n";
12877 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
12879 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */' .
"\n";
12880 print
'jQuery("li.menuhider").click(function(event) {';
12881 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }' .
"\n";
12882 print
' console.log("We click on .menuhider");' .
"\n";
12883 print
' $("body").toggleClass("sidebar-collapse")' .
"\n";
12884 print
'});' .
"\n";
12888 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"])))) {
12889 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */' .
"\n";
12890 $relativepathstring = $_SERVER[
"PHP_SELF"];
12892 if (constant(
'DOL_URL_ROOT')) {
12893 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
12895 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
12896 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
12899 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
12900 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
12902 if ($defkey !=
'_noquery_') {
12903 $tmpqueryarraytohave = explode(
'&', $defkey);
12905 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
12906 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
12908 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
12912 if (!$foundintru) {
12921 print
'console.log("set the focus by executing jQuery(...).focus();")' .
"\n";
12922 foreach ($defval as $paramkey => $paramval) {
12924 print
'jQuery("input[name=\'' . $paramkey .
'\']
").focus();' . "\n
";
12925 print 'jQuery("textarea[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // TODO KO with ckeditor
12926 print 'jQuery("select[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // Not really useful, but we keep it in case of.
12931 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
12932 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
12934 if ($defkey != '_noquery_') {
12935 $tmpqueryarraytohave = explode('&', $defkey);
12937 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
12938 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
12939 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
12940 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
12944 if (!$foundintru) {
12947 //var_dump($defkey.'-'.$qualified);
12953 print 'console.log("set the js code to manage fields that are
set as mandatory
");' . "\n
";
12955 foreach ($defval as $paramkey => $paramval) {
12956 // Solution 1: Add handler on submit to check if mandatory fields are empty
12957 print 'var form = $(\'[name="'.dol_escape_js($paramkey).'"]\').closest("form
");'."\n
";
12958 print "form.on(
'submit',
function(event) {
12959 var submitter = \$(
this).find(
':submit:focus').get(0);
12960 var buttonName = submitter ? \$(submitter).attr(
'name') :
'save';
12962 if (buttonName ==
'cancel') {
12963 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
12967 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');
12969 var tmpvalue = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').val();
12970 let tmptypefield = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').prop(
'nodeName').toLowerCase();
12972 if (tmptypefield ==
'textarea') {
12974 var tmpeditor = (typeof CKEDITOR !==
'undefined') ? CKEDITOR.instances[
'".dol_escape_js($paramkey)."'] : null;
12976 tmpvalue = tmpeditor.getData();
12977 console.log(
'For textarea tmpvalue is '+tmpvalue);
12981 let tmpvalueisempty =
false;
12982 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1 || tmpvalue ===
'-1') {
12983 tmpvalueisempty =
true;
12985 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
12986 tmpvalueisempty =
true;
12988 if (tmpvalueisempty && buttonName !==
'cancel') {
12989 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
12990 event.preventDefault();
12991 event.stopPropagation();
12993 alert(
'".dol_escape_js($langs->transnoentitiesnoconv("ErrorFieldRequired", $paramkey).' (
'.$langs->transnoentitiesnoconv("CustomMandatoryFieldRule").')
')."');
12997 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
13002 // Solution 2: Add property 'required' on input
13003 // so browser will check value and try to focus on it when submitting the form.
13004 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
13005 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13006 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13007 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
13008 //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
";
13009 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
13015 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");' .
"\n";
13019 print
'jQuery("input[name=\'cancel\']").click(function() {
13020 console.log("We click on cancel button so removed all required attribute");
13021 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
13028 print
'});' .
"\n";
13031 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
13033 print
"/* JS CODE TO ENABLE to add memory info */\n";
13034 print
'window.console && console.log("';
13039 if (!empty($micro_start_time)) {
13040 $micro_end_time = microtime(
true);
13041 print
' - Build time: ' . ceil(1000 * ($micro_end_time - $micro_start_time)) .
' ms';
13044 if (function_exists(
"memory_get_usage")) {
13045 print
' - Mem: ' . memory_get_usage();
13047 if (function_exists(
"memory_get_peak_usage")) {
13048 print
' - Real mem peak: ' . memory_get_peak_usage(
true);
13050 if (function_exists(
"zend_loader_file_encoded")) {
13051 print
' - Zend encoded file: ' . (zend_loader_file_encoded() ?
'yes' :
'no');
13053 print
'");' .
"\n";
13056 print
"\n" .
'</script>' .
"\n";
13062 foreach ($tmptagarray as $tmptag) {
13064 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
13066 <!-- Global site tag (gtag.js) - Google Analytics -->
13067 <script nonce="' .
getNonce() .
'" async src="https://www.googletagmanager.com/gtag/js?id=' . trim($tmptag) .
'"></script>
13069 window.dataLayer = window.dataLayer || [];
13070 function gtag(){dataLayer.push(arguments);}
13071 gtag(\'js\', new Date());
13073 gtag(\'config\', \'' . trim($tmptag) .
'\');
13080 // Add Xdebug coverage of code
13081 if (defined('XDEBUGCOVERAGE
')) {
13082 print_r(xdebug_get_code_coverage());
13085 // Output string from hooks
13086 if (!empty($hookmanager->resPrint)) {
13087 print $hookmanager->resPrint;
13090 // Add DebugBar data
13091 if ($user->hasRight('debugbar
', 'read
')) {
13093 if ($debugbar instanceof DebugBar\DebugBar) {
13094 if (isset($debugbar['time
'])) {
13095 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
13096 $debugbar['time
']->stopMeasure('pageaftermaster
');
13098 print '<!-- Output debugbar data -->
' . "\n";
13099 $renderer = $debugbar->getJavascriptRenderer();
13100 print $renderer->render();
13102 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
13104 print "<!-- Start of log output\n";
13105 //print '<div
class=
"hidden">
'."\n";
13106 foreach ($conf->logbuffer as $logline) {
13107 print $logline . "<br>\n";
13109 //print '</div>
'."\n";
13110 print "End of log output -->\n";
13124function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
13126 if (is_null($string)) {
13130 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
13131 // This is a regex string
13132 $newdelimiter = $delimiter;
13134 // This is a simple string
13135 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
13136 $newdelimiter = preg_quote($delimiter, '/
');
13139 if ($a = preg_split('/
' . $newdelimiter . '/
', $string)) {
13141 foreach ($a as $s) { // each part
13143 if ($pos = strpos($s, $kv)) { // key/value delimiter
13144 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
13145 } else { // key delimiter not found
13163function dolExplodeKeepIfQuotes($input)
13165 // Use regexp to capture words and section in quotes
13166 $matches = array();
13167 preg_match_all('/
"([^"]*)
"|\'([^\']*)\'|(\S+)/', $input, $matches);
13169 // Merge result and delete empty values
13171 $result = array_map(
13178 static function ($a, $b, $c) {
13194 return array_values(array_filter(
13202 static function ($val) {
13203 return $val !== '';
13215function dol_set_focus($selector)
13217 print "\n
" . '<!-- Set focus onto a specific field -->' . "\n
";
13218 print '<script nonce="' . getNonce() . '">jQuery(document).ready(function() { console.log("Force focus by
dol_set_focus"); jQuery("' . dol_escape_js($selector) . '").focus(); });</script>' . "\n
";
13229function dol_getmypid()
13231 if (!function_exists('getmypid')) {
13232 return mt_rand(99900000, 99965535);
13234 return getmypid(); // May be a number on 64 bits (depending on OS)
13260function natural_search($fields, $value, $mode = 0, $nofirstand = 0, $sqltoadd = '')
13262 global $db, $langs;
13264 $value = trim($value);
13267 $value = preg_replace('/\*/', '%', $value); // Replace * with %
13270 $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
13273 $value = preg_replace('/\s*\|\s*/', '|', $value);
13275 // Split criteria on ' ' but not if we are inside quotes.
13276 // For mode 3, the split is done later on the , only and not on the ' '.
13277 if ($mode != -3 && $mode != 3) {
13278 $crits = dolExplodeKeepIfQuotes($value);
13280 $crits = array($value);
13284 if (!is_array($fields)) {
13285 $fields = array($fields);
13287 $i1 = 0; // count the nb of "and
" criteria added (all fields / criteria)
13288 foreach ($crits as $crit) { // Loop on each AND criteria
13289 $crit = trim($crit);
13290 $i2 = 0; // count the nb of valid criteria added for this this first criteria
13293 foreach ($fields as $field) {
13295 $tmpcrits = explode('|', $crit);
13296 $i3 = 0; // count the nb of valid criteria added for this current field
13297 foreach ($tmpcrits as $tmpcrit) {
13298 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13301 $tmpcrit = trim($tmpcrit);
13303 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13306 $newcrit = preg_replace('/([!<>=]+)/', '', $tmpcrit);
13309 preg_match('/([!<>=]+)/', $tmpcrit, $reg);
13310 if (!empty($reg[1])) {
13311 $operator = $reg[1];
13313 if ($newcrit != '') {
13314 $numnewcrit = price2num($newcrit);
13315 if (is_numeric($numnewcrit)) {
13316 $newres .= $db->sanitize($field) . ' ' . $operator . ' ' . ((float) $numnewcrit); // should be a numeric
13318 $newres .= '1 = 2'; // force false, we received a corrupted data
13320 $i3++; // a criteria was added to string
13323 $i2++; // a criteria for 1 more field was added to string
13324 } elseif ($mode == 2 || $mode == -2) {
13325 $crit = preg_replace('/[^\-0-9,]/', '', $crit); // ID are always integer
13326 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -2 ? 'NOT ' : '');
13327 $newres .= $crit ? "IN (
" . $db->sanitize($db->escape($crit)) . ")
" : "IN (0)
";
13329 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13331 $i2++; // a criteria for 1 more field was added to string
13332 } elseif ($mode == 3 || $mode == -3) {
13333 $tmparray = explode(',', $crit);
13334 if (count($tmparray)) {
13336 foreach ($tmparray as $val) {
13338 if ($val) { // TODO Test with if ($val !== '') {
13339 $listofcodes .= ($listofcodes ? ',' : '');
13340 $listofcodes .= "'" . $db->escape($val) . "'";
13343 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -3 ? 'NOT ' : '') . "IN (
" . $db->sanitize($listofcodes, 1, 0, 1) . ")
";
13344 $i2++; // a criteria for 1 more field was added to string
13347 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13349 } elseif ($mode == 4) {
13350 $tmparray = explode(',', $crit);
13351 if (count($tmparray)) {
13353 foreach ($tmparray as $val) {
13356 $newres .= ($i2 > 0 ? " OR (
" : "(
") . $db->sanitize($field) . " LIKE
'" . $db->escape($val) . ",%'";
13357 $newres .= ' OR ' . $db->sanitize($field) . " =
'" . $db->escape($val) . "'";
13358 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . "'";
13359 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . ",%'";
13361 $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)
13365 } else { // $mode=0
13366 $tmpcrits = explode('|', $crit);
13367 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
13368 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
13369 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13372 $tmpcrit = trim($tmpcrit);
13374 if ($tmpcrit == '^$' || strpos($crit, '!') === 0) { // If we search empty, we must combined different OR fields with AND
13375 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND ' : '');
13377 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13380 $isSellist = false;
13381 $table = $label = $key = null;
13383 if (strpos($field, 'ef.') === 0) {
13384 $extrafieldName = substr($field, 3);
13385 $extrafields = new ExtraFields($db);
13386 $extrafields->fetch_name_optionals_label('product');
13388 if (isset($extrafields->attributes['product']['type'][$extrafieldName]) && $extrafields->attributes['product']['type'][$extrafieldName] === 'sellist') {
13390 $paramArray = $extrafields->attributes['product']['param'][$extrafieldName]['options'] ?? [];
13391 $param = array_key_first($paramArray);
13392 list($table, $label, $key) = explode(':', $param);
13396 if (preg_match('/\.(id|rowid)$/', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
13397 $newres .= $db->sanitize($field) . " =
" . (is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0');
13399 $tmpcrit2 = $tmpcrit;
13405 $newres .= $field . " IN (SELECT t.
" . $key . " FROM
" . $db->prefix() . $table . " AS t WHERE t.
" . $label . " LIKE
'%" . $db->escape($tmpcrit2) . "%')
";
13407 if (preg_match('/^!/', $tmpcrit)) {
13408 $tmps .= $db->sanitize($field) . " NOT LIKE
"; // ! as exclude character
13409 $tmpcrit2 = preg_replace('/^!/', '', $tmpcrit2);
13411 $tmps .= $db->sanitize($field) . " LIKE
";
13415 if (preg_match('/^[\^\$]/
', $tmpcrit)) {
13417 $tmpcrit2 = preg_replace('/^[\^\$]/
', '', $tmpcrit2);
13419 if (preg_match('/[\^\$]$/
', $tmpcrit)) {
13421 $tmpcrit2 = preg_replace('/[\^\$]$/
', '', $tmpcrit2);
13424 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
13425 $tmps = "(" . $tmps;
13428 $newres .= $tmpbefore;
13429 $newres .= $db->escape($tmpcrit2);
13430 $newres .= $tmpafter;
13432 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
13433 $newres .= " OR
" . $field . " IS NULL)
";
13441 $i2++; // a criteria for 1 more field was added to string
13446 $newres .= ($newres ? '' : ' OR ').str_replace('__KEYTOSEARCH__', $crit, $sqltoadd);
13450 $res = $res . ($res ? ' AND ' : '') . ($i2 > 1 ? '(' : '') . $newres . ($i2 > 1 ? ')' : '');
13454 $res = ($nofirstand ? "" : " AND
") . "(
" . $res . ")
";
13465function showDirectDownloadLink($object)
13470 $url = $object->getLastMainDocLink($object->element);
13472 $out .= img_picto($langs->trans("PublicDownloadLinkDesc
"), 'globe') . ' <span class="opacitymedium
">' . $langs->trans("DirectDownloadLink
") . '</span><br>';
13474 $out .= '<div class="urllink
"><input type="text
" id="directdownloadlink
" class="quatrevingtpercent
" value="' . $url . '"></div>';
13475 $out .= ajax_autoselect("directdownloadlink
", '');
13477 $out .= '<div class="urllink
">' . $langs->trans("FileNotShared
") . '</div>';
13491function getImageFileNameForSize($file, $extName, $extImgTarget = '')
13493 $dirName = dirname($file);
13494 if ($dirName == '.') {
13498 if (!in_array($extName, array('', '_small', '_mini'))) {
13499 return 'Bad parameter extName';
13502 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i', '', $file); // We remove image extension, whatever is its case
13503 $fileName = basename($fileName);
13505 if (empty($extImgTarget)) {
13506 $extImgTarget = (preg_match('/\.jpg$/i', $file) ? '.jpg' : '');
13508 if (empty($extImgTarget)) {
13509 $extImgTarget = (preg_match('/\.jpeg$/i', $file) ? '.jpeg' : '');
13511 if (empty($extImgTarget)) {
13512 $extImgTarget = (preg_match('/\.gif$/i', $file) ? '.gif' : '');
13514 if (empty($extImgTarget)) {
13515 $extImgTarget = (preg_match('/\.png$/i', $file) ? '.png' : '');
13517 if (empty($extImgTarget)) {
13518 $extImgTarget = (preg_match('/\.bmp$/i', $file) ? '.bmp' : '');
13520 if (empty($extImgTarget)) {
13521 $extImgTarget = (preg_match('/\.webp$/i', $file) ? '.webp' : '');
13524 if (!$extImgTarget) {
13530 $subdir = 'thumbs/';
13533 return ($dirName ? $dirName . '/' : '') . $subdir . $fileName . $extName . $extImgTarget; // New filename for thumb
13546function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '')
13548 global $conf, $langs;
13550 if (empty($conf->use_javascript_ajax)) {
13554 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
13556 if ($alldata == 1) {
13557 if ($isAllowedForPreview) {
13558 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));
13564 // old behavior, return a string
13565 if ($isAllowedForPreview) {
13566 $tmpurl = DOL_URL_ROOT . '/document.php?modulepart=' . urlencode($modulepart) . '&attachment=0&file=' . urlencode($relativepath) . ($param ? '&' . $param : '');
13567 $title = $langs->transnoentities("Preview
");
13568 //$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().
13569 //$tmpurl = 'file='.urlencode("'-alert(document.domain)-'_small.jpg
"); // An example of tmpurl that should be blocked by the dol_escape_uri()
13571 // 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,
13572 // 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.
13573 // Using the dol_escape_uri guarantee that we encode for URI so decode retrieve original expected value.
13574 return 'javascript:' . dol_escape_uri('document_preview(\'' . dol_escape_js($tmpurl) . '\', \'' . dol_escape_js(dol_mimetype($relativepath)) . '\', \'' . dol_escape_js($title) . '\')');
13586function getLabelSpecialCode($idcode)
13590 $arrayspecialines = array(1 => 'Transport', 2 => 'EcoTax', 3 => 'Option');
13591 if ($idcode > 10) {
13592 return 'Module ID ' . $idcode;
13594 if (!empty($arrayspecialines[$idcode])) {
13595 return $langs->trans($arrayspecialines[$idcode]);
13608function ajax_autoselect($htmlname, $addlink = '', $textonlink = 'Link')
13611 $out = '<script nonce="
' . getNonce() . '">
13612 jQuery(document).ready(function () {
13613 jQuery("' . ((strpos($htmlname, '.
') === 0 ? '' : '#
') . $htmlname) . '").click(function() { jQuery(this).select(); } );
13617 if ($textonlink === 'image') {
13618 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . img_picto('', 'globe') . '</a>';
13620 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . $langs->trans("Link") . '</a>';
13633function dolIsAllowedForPreview($file)
13635 // Check .noexe extension in filename
13636 if (preg_match('/\.noexe$/i', $file)) {
13640 // Check mime types
13641 $mime_preview = array('bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css', 'webp', 'webm', 'mp4');
13642 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES')) {
13643 $mime_preview[] = 'svg+xml';
13645 if (getDolGlobalString('MAIN_ALLOW_XML_FILES_AS_PREVIEW')) {
13646 $mime_preview[] = 'xml';
13649 //$mime_preview[]='vnd.oasis.opendocument.presentation';
13650 //$mime_preview[]='archive';
13651 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
13652 if ($num_mime !== false) {
13656 // By default, not allowed for preview
13670function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0)
13673 $imgmime = 'other.png';
13674 $famime = 'file-o';
13677 $tmpfile = preg_replace('/\.noexe$/', '', $file);
13679 // Plain text files
13680 if (preg_match('/\.txt$/i', $tmpfile)) {
13681 $mime = 'text/plain';
13682 $imgmime = 'text.png';
13683 $famime = 'file-alt';
13684 } elseif (preg_match('/\.rtx$/i', $tmpfile)) {
13685 $mime = 'text/richtext';
13686 $imgmime = 'text.png';
13687 $famime = 'file-alt';
13688 } elseif (preg_match('/\.csv$/i', $tmpfile)) {
13689 $mime = 'text/csv';
13690 $imgmime = 'text.png';
13691 $famime = 'file-csv';
13692 } elseif (preg_match('/\.tsv$/i', $tmpfile)) {
13693 $mime = 'text/tab-separated-values';
13694 $imgmime = 'text.png';
13695 $famime = 'file-alt';
13696 } elseif (preg_match('/\.(cf|conf|log)$/i', $tmpfile)) {
13697 $mime = 'text/plain';
13698 $imgmime = 'text.png';
13699 $famime = 'file-alt';
13700 } elseif (preg_match('/\.ini$/i', $tmpfile)) {
13701 $mime = 'text/plain';
13702 $imgmime = 'text.png';
13704 $famime = 'file-alt';
13705 } elseif (preg_match('/\.md$/i', $tmpfile)) {
13706 $mime = 'text/plain';
13707 $imgmime = 'text.png';
13709 $famime = 'file-alt';
13710 } elseif (preg_match('/\.css$/i', $tmpfile)) {
13711 $mime = 'text/css';
13712 $imgmime = 'css.png';
13714 $famime = 'file-alt';
13715 } elseif (preg_match('/\.lang$/i', $tmpfile)) {
13716 $mime = 'text/plain';
13717 $imgmime = 'text.png';
13719 $famime = 'file-alt';
13720 } elseif (preg_match('/\.(crt|cer|key|pub)$/i', $tmpfile)) { // Certificate files
13721 $mime = 'text/plain';
13722 $imgmime = 'text.png';
13723 $famime = 'file-alt';
13724 } elseif (preg_match('/\.(html|htm|shtml)$/i', $tmpfile)) { // XML based (HTML/XML/XAML)
13725 $mime = 'text/html';
13726 $imgmime = 'html.png';
13728 $famime = 'file-alt';
13729 } elseif (preg_match('/\.(xml|xhtml)$/i', $tmpfile)) {
13730 $mime = 'text/xml';
13731 $imgmime = 'other.png';
13733 $famime = 'file-alt';
13734 } elseif (preg_match('/\.xaml$/i', $tmpfile)) {
13735 $mime = 'text/xml';
13736 $imgmime = 'other.png';
13738 $famime = 'file-alt';
13739 } elseif (preg_match('/\.bas$/i', $tmpfile)) { // Languages
13740 $mime = 'text/plain';
13741 $imgmime = 'text.png';
13743 $famime = 'file-code';
13744 } elseif (preg_match('/\.(c)$/i', $tmpfile)) {
13745 $mime = 'text/plain';
13746 $imgmime = 'text.png';
13748 $famime = 'file-code';
13749 } elseif (preg_match('/\.(cpp)$/i', $tmpfile)) {
13750 $mime = 'text/plain';
13751 $imgmime = 'text.png';
13753 $famime = 'file-code';
13754 } elseif (preg_match('/\.cs$/i', $tmpfile)) {
13755 $mime = 'text/plain';
13756 $imgmime = 'text.png';
13758 $famime = 'file-code';
13759 } elseif (preg_match('/\.(h)$/i', $tmpfile)) {
13760 $mime = 'text/plain';
13761 $imgmime = 'text.png';
13763 $famime = 'file-code';
13764 } elseif (preg_match('/\.(java|jsp)$/i', $tmpfile)) {
13765 $mime = 'text/plain';
13766 $imgmime = 'text.png';
13768 $famime = 'file-code';
13769 } elseif (preg_match('/\.php([0-9]{1})?$/i', $tmpfile)) {
13770 $mime = 'text/plain';
13771 $imgmime = 'php.png';
13773 $famime = 'file-code';
13774 } elseif (preg_match('/\.phtml$/i', $tmpfile)) {
13775 $mime = 'text/plain';
13776 $imgmime = 'php.png';
13778 $famime = 'file-code';
13779 } elseif (preg_match('/\.(pl|pm)$/i', $tmpfile)) {
13780 $mime = 'text/plain';
13781 $imgmime = 'pl.png';
13783 $famime = 'file-code';
13784 } elseif (preg_match('/\.sql$/i', $tmpfile)) {
13785 $mime = 'text/plain';
13786 $imgmime = 'text.png';
13788 $famime = 'file-code';
13789 } elseif (preg_match('/\.js$/i', $tmpfile)) {
13790 $mime = 'text/x-javascript';
13791 $imgmime = 'jscript.png';
13793 $famime = 'file-code';
13794 } elseif (preg_match('/\.odp$/i', $tmpfile)) { // Open office
13795 $mime = 'application/vnd.oasis.opendocument.presentation';
13796 $imgmime = 'ooffice.png';
13797 $famime = 'file-powerpoint';
13798 } elseif (preg_match('/\.ods$/i', $tmpfile)) {
13799 $mime = 'application/vnd.oasis.opendocument.spreadsheet';
13800 $imgmime = 'ooffice.png';
13801 $famime = 'file-excel';
13802 } elseif (preg_match('/\.odt$/i', $tmpfile)) {
13803 $mime = 'application/vnd.oasis.opendocument.text';
13804 $imgmime = 'ooffice.png';
13805 $famime = 'file-word';
13806 } elseif (preg_match('/\.mdb$/i', $tmpfile)) { // MS Office
13807 $mime = 'application/msaccess';
13808 $imgmime = 'mdb.png';
13810 } elseif (preg_match('/\.doc[xm]?$/i', $tmpfile)) {
13811 $mime = 'application/msword';
13812 $imgmime = 'doc.png';
13813 $famime = 'file-word';
13814 } elseif (preg_match('/\.dot[xm]?$/i', $tmpfile)) {
13815 $mime = 'application/msword';
13816 $imgmime = 'doc.png';
13817 $famime = 'file-word';
13818 } elseif (preg_match('/\.xlt(x)?$/i', $tmpfile)) {
13819 $mime = 'application/vnd.ms-excel';
13820 $imgmime = 'xls.png';
13821 $famime = 'file-excel';
13822 } elseif (preg_match('/\.xla(m)?$/i', $tmpfile)) {
13823 $mime = 'application/vnd.ms-excel';
13824 $imgmime = 'xls.png';
13825 $famime = 'file-excel';
13826 } elseif (preg_match('/\.xls$/i', $tmpfile)) {
13827 $mime = 'application/vnd.ms-excel';
13828 $imgmime = 'xls.png';
13829 $famime = 'file-excel';
13830 } elseif (preg_match('/\.xls[bmx]$/i', $tmpfile)) {
13831 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
13832 $imgmime = 'xls.png';
13833 $famime = 'file-excel';
13834 } elseif (preg_match('/\.pps[mx]?$/i', $tmpfile)) {
13835 $mime = 'application/vnd.ms-powerpoint';
13836 $imgmime = 'ppt.png';
13837 $famime = 'file-powerpoint';
13838 } elseif (preg_match('/\.ppt[mx]?$/i', $tmpfile)) {
13839 $mime = 'application/x-mspowerpoint';
13840 $imgmime = 'ppt.png';
13841 $famime = 'file-powerpoint';
13842 } elseif (preg_match('/\.pdf$/i', $tmpfile)) { // Other
13843 $mime = 'application/pdf';
13844 $imgmime = 'pdf.png';
13845 $famime = 'file-pdf';
13846 } elseif (preg_match('/\.bat$/i', $tmpfile)) { // Scripts
13847 $mime = 'text/x-bat';
13848 $imgmime = 'script.png';
13850 $famime = 'file-code';
13851 } elseif (preg_match('/\.sh$/i', $tmpfile)) {
13852 $mime = 'text/x-sh';
13853 $imgmime = 'script.png';
13855 $famime = 'file-code';
13856 } elseif (preg_match('/\.ksh$/i', $tmpfile)) {
13857 $mime = 'text/x-ksh';
13858 $imgmime = 'script.png';
13860 $famime = 'file-code';
13861 } elseif (preg_match('/\.bash$/i', $tmpfile)) {
13862 $mime = 'text/x-bash';
13863 $imgmime = 'script.png';
13865 $famime = 'file-code';
13866 } elseif (preg_match('/\.ico$/i', $tmpfile)) { // Images
13867 $mime = 'image/x-icon';
13868 $imgmime = 'image.png';
13869 $famime = 'file-image';
13870 } elseif (preg_match('/\.(jpg|jpeg)$/i', $tmpfile)) {
13871 $mime = 'image/jpeg';
13872 $imgmime = 'image.png';
13873 $famime = 'file-image';
13874 } elseif (preg_match('/\.png$/i', $tmpfile)) {
13875 $mime = 'image/png';
13876 $imgmime = 'image.png';
13877 $famime = 'file-image';
13878 } elseif (preg_match('/\.gif$/i', $tmpfile)) {
13879 $mime = 'image/gif';
13880 $imgmime = 'image.png';
13881 $famime = 'file-image';
13882 } elseif (preg_match('/\.bmp$/i', $tmpfile)) {
13883 $mime = 'image/bmp';
13884 $imgmime = 'image.png';
13885 $famime = 'file-image';
13886 } elseif (preg_match('/\.(tif|tiff)$/i', $tmpfile)) {
13887 $mime = 'image/tiff';
13888 $imgmime = 'image.png';
13889 $famime = 'file-image';
13890 } elseif (preg_match('/\.svg$/i', $tmpfile)) {
13891 $mime = 'image/svg+xml';
13892 $imgmime = 'image.png';
13893 $famime = 'file-image';
13894 } elseif (preg_match('/\.webp$/i', $tmpfile)) {
13895 $mime = 'image/webp';
13896 $imgmime = 'image.png';
13897 $famime = 'file-image';
13898 } elseif (preg_match('/\.vcs$/i', $tmpfile)) { // Calendar
13899 $mime = 'text/calendar';
13900 $imgmime = 'other.png';
13901 $famime = 'file-alt';
13902 } elseif (preg_match('/\.ics$/i', $tmpfile)) {
13903 $mime = 'text/calendar';
13904 $imgmime = 'other.png';
13905 $famime = 'file-alt';
13906 } elseif (preg_match('/\.torrent$/i', $tmpfile)) { // Other
13907 $mime = 'application/x-bittorrent';
13908 $imgmime = 'other.png';
13909 $famime = 'file-o';
13910 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) { // Audio
13912 $imgmime = 'audio.png';
13913 $famime = 'file-audio';
13914 } elseif (preg_match('/\.mp4$/i', $tmpfile)) { // Video
13915 $mime = 'video/mp4';
13916 $imgmime = 'video.png';
13917 $famime = 'file-video';
13918 } elseif (preg_match('/\.ogv$/i', $tmpfile)) {
13919 $mime = 'video/ogg';
13920 $imgmime = 'video.png';
13921 $famime = 'file-video';
13922 } elseif (preg_match('/\.webm$/i', $tmpfile)) {
13923 $mime = 'video/webm';
13924 $imgmime = 'video.png';
13925 $famime = 'file-video';
13926 } elseif (preg_match('/\.avi$/i', $tmpfile)) {
13927 $mime = 'video/x-msvideo';
13928 $imgmime = 'video.png';
13929 $famime = 'file-video';
13930 } elseif (preg_match('/\.divx$/i', $tmpfile)) {
13931 $mime = 'video/divx';
13932 $imgmime = 'video.png';
13933 $famime = 'file-video';
13934 } elseif (preg_match('/\.xvid$/i', $tmpfile)) {
13935 $mime = 'video/xvid';
13936 $imgmime = 'video.png';
13937 $famime = 'file-video';
13938 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
13940 $imgmime = 'video.png';
13941 $famime = 'file-video';
13942 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) { // Archive
13943 // application/xxx where zzz is zip, ...
13945 $imgmime = 'archive.png';
13946 $famime = 'file-archive';
13947 } elseif (preg_match('/\.(exe|com)$/i', $tmpfile)) { // Exe
13948 $mime = 'application/octet-stream';
13949 $imgmime = 'other.png';
13950 $famime = 'file-o';
13951 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i', $tmpfile)) { // Lib
13953 $imgmime = 'library.png';
13954 $famime = 'file-o';
13955 } elseif (preg_match('/\.err$/i', $tmpfile)) { // phpcs:ignore
13957 $imgmime = 'error.png';
13958 $famime = 'file-alt';
13961 if ($famime == 'file-o') {
13962 // file-o seems to not work in fontawesome 5
13966 // Return mimetype string
13967 switch ((int) $mode) {
13969 $tmp = explode('/', $mime);
13970 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
13992function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid')
13996 $tablename = preg_replace('/^' . preg_quote(MAIN_DB_PREFIX, '/') . '/', '', $tablename); // Clean name of table for backward compatibility.
13998 $dictvalues = (isset($conf->cache['dictvalues_' . $tablename]) ? $conf->cache['dictvalues_' . $tablename] : null);
14000 if (is_null($dictvalues)) {
14001 $dictvalues = array();
14003 $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
14004 if ($checkentity) {
14005 $sql .= ' AND entity IN (0,' . getEntity($tablename) . ')';
14008 $resql = $db->query($sql);
14010 while ($obj = $db->fetch_object($resql)) {
14011 $dictvalues[$obj->$rowidfield] = $obj; // $obj is stdClass
14014 dol_print_error($db);
14017 $conf->cache['dictvalues_' . $tablename] = $dictvalues;
14020 if (!empty($dictvalues[$id])) {
14022 $tmp = $dictvalues[$id];
14023 return (property_exists($tmp, $field) ? $tmp->$field : '');
14036function colorIsLight($stringcolor)
14038 $stringcolor = str_replace('#', '', $stringcolor);
14040 if (!empty($stringcolor)) {
14042 $tmp = explode(',', $stringcolor);
14043 if (count($tmp) > 1) { // This is a comma RGB ('255','255','255')
14048 $hexr = $stringcolor[0] . $stringcolor[1];
14049 $hexg = $stringcolor[2] . $stringcolor[3];
14050 $hexb = $stringcolor[4] . $stringcolor[5];
14051 $r = hexdec($hexr);
14052 $g = hexdec($hexg);
14053 $b = hexdec($hexb);
14055 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0; // HSL algorithm
14056 if ($bright > 0.6) {
14071function isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
14073 //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms'];
14074 //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal);
14075 if (empty($menuentry['enabled'])) {
14076 return 0; // Entry disabled by condition
14078 if ($type_user && array_key_exists('module', $menuentry) && $menuentry['module']) {
14079 $tmploops = explode('|', $menuentry['module']);
14081 foreach ($tmploops as $tmploop) {
14082 if (in_array($tmploop, $listofmodulesforexternal)) {
14088 return 0; // Entry is for menus all excluded to external users
14091 if (!$menuentry['perms'] && $type_user) {
14092 return 0; // No permissions and user is external
14094 if (!$menuentry['perms'] && getDolGlobalString('MAIN_MENU_HIDE_UNAUTHORIZED')) {
14095 return 0; // No permissions and option to hide when not allowed, even for internal user, is on
14097 if (!$menuentry['perms']) {
14098 return 2; // No permissions and user is external
14110function roundUpToNextMultiple($n, $x = 5)
14112 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
14113 return (int) $result;
14127function dolGetBadge($label, $html = '', $type = 'primary', $mode = '', $url = '', $params = array())
14129 $csstouse = 'badge';
14130 $csstouse .= (!empty($mode) ? ' badge-' . $mode : '');
14131 $csstouse .= (!empty($type) ? ' badge-' . $type : '');
14132 $csstouse .= (empty($params['css']) ? '' : ' ' . $params['css']);
14135 'class' => $csstouse
14138 if (empty($html)) {
14142 if (!empty($url)) {
14143 $attr['href'] = $url;
14146 if ($mode === 'dot') {
14147 $attr['class'] .= ' classfortooltip';
14148 $attr['title'] = $html;
14149 $attr['aria-label'] = $label;
14154 if (!empty($params['attr']) && is_array($params['attr'])) {
14155 foreach ($params['attr'] as $key => $value) {
14156 if ($key == 'class') {
14157 $attr['class'] .= ' ' . $value;
14158 } elseif ($key == 'classOverride') {
14159 $attr['class'] = $value;
14161 $attr[$key] = $value;
14168 // escape all attribute
14169 $attr = array_map('dolPrintHTMLForAttribute', $attr);
14171 $TCompiledAttr = array();
14172 foreach ($attr as $key => $value) {
14173 $TCompiledAttr[] = $key . '="
' . $value . '"';
14176 $compiledAttributes = !empty($TCompiledAttr) ? implode(' ', $TCompiledAttr) : '';
14178 $tag = !empty($url) ? 'a' : 'span';
14180 return '<' . $tag . ' ' . $compiledAttributes . '>' . $html . '</' . $tag . '>';
14196function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $statusType = 'status0', $displayMode = 0, $url = '', $params = array())
14201 $dolGetBadgeParams = array();
14203 if (!empty($params['badgeParams'])) {
14204 $dolGetBadgeParams = $params['badgeParams'];
14207 // TODO : add a hook
14208 if ($displayMode == 0) {
14209 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
14210 } elseif ($displayMode == 1) {
14211 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14212 } elseif (getDolGlobalString('MAIN_STATUS_USES_IMAGES')) {
14213 // Use status with images (for backward compatibility)
14215 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ? '<span class="hideonsmartphone
">' : '') . (!empty($html) ? $html : $statusLabel) . (in_array($displayMode, array(1, 2, 5)) ? '</span>' : '');
14216 $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>' : '');
14218 // For small screen, we always use the short label instead of long label.
14219 if (!empty($conf->dol_optimize_smallscreen)) {
14220 if ($displayMode == 0) {
14222 } elseif ($displayMode == 4) {
14224 } elseif ($displayMode == 6) {
14229 // For backward compatibility. Image's filename are still in French, so we use this array to convert
14230 $statusImg = array(
14231 'status0' => 'statut0',
14232 'status1' => 'statut1',
14233 'status2' => 'statut2',
14234 'status3' => 'statut3',
14235 'status4' => 'statut4',
14236 'status5' => 'statut5',
14237 'status6' => 'statut6',
14238 'status7' => 'statut7',
14239 'status8' => 'statut8',
14240 'status9' => 'statut9'
14243 if (!empty($statusImg[$statusType])) {
14244 $htmlImg = img_picto($statusLabel, $statusImg[$statusType]);
14246 $htmlImg = img_picto($statusLabel, $statusType);
14249 if ($displayMode === 2) {
14250 $return = $htmlImg . ' ' . $htmlLabelShort;
14251 } elseif ($displayMode === 3) {
14252 $return = $htmlImg;
14253 } elseif ($displayMode === 4) {
14254 $return = $htmlImg . ' ' . $htmlLabel;
14255 } elseif ($displayMode === 5) {
14256 $return = $htmlLabelShort . ' ' . $htmlImg;
14257 } else { // $displayMode >= 6
14258 $return = $htmlLabel . ' ' . $htmlImg;
14260 } elseif (!getDolGlobalString('MAIN_STATUS_USES_IMAGES') && !empty($displayMode)) {
14262 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14264 $dolGetBadgeParams['attr']['class'] = 'badge-status';
14265 if (empty($dolGetBadgeParams['attr']['title'])) {
14266 $dolGetBadgeParams['attr']['title'] = empty($params['tooltip']) ? $statusLabel : ($params['tooltip'] != 'no' ? $params['tooltip'] : '');
14267 } else { // If a title was forced from $params['badgeParams']['attr']['title'], we set the class to get it as a tooltip.
14268 $dolGetBadgeParams['attr']['class'] .= ' classfortooltip';
14269 // And if we use tooltip, we can output title in HTML @phan-suppress-next-line PhanTypeInvalidDimOffset
14270 $dolGetBadgeParams['attr']['title'] = dol_htmlentitiesbr((string) $dolGetBadgeParams['attr']['title'], 1);
14273 if ($displayMode == 3) {
14274 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), '', $statusType, 'dot', $url, $dolGetBadgeParams);
14275 } elseif ($displayMode === 5) {
14276 $return = dolGetBadge($statusLabelShort, $html, $statusType, '', $url, $dolGetBadgeParams);
14278 $return = dolGetBadge(((empty($conf->dol_optimize_smallscreen) && $displayMode != 2) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType, '', $url, $dolGetBadgeParams);
14321function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = '', $id = '', $userRight = 1, $params = array())
14323 global $hookmanager, $action, $object, $langs;
14325 // If $url is an array, we must build a dropdown button or recursively iterate over each value
14326 if (is_array($url)) {
14327 // Loop on $url array to remove entries of disabled modules
14328 foreach ($url as $key => $subbutton) {
14329 if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
14336 if (array_key_exists('areDropdownButtons', $params) && $params["areDropdownButtons
"] === false) { // @phan-suppress-current-line PhanTypeInvalidDimOffset
14337 foreach ($url as $button) {
14338 if (!empty($button['lang'])) {
14339 $langs->load($button['lang']);
14341 $label = $langs->trans($button['label']);
14342 $text = $button['text'] ?? '';
14343 $actionType = $button['actionType'] ?? '';
14344 $tmpUrl = DOL_URL_ROOT . $button['url'] . (empty($params['backtopage']) ? '' : '&backtopage=' . urlencode($params['backtopage']));
14345 $id = $button['id'] ?? '';
14346 $userRight = $button['perm'] ?? 1;
14347 $button['params'] = $button['params'] ?? []; // @phan-suppress-current-line PhanPluginDuplicateExpressionAssignmentOperation
14349 $out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
14354 if (count($url) > 1) {
14355 $out .= '<div class="dropdown
inline-block dropdown-holder
">';
14356 $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>';
14357 $out .= '<div class="dropdown-content
">';
14358 foreach ($url as $subbutton) {
14359 if (!empty($subbutton['lang'])) {
14360 $langs->load($subbutton['lang']);
14363 if (!empty($subbutton['urlraw'])) {
14364 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14366 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14367 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14370 $subbuttonparam = array();
14371 if (!empty($subbutton['attr'])) {
14372 $subbuttonparam['attr'] = $subbutton['attr'];
14374 $subbuttonparam['isDropDown'] = (empty($params['isDropDown']) ? ($subbutton['isDropDown'] ?? false) : $params['isDropDown']);
14376 $out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, $subbutton['id'] ?? '', $subbutton['perm'], $subbuttonparam);
14381 foreach ($url as $subbutton) { // Should loop on 1 record only
14382 if (!empty($subbutton['lang'])) {
14383 $langs->load($subbutton['lang']);
14386 if (!empty($subbutton['urlraw'])) {
14387 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14389 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14390 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14393 $label = $langs->trans($subbutton['label']);
14394 $text = $subbutton['text'] ?? '';
14395 if (empty($text)) {
14400 $out .= dolGetButtonAction($label, $text, 'default', $tmpurl, '', $subbutton['perm'], $params);
14407 // Here, $url is a simple link
14408 if (!empty($params['isDropdown']) || !empty($params['isDropDown'])) { // Use the dropdown-item style (not for action button)
14409 $class = "dropdown-item
";
14411 $class = 'butAction';
14412 if ($actionType == 'edit') {
14413 $class = 'butAction butActionEdit';
14414 } elseif ($actionType == 'email') {
14415 $class = 'butAction butActionEmail';
14416 } elseif ($actionType == 'clone') {
14417 $class = 'butAction butActionClone';
14418 } elseif ($actionType == 'danger' || $actionType == 'delete') {
14419 $class = 'butAction butActionDelete';
14420 if (!empty($url) && strpos($url, 'token=') === false) {
14421 $url .= '&token=' . newToken();
14427 'href' => empty($url) ? '' : $url,
14431 if (empty($text)) {
14433 $attr['title'] = ''; // if html not set, using label on title is redundant
14435 $attr['title'] = $label;
14436 $attr['aria-label'] = $label;
14439 if (empty($userRight) || $userRight < 0) {
14440 $attr['class'] = 'butActionRefused';
14441 $attr['href'] = '';
14442 $attr['title'] = (($label && $text && $label != $text) ? $label : '');
14443 $attr['title'] = ($attr['title'] ? $attr['title'] . (empty($userRight) ? '<br>' : '') : '');
14444 $attr['title'] .= ((empty($userRight) && empty($label)) ? $langs->trans('NotEnoughPermissions') : '');
14452 if (!empty($params['attr']) && is_array($params['attr'])) {
14453 foreach ($params['attr'] as $key => $value) {
14454 if ($key == 'class') {
14455 $attr['class'] .= ' ' . $value;
14456 } elseif ($key == 'classOverride') {
14457 $attr['class'] = $value;
14459 $attr[$key] = $value;
14464 // automatic add tooltip when title is detected
14465 if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
14466 $attr['class'] .= ' classfortooltip';
14469 // Js Confirm button
14470 if ($userRight && !empty($params['confirm'])) {
14471 if (!is_array($params['confirm'])) {
14472 $params['confirm'] = array();
14475 if (empty($params['confirm']['url'])) {
14476 $params['confirm']['url'] = $url . (strpos($url, '?') > 0 ? '&' : '?') . 'confirm=yes';
14479 // for js disabled compatibility set $url as call to confirm action and $params['confirm']['url'] to confirmed action
14480 $attr['data-confirm-url'] = $params['confirm']['url'];
14481 $attr['data-confirm-title'] = !empty($params['confirm']['title']) ? $params['confirm']['title'] : $langs->trans('ConfirmBtnCommonTitle', $label);
14482 $attr['data-confirm-content'] = !empty($params['confirm']['content']) ? $params['confirm']['content'] : $langs->trans('ConfirmBtnCommonContent', $label);
14483 $attr['data-confirm-content'] = preg_replace("/\r|\n/
", "", $attr['data-confirm-content']);
14484 $attr['data-confirm-action-btn-label'] = !empty($params['confirm']['action-btn-label']) ? $params['confirm']['action-btn-label'] : $langs->trans('Confirm');
14485 $attr['data-confirm-cancel-btn-label'] = !empty($params['confirm']['cancel-btn-label']) ? $params['confirm']['cancel-btn-label'] : $langs->trans('CloseDialog');
14486 $attr['data-confirm-modal'] = !empty($params['confirm']['modal']) ? $params['confirm']['modal'] : true;
14488 $attr['class'] .= ' butActionConfirm';
14491 if (isset($attr['href']) && empty($attr['href'])) {
14492 unset($attr['href']);
14495 // TODO replace $TCompiledAttr generation by commonHtmlAttributeBuilder given below
14496 $TCompiledAttr = array();
14497 foreach ($attr as $key => $value) {
14498 if (!empty($params['use_unsecured_unescapedattr']) && is_array($params['use_unsecured_unescapedattr']) && in_array($key, $params['use_unsecured_unescapedattr'])) {
14500 $value = dol_htmlentities($value, ENT_QUOTES | ENT_SUBSTITUTE);
14501 } elseif ($key == 'href') {
14502 $value = dolPrintHTMLForAttributeUrl($value);
14504 $value = dolPrintHTMLForAttribute($value);
14507 $TCompiledAttr[] = $key . '="' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14509 // TODO replace $TCompiledAttr generation by uncomment line below and remove old code
14510 // $TCompiledAttr = commonHtmlAttributeBuilder($attr,$params['use_unsecured_unescapedattr'] ?? []);
14511 $compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
14513 $tag = !empty($attr['href']) ? 'a' : 'span';
14515 $parameters = array(
14516 'TCompiledAttr' => $TCompiledAttr, // array
14517 'compiledAttributes' => $compiledAttributes, // string
14522 'actionType' => $actionType,
14525 'userRight' => $userRight,
14526 'params' => $params
14529 $reshook = $hookmanager->executeHooks('dolGetButtonAction', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
14530 if ($reshook < 0) {
14531 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
14534 if (empty($reshook)) {
14535 if (dol_textishtml($text)) { // If content already HTML encoded
14536 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . $text . '</span></' . $tag . '>';
14538 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . dol_escape_htmltag($text) . '</span></' . $tag . '>';
14541 return $hookmanager->resPrint;
14580function commonHtmlAttributeBuilder($attr, array $unescapedAttr = [])
14582 $TCompiledAttr = array();
14583 if (empty($attr)) {
14587 foreach ($attr as $key => $value) {
14588 // special boolean attributes case
14589 if (in_array($key, getListOfHtmlBooleanAttributes())) {
14591 $TCompiledAttr[$key] = $key;
14596 if (!empty($unescapedAttr) && in_array($key, $unescapedAttr)) {
14598 $value = dol_htmlentities((string) $value, ENT_QUOTES | ENT_SUBSTITUTE);
14599 } elseif ($key == 'href') {
14600 $value = dolPrintHTMLForAttributeUrl((string) $value);
14602 $value = dolPrintHTMLForAttribute((string) $value);
14605 $TCompiledAttr[$key] = $key . '="
' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14608 return $TCompiledAttr;
14625function getListOfHtmlBooleanAttributes(): array
14674function dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot = true)
14680 $parsedUrl = parse_url($url);
14681 if ((isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], ['javascript', 'mailto', 'tel'])) || strpos($url, '#') === 0) {
14685 if (!empty($parsedUrl['query'])) {
14686 // Use parse_str() function to parse the string passed via URL
14687 parse_str($parsedUrl['query'], $urlQuery);
14688 if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
14689 $url .= '&backtopage=' . urlencode($params['backtopage']);
14693 if (!isset($parsedUrl['scheme']) && $addDolUrlRoot) {
14694 $url = DOL_URL_ROOT . $url;
14707function dolGetButtonTitleSeparator($moreClass = "
")
14709 return '<span class="button-title-separator
' . $moreClass . '" ></span>';
14718function getFieldErrorIcon($fieldValidationErrorMsg)
14721 if (!empty($fieldValidationErrorMsg)) {
14722 $out .= '<span class="field-error-icon classfortooltip
" title="' . dol_escape_htmltag($fieldValidationErrorMsg, 1) . '" role="alert
" >'; // role alert is used for accessibility
14723 $out .= '<span class="fa fa-exclamation-circle
" aria-hidden="true" ></span>'; // For accessibility icon is separated and aria-hidden
14742function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $url = '', $id = '', $status = 1, $params = array())
14744 global $langs, $user;
14746 // Actually this conf is used in css too for external module compatibility and smooth transition to this function
14747 if (getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
14750 // Fix old picto fa-th-list to use fa-grid-vertical instead
14751 if ($iconClass == 'fa fa-th-list imgforviewmode') {
14752 $iconClass = ' fa fa-grip-horizontal imgforviewmode';
14755 $class = 'btnTitle';
14756 if (in_array($iconClass, array('fa fa-plus-circle', 'fa fa-plus-circle size15x', 'fa fa-comment-dots', 'fa fa-paper-plane'))) {
14757 $class .= ' btnTitlePlus';
14759 $useclassfortooltip = 1;
14761 if (!empty($params['morecss'])) {
14762 $class .= ' ' . $params['morecss'];
14767 'href' => empty($url) ? '' : $url
14770 if (!empty($helpText)) {
14771 $attr['title'] = $helpText;
14772 } elseif ($label) { // empty($attr['title']) &&
14773 $attr['title'] = $label;
14774 $useclassfortooltip = 0;
14777 if ($status == 2) {
14778 $attr['class'] .= ' btnTitleSelected';
14779 } elseif ($status <= 0) {
14780 $attr['class'] .= ' refused';
14782 $attr['href'] = '';
14784 if ($status == -1) { // disable
14785 $attr['title'] = $langs->transnoentitiesnoconv("FeatureDisabled
");
14786 } elseif ($status == 0) { // Not enough permissions
14787 $attr['title'] = $langs->transnoentitiesnoconv("NotEnoughPermissions
");
14791 if (!empty($attr['title']) && $useclassfortooltip) {
14792 $attr['class'] .= ' classfortooltip';
14800 if (!empty($params['attr']) && is_array($params['attr'])) {
14801 foreach ($params['attr'] as $key => $value) {
14802 if ($key == 'class') {
14803 $attr['class'] .= ' ' . $value;
14804 } elseif ($key == 'classOverride') {
14805 $attr['class'] = $value;
14807 $attr[$key] = $value;
14812 if (isset($attr['href']) && empty($attr['href'])) {
14813 unset($attr['href']);
14816 // TODO : add a hook
14818 // Generate attributes with escapement
14819 $TCompiledAttr = array();
14820 foreach ($attr as $key => $value) {
14821 $TCompiledAttr[] = $key . '="' . dol_escape_htmltag($value) . '"'; // Do not use dolPrintHTMLForAttribute() here, we must accept "javascript:
string"
14824 $compiledAttributes = (empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr));
14826 $tag = (empty($attr['href']) ? 'span' : 'a');
14828 $button = '<' . $tag . ' ' . $compiledAttributes . '>';
14829 $button .= '<span class="' . $iconClass . ' valignmiddle btnTitle-icon
"></span>';
14830 if (!empty($params['forcenohideoftext'])) {
14831 $button .= '<span class="valignmiddle text-plus-circle btnTitle-label
' . (empty($params['forcenohideoftext
']) ? ' hideonsmartphone
' : '') . '">' . $label . '</span>';
14833 $button .= '</' . $tag . '>';
14847function getElementProperties($elementType)
14849 global $conf, $db, $hookmanager;
14853 //$element_type='facture';
14855 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element = '';
14857 // Parse element/subelement
14858 $module = $elementType;
14859 $element = $elementType;
14860 $subelement = $elementType;
14861 $table_element = $elementType;
14863 // If we ask a resource form external module (instead of default path)
14864 if (preg_match('/^([^@]+)@([^@]+)$/i', $elementType, $regs)) { // 'myobject@mymodule'
14865 $element = $subelement = $regs[1];
14866 $module = $regs[2];
14869 // If we ask a resource for a string with an element and a subelement
14870 // Example 'project_task'
14871 if (preg_match('/^([^_]+)_([^_]+)/i', $element, $regs)) { // 'myobject_mysubobject' with myobject=mymodule
14872 $module = $element = $regs[1];
14873 $subelement = $regs[2];
14876 // Object lines will use parent classpath and module ref
14877 if (substr($elementType, -3) == 'det') {
14878 $module = preg_replace('/det$/', '', $element);
14879 $subelement = preg_replace('/det$/', '', $subelement);
14880 $classpath = $module . '/class';
14881 $classfile = $module;
14882 $classname = preg_replace('/det$/', 'Line', $element);
14883 if (in_array($module, array('expedition', 'propale', 'facture', 'contrat', 'fichinter', 'supplier_order', 'commandefournisseur'))) {
14884 $classname = preg_replace('/det$/', 'Ligne', $element);
14887 // For compatibility and to work with non standard path
14888 if ($elementType == "action
" || $elementType == "actioncomm
") {
14889 $classpath = 'comm/action/class';
14890 $subelement = 'Actioncomm';
14891 $module = 'agenda';
14892 $table_element = 'actioncomm';
14893 } elseif ($elementType == 'cronjob') {
14894 $classpath = 'cron/class';
14896 $table_element = 'cron';
14897 } elseif ($elementType == 'adherent_type') {
14898 $classpath = 'adherents/class';
14899 $classfile = 'adherent_type';
14900 $module = 'adherent';
14901 $subelement = 'adherent_type';
14902 $classname = 'AdherentType';
14903 $table_element = 'adherent_type';
14904 } elseif ($elementType == 'bank_account') {
14905 $classpath = 'compta/bank/class';
14906 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
14907 $classfile = 'account';
14908 $classname = 'Account';
14909 } elseif ($elementType == 'bank_line') {
14910 $classpath = 'compta/bank/class';
14911 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
14912 $classfile = 'account';
14913 $classname = 'AccountLine';
14914 } elseif ($elementType == 'category') {
14915 $classpath = 'categories/class';
14916 $module = 'categorie';
14917 $subelement = 'categorie';
14918 $table_element = 'categorie';
14919 } elseif ($elementType == 'contact') {
14920 $classpath = 'contact/class';
14921 $classfile = 'contact';
14922 $module = 'societe';
14923 $subelement = 'contact';
14924 $table_element = 'socpeople';
14925 } elseif ($elementType == 'inventory') {
14926 $module = 'product';
14927 $classpath = 'product/inventory/class';
14928 } elseif ($elementType == 'inventoryline') {
14929 $module = 'product';
14930 $classpath = 'product/inventory/class';
14931 $table_element = 'inventorydet';
14932 $parent_element = 'inventory';
14933 } elseif ($elementType == 'stock' || $elementType == 'entrepot' || $elementType == 'warehouse') {
14935 $classpath = 'product/stock/class';
14936 $classfile = 'entrepot';
14937 $classname = 'Entrepot';
14938 $table_element = 'entrepot';
14939 } elseif ($elementType == 'project') {
14940 $classpath = 'projet/class';
14941 $module = 'projet';
14942 $table_element = 'projet';
14943 } elseif ($elementType == 'project_task') {
14944 $classpath = 'projet/class';
14945 $module = 'projet';
14946 $subelement = 'task';
14947 $table_element = 'projet_task';
14948 } elseif ($elementType == 'facture' || $elementType == 'invoice') {
14949 $classpath = 'compta/facture/class';
14950 $module = 'facture';
14951 $subelement = 'facture';
14952 $table_element = 'facture';
14953 } elseif ($elementType == 'facturedet') {
14954 $classpath = 'compta/facture/class';
14955 $classfile = 'facture';
14956 $classname = 'FactureLigne';
14957 $module = 'facture';
14958 $table_element = 'facturedet';
14959 $parent_element = 'facture';
14960 } elseif ($elementType == 'facturerec'|| $elementType == 'facture_rec') {
14961 $classpath = 'compta/facture/class';
14962 $classfile = 'facture-rec';
14963 $module = 'facture';
14964 $classname = 'FactureRec';
14965 } elseif ($elementType == 'commande' || $elementType == 'order') {
14966 $classpath = 'commande/class';
14967 $module = 'commande';
14968 $subelement = 'commande';
14969 $table_element = 'commande';
14970 } elseif ($elementType == 'commandedet') {
14971 $classpath = 'commande/class';
14972 $classfile = 'commande';
14973 $classname = 'OrderLine';
14974 $module = 'commande';
14975 $table_element = 'commandedet';
14976 $parent_element = 'commande';
14977 } elseif ($elementType == 'propal') {
14978 $classpath = 'comm/propal/class';
14979 $table_element = 'propal';
14980 } elseif ($elementType == 'propaldet') {
14981 $classpath = 'comm/propal/class';
14982 $classfile = 'propal';
14983 $subelement = 'propaleligne';
14984 $module = 'propal';
14985 $table_element = 'propaldet';
14986 $parent_element = 'propal';
14987 } elseif ($elementType == 'shipping') {
14988 $classpath = 'expedition/class';
14989 $classfile = 'expedition';
14990 $classname = 'Expedition';
14991 $module = 'expedition';
14992 $table_element = 'expedition';
14993 } elseif ($elementType == 'expeditiondet' || $elementType == 'shippingdet') {
14994 $classpath = 'expedition/class';
14995 $classfile = 'expedition';
14996 $classname = 'ExpeditionLigne';
14997 $module = 'expedition';
14998 $table_element = 'expeditiondet';
14999 $parent_element = 'expedition';
15000 } elseif ($elementType == 'delivery_note') {
15001 $classpath = 'delivery/class';
15002 $subelement = 'delivery';
15003 $module = 'expedition';
15004 } elseif ($elementType == 'delivery') {
15005 $classpath = 'delivery/class';
15006 $subelement = 'delivery';
15007 $module = 'expedition';
15008 } elseif ($elementType == 'deliverydet') {
15010 } elseif ($elementType == 'supplier_proposal') {
15011 $classpath = 'supplier_proposal/class';
15012 $module = 'supplier_proposal';
15013 $element = 'supplierproposal';
15014 $classfile = 'supplier_proposal';
15015 $subelement = 'supplierproposal';
15016 } elseif ($elementType == 'supplier_proposaldet') {
15017 $classpath = 'supplier_proposal/class';
15018 $module = 'supplier_proposal';
15019 $classfile = 'supplier_proposal';
15020 $classname = 'SupplierProposalLine';
15021 $table_element = 'supplier_proposaldet';
15022 $parent_element = 'supplier_proposal';
15023 } elseif ($elementType == 'contract') {
15024 $classpath = 'contrat/class';
15025 $module = 'contrat';
15026 $subelement = 'contrat';
15027 $table_element = 'contract';
15028 } elseif ($elementType == 'contratdet') {
15029 $classpath = 'contrat/class';
15030 $module = 'contrat';
15031 $table_element = 'contratdet';
15032 $parent_element = 'contrat';
15033 } elseif ($elementType == 'mailing') {
15034 $classpath = 'comm/mailing/class';
15035 $module = 'mailing';
15036 $classfile = 'mailing';
15037 $classname = 'Mailing';
15039 } elseif ($elementType == 'member' || $elementType == 'adherent') {
15040 $classpath = 'adherents/class';
15041 $module = 'adherent';
15042 $subelement = 'adherent';
15043 $table_element = 'adherent';
15044 } elseif ($elementType == 'subscription') {
15045 $classpath = 'adherents/class';
15046 $classfile = 'subscription';
15047 $module = 'adherent';
15048 $subelement = 'subscription';
15049 $classname = 'Subscription';
15050 $table_element = 'subscription';
15051 } elseif ($elementType == 'usergroup') {
15052 $classpath = 'user/class';
15054 } elseif ($elementType == 'mo' || $elementType == 'mrp') {
15055 $classpath = 'mrp/class';
15060 $table_element = 'mrp_mo';
15061 } elseif ($elementType == 'mrp_production') {
15062 $classpath = 'mrp/class';
15064 $classname = 'MoLine';
15067 $table_element = 'mrp_production';
15068 $parent_element = 'mo';
15069 } elseif ($elementType == 'cabinetmed_cons') {
15070 $classpath = 'cabinetmed/class';
15071 $module = 'cabinetmed';
15072 $subelement = 'cabinetmedcons';
15073 $table_element = 'cabinetmedcons';
15074 } elseif ($elementType == 'fichinter') {
15075 $classpath = 'fichinter/class';
15076 $module = 'ficheinter';
15077 $subelement = 'fichinter';
15078 $table_element = 'fichinter';
15079 } elseif ($elementType == 'dolresource' || $elementType == 'resource') {
15080 $classpath = 'resource/class';
15081 $module = 'resource';
15082 $subelement = 'dolresource';
15083 $table_element = 'resource';
15084 } elseif ($elementType == 'opensurvey_sondage') {
15085 $classpath = 'opensurvey/class';
15086 $module = 'opensurvey';
15087 $subelement = 'opensurveysondage';
15088 } elseif ($elementType == 'order_supplier' || $elementType == 'supplier_order' || $elementType == 'commande_fournisseur' || $elementType == 'commandefournisseur') {
15089 $classpath = 'fourn/class';
15090 $module = 'fournisseur';
15091 $classfile = 'fournisseur.commande';
15092 $element = 'order_supplier';
15094 $classname = 'CommandeFournisseur';
15095 $table_element = 'commande_fournisseur';
15096 } elseif ($elementType == 'commande_fournisseurdet') {
15097 $classpath = 'fourn/class';
15098 $module = 'fournisseur';
15099 $classfile = 'fournisseur.commande';
15100 $element = 'commande_fournisseurdet';
15102 $classname = 'CommandeFournisseurLigne';
15103 $table_element = 'commande_fournisseurdet';
15104 $parent_element = 'commande_fournisseur';
15105 } elseif ($elementType == 'invoice_supplier' || $elementType == 'supplier_invoice' || $elementType == 'facture_fourn') {
15106 $classpath = 'fourn/class';
15107 $module = 'fournisseur';
15108 $classfile = 'fournisseur.facture';
15109 $element = 'invoice_supplier';
15111 $classname = 'FactureFournisseur';
15112 $table_element = 'facture_fourn';
15113 } elseif ($elementType == 'facture_fourn_det') {
15114 $classpath = 'fourn/class';
15115 $module = 'fournisseur';
15116 $classfile = 'fournisseur.facture';
15117 $element = 'facture_fourn_det';
15119 $classname = 'SupplierInvoiceLine';
15120 $table_element = 'facture_fourn_det';
15121 $parent_element = 'invoice_supplier';
15122 } elseif ($elementType == "service
") {
15123 $classpath = 'product/class';
15124 $subelement = 'product';
15125 $table_element = 'product';
15126 } elseif ($elementType == 'product_attribute') {
15127 $module = 'variants';
15128 $element = 'product_attribute';
15129 $subelement = 'product_attribute';
15130 $classpath = 'variants/class';
15131 $classfile = 'ProductAttribute';
15132 $classname = 'ProductAttribute';
15133 $table_element = 'product_attribute';
15134 } elseif ($elementType == 'product_attribute_value') {
15135 $module = 'variants';
15136 $element = 'product_attribute_value';
15137 $subelement = 'product_attribute_value';
15138 $classpath = 'variants/class';
15139 $classfile = 'ProductAttributeValue';
15140 $classname = 'ProductAttributeValue';
15141 $table_element = 'product_attribute_value';
15142 $parent_element = 'product_attribute';
15143 } elseif ($elementType == 'salary') {
15144 $classpath = 'salaries/class';
15145 $module = 'salaries';
15146 } elseif ($elementType == 'payment_salary') {
15147 $classpath = 'salaries/class';
15148 $classfile = 'paymentsalary';
15149 $classname = 'PaymentSalary';
15150 $module = 'salaries';
15151 } elseif ($elementType == 'productlot') {
15152 $module = 'productbatch';
15153 $classpath = 'product/stock/class';
15154 $classfile = 'productlot';
15155 $classname = 'Productlot';
15156 $element = 'productlot';
15158 $table_element = 'product_lot';
15159 } elseif ($elementType == 'societeaccount') {
15160 $classpath = 'societe/class';
15161 $classfile = 'societeaccount';
15162 $classname = 'SocieteAccount';
15163 $module = 'societe';
15164 } elseif ($elementType == 'websitepage' || $elementType == 'website_page') {
15165 $classpath = 'website/class';
15166 $classfile = 'websitepage';
15167 $classname = 'Websitepage';
15168 $module = 'website';
15169 $subelement = 'websitepage';
15170 $table_element = 'website_page';
15171 } elseif ($elementType == 'fiscalyear') {
15172 $classpath = 'core/class';
15173 $module = 'accounting';
15174 $subelement = 'fiscalyear';
15175 } elseif ($elementType == 'chargesociales') {
15176 $classpath = 'compta/sociales/class';
15178 $table_element = 'chargesociales';
15179 } elseif ($elementType == 'tva') {
15180 $classpath = 'compta/tva/class';
15183 $table_element = 'tva';
15184 } elseif ($elementType == 'emailsenderprofile') {
15186 $classpath = 'core/class';
15187 $classfile = 'emailsenderprofile';
15188 $classname = 'EmailSenderProfile';
15189 $table_element = 'c_email_senderprofile';
15191 } elseif ($elementType == 'conferenceorboothattendee') {
15192 $classpath = 'eventorganization/class';
15193 $classfile = 'conferenceorboothattendee';
15194 $classname = 'ConferenceOrBoothAttendee';
15195 $module = 'eventorganization';
15196 } elseif ($elementType == 'conferenceorbooth') {
15197 $classpath = 'eventorganization/class';
15198 $classfile = 'conferenceorbooth';
15199 $classname = 'ConferenceOrBooth';
15200 $module = 'eventorganization';
15201 } elseif ($elementType == 'ccountry') {
15203 $classpath = 'core/class';
15204 $classfile = 'ccountry';
15205 $classname = 'Ccountry';
15206 $table_element = 'c_country';
15208 } elseif ($elementType == 'ecmfiles') {
15210 $classpath = 'ecm/class';
15211 $classfile = 'ecmfiles';
15212 $classname = 'Ecmfiles';
15213 $table_element = 'ecmfiles';
15215 } elseif ($elementType == 'knowledgerecord' || $elementType == 'knowledgemanagement') {
15216 $module = 'knowledgemanagement';
15217 $classpath = 'knowledgemanagement/class';
15218 $classfile = 'knowledgerecord';
15219 $classname = 'KnowledgeRecord';
15220 $table_element = 'knowledgemanagement_knowledgerecord';
15222 } elseif ($elementType == 'customer') {
15223 $module = 'societe';
15224 $classpath = 'societe/class';
15225 $classfile = 'client';
15226 $classname = 'Client';
15227 $table_element = 'societe';
15229 } elseif ($elementType == 'fournisseur' || $elementType == 'supplier') {
15230 $module = 'societe';
15231 $classpath = 'fourn/class';
15232 $classfile = 'fournisseur';
15233 $classname = 'Fournisseur';
15234 $table_element = 'societe';
15236 } elseif ($elementType == 'recruitmentcandidature') {
15237 $module = 'recruitment';
15238 $classfile = 'recruitmentcandidature';
15239 $classpath = 'recruitment/class';
15240 $classname = 'RecruitmentCandidature';
15241 $subelement = 'recruitmentcandidature';
15242 $subdir = '/recruitmentcandidature';
15243 } elseif ($elementType == 'recruitmentjobposition') {
15244 $module = 'recruitment';
15245 $classfile = 'recruitmentjobposition';
15246 $classpath = 'recruitment/class';
15247 $classname = 'RecruitmentJobPosition';
15248 $subelement = 'recruitmentjobposition';
15249 $subdir = '/recruitmentjobposition';
15253 if (empty($classfile)) {
15254 $classfile = strtolower($subelement);
15256 if (empty($classname)) {
15257 $classname = ucfirst($subelement);
15259 if (empty($classpath)) {
15260 $classpath = $module . '/class';
15263 //print 'getElementProperties subdir='.$subdir;
15266 if ($module && isset($conf->$module)) { // The generic case
15267 if (!empty($conf->$module->multidir_output[$conf->entity])) {
15268 $dir_output = $conf->$module->multidir_output[$conf->entity];
15269 } elseif (!empty($conf->$module->output[$conf->entity])) {
15270 $dir_output = $conf->$module->output[$conf->entity];
15271 } elseif (!empty($conf->$module->dir_output)) {
15272 $dir_output = $conf->$module->dir_output;
15274 if (!empty($conf->$module->multidir_temp[$conf->entity])) {
15275 $dir_temp = $conf->$module->multidir_temp[$conf->entity];
15276 } elseif (!empty($conf->$module->temp[$conf->entity])) {
15277 $dir_temp = $conf->$module->temp[$conf->entity];
15278 } elseif (!empty($conf->$module->dir_temp)) {
15279 $dir_temp = $conf->$module->dir_temp;
15283 // Overwrite value for special cases
15284 if ($element == 'order_supplier' && isModEnabled('fournisseur')) {
15285 $dir_output = $conf->fournisseur->commande->dir_output;
15286 $dir_temp = $conf->fournisseur->commande->dir_temp;
15287 } elseif ($element == 'invoice_supplier' && isModEnabled('fournisseur')) {
15288 $dir_output = $conf->fournisseur->facture->dir_output;
15289 $dir_temp = $conf->fournisseur->facture->dir_temp;
15291 $dir_output .= $subdir;
15292 $dir_temp .= $subdir;
15294 $elementProperties = array(
15295 'module' => $module,
15296 'element' => $element,
15297 'table_element' => $table_element,
15298 'subelement' => $subelement,
15299 'classpath' => $classpath,
15300 'classfile' => $classfile,
15301 'classname' => $classname,
15302 'dir_output' => $dir_output,
15303 'dir_temp' => $dir_temp,
15304 'parent_element' => $parent_element,
15309 if (!is_object($hookmanager)) {
15310 include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
15311 $hookmanager = new HookManager($db);
15313 $hookmanager->initHooks(array('elementproperties'));
15317 $parameters = array(
15318 'elementType' => $elementType,
15319 'elementProperties' => $elementProperties
15322 $reshook = $hookmanager->executeHooks('getElementProperties', $parameters);
15325 $elementProperties = $hookmanager->resArray;
15326 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for sécurity against misconfigured external modules
15327 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
15330 // context of elementproperties doesn't need to exist out of this function so delete it to avoid elementproperties context is equal to all
15331 if (($key = array_search('elementproperties', $hookmanager->contextarray)) !== false) {
15332 unset($hookmanager->contextarray[$key]);
15335 return $elementProperties;
15350function fetchObjectByElement($element_id, $element_type, $element_ref = '', $useCache = 0, $maxCacheByType = 10)
15356 $element_prop = getElementProperties($element_type);
15358 if ($element_prop['module'] == 'product' || $element_prop['module'] == 'service') {
15359 // For example, for an extrafield 'product' (shared for both product and service) that is a link to an object,
15360 // this is called with $element_type = 'product' when we need element properties of a service, we must return a product. If we create the
15361 // extrafield for a service, it is not supported and not found when editing the product/service card. So we must keep 'product' for extrafields
15362 // of service and we will return properties of a product.
15363 $ismodenabled = (isModEnabled('product') || isModEnabled('service'));
15364 } elseif ($element_prop['module'] == 'societeaccount') {
15365 $ismodenabled = isModEnabled('website') || isModEnabled('webportal');
15367 $ismodenabled = isModEnabled($element_prop['module']);
15369 //var_dump('element_type='.$element_type);
15370 //var_dump($element_prop);
15371 //var_dump($element_prop['module'].' '.$ismodenabled);
15372 if (is_array($element_prop) && (empty($element_prop['module']) || $ismodenabled)) {
15373 if ($useCache === 1 && $element_id > 0
15374 && !empty($conf->cache['fetchObjectByElement'][$element_type])
15375 && !empty($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15376 && is_object($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15378 return $conf->cache['fetchObjectByElement'][$element_type][$element_id];
15381 dol_include_once('/' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15383 if (class_exists($element_prop['classname'])) {
15384 $className = $element_prop['classname'];
15385 $objecttmp = new $className($db);
15386 '@phan-var-force CommonObject $objecttmp';
15389 if ($element_id > 0 || !empty($element_ref)) {
15390 $ret = $objecttmp->fetch($element_id, $element_ref);
15392 if (empty($objecttmp->module)) {
15393 $objecttmp->module = $element_prop['module'];
15396 if ($useCache > 0) {
15397 if (!isset($conf->cache['fetchObjectByElement'][$element_type])) {
15398 $conf->cache['fetchObjectByElement'][$element_type] = [];
15401 // Manage cache limit
15402 if (! empty($conf->cache['fetchObjectByElement'][$element_type]) && is_array($conf->cache['fetchObjectByElement'][$element_type]) && count($conf->cache['fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
15403 array_shift($conf->cache['fetchObjectByElement'][$element_type]);
15406 $conf->cache['fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
15412 return $objecttmp; // returned an object without fetch
15415 dol_syslog($element_prop['classname'] . ' doesn\'t exists in /' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15428function getExecutableContent()
15430 $arrayofregexextension = array(
15457 return $arrayofregexextension;
15466function isAFileWithExecutableContent($filename)
15468 $arrayofregexextension = getExecutableContent();
15470 foreach ($arrayofregexextension as $fileextension) {
15471 if (preg_match('/\.' . preg_quote($fileextension, '/') . '$/i', $filename)) {
15488 return empty($_SESSION['newtoken']) ? '' : $_SESSION['newtoken'];
15498function currentToken()
15500 return isset($_SESSION['token']) ? $_SESSION['token'] : '';
15512 if (empty($conf->cache['nonce'])) {
15513 include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php';
15514 $conf->cache['nonce'] = dolGetRandomBytes(8);
15517 return $conf->cache['nonce'];
15534function startSimpleTable($header, $link = "
", $arguments = "", $emptyColumns = 0, $number = -1, $pictofulllist = '')
15538 print '<div class="div-
table-responsive-no-min
">';
15539 print '<table class="noborder centpercent
">';
15540 print '<tr class="liste_titre
">';
15542 print ($emptyColumns < 1) ? '<th>' : '<th colspan="' . ($emptyColumns + 1) . '">';
15544 print '<span class="valignmiddle
">' . $langs->trans($header) . '</span>';
15546 if (!empty($link)) {
15547 if (!empty($arguments)) {
15548 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '?
' . $arguments . '">';
15550 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '">';
15554 if ($number > -1) {
15555 print '<span class="badge marginleftonlyshort
">' . $number . '</span>';
15556 } elseif (!empty($link)) {
15557 print '<span class="badge marginleftonlyshort
">...</span>';
15560 if (!empty($link)) {
15566 if ($number < 0 && !empty($link)) {
15567 print '<th class="right
">';
15582function finishSimpleTable($addLineBreak = false)
15587 if ($addLineBreak) {
15603function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord = "None
", $extraRightColumn = false)
15608 print '<tr class="oddeven
">';
15609 print '<td colspan="' . $tableColumnCount . '"><span class="opacitymedium
">' . $langs->trans($noneWord) . '</span></td>';
15614 if ($nbofloop === 0) {
15615 // don't show a summary line
15619 /* Case already handled above, commented to satisfy phpstan.
15621 $colspan = $tableColumnCount;
15624 if ($num > $nbofloop) {
15625 $colspan = $tableColumnCount;
15627 $colspan = $tableColumnCount - 1;
15630 if ($extraRightColumn) {
15634 print '<tr class="liste_total
">';
15636 if ($nbofloop > 0 && $num > $nbofloop) {
15637 print '<td colspan="' . $colspan . '" class="right
">' . $langs->trans("XMoreLines
", ($num - $nbofloop)) . '</td>';
15639 print '<td colspan="' . $colspan . '" class="right
"> ' . $langs->trans("Total
") . '</td>';
15640 print '<td class="right centpercent
">' . price($total) . '</td>';
15643 if ($extraRightColumn) {
15658function readfileLowMemory($fullpath_original_file_osencoded, $method = -1)
15660 if ($method == -1) {
15662 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_FREAD')) {
15665 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_STREAM_COPY')) {
15670 // Be sure we don't have output buffering enabled to have readfile working correctly
15671 while (ob_get_level()) {
15676 if ($method == 0) {
15677 readfile($fullpath_original_file_osencoded);
15678 } elseif ($method == 1) {
15680 $handle = fopen($fullpath_original_file_osencoded, "rb
");
15681 while (!feof($handle)) {
15682 print fread($handle, 8192);
15685 } elseif ($method == 2) {
15687 $handle1 = fopen($fullpath_original_file_osencoded, "rb
");
15688 $handle2 = fopen("php:
15689 stream_copy_to_stream($handle1, $handle2);
15710 $result =
'<span class="clipboardCP' . ($showonlyonhover ?
' clipboardCPShowOnHover valignmiddle' :
'') .
'">';
15711 if ($texttoshow ===
'none') {
15712 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15713 $result .=
'<span class="clipboardCPValueToPrint"></span>';
15714 } elseif ($texttoshow) {
15715 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15716 $result .=
'<span class="clipboardCPValueToPrint">' .
dol_escape_htmltag($texttoshow, 1, 1) .
'</span>';
15718 $result .=
'<' . $tag .
' class="clipboardCPValue">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
15720 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="' .
dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")) .
'"></span>';
15721 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
15722 $result .=
'<span class="clipboardCPText"></span>';
15723 $result .=
'</span>';
15738 $result = json_decode($stringtodecode, $assoc);
15739 if ($result ===
null) {
15740 $result = unserialize($stringtodecode);
15767 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
15770 if (!preg_match(
'/^\(.*\)$/', $filter)) {
15771 $filter =
'(' . $filter .
')';
15774 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
15775 $firstandlastparenthesis = 0;
15777 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
15781 return 'Filter syntax error - ' . $errorstr;
15786 $t = preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeDummyCriteriaCallback', $filter);
15787 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
15790 if (preg_match(
'/[^\(\)]/', $t)) {
15791 $tmperrorstr =
'Bad syntax of the search string';
15792 $errorstr =
'Bad syntax of the search string: ' . $filter;
15796 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - " . $errorstr, LOG_WARNING);
15797 return 'Filter error - ' . $tmperrorstr;
15801 $ret = ($noand ?
"" :
" AND ") . ($nopar ?
"" :
'(') . preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeSQLCriteriaCallback', $filter) . ($nopar ?
"" :
')');
15803 if (is_object($db)) {
15804 $ret = str_replace(
'__NOW__',
"'" . $db->idate(
dol_now()) .
"'", $ret);
15806 if (is_object($user)) {
15807 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
15822 $arrayofandtags = array();
15826 $parenthesislevel = 0;
15831 if ($parenthesislevel >= 1) {
15832 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
15837 $countparenthesis = 0;
15838 while ($i < $nbofchars) {
15841 if ($char ==
'(') {
15842 $countparenthesis++;
15843 } elseif ($char ==
')') {
15844 $countparenthesis--;
15847 if ($countparenthesis == 0) {
15848 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
15849 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
15850 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
15853 if (!preg_match(
'/^\(.*\)$/', $s)) {
15854 $s =
'(' . $s .
')';
15856 $arrayofandtags[] = $s;
15869 if (!preg_match(
'/^\(.*\)$/', $s)) {
15870 $s =
'(' . $s .
')';
15872 $arrayofandtags[] = $s;
15875 return $arrayofandtags;
15887function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
15891 $tmp = $sqlfilters;
15895 $parenthesislevel = 0;
15903 if ($char ==
'(') {
15904 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
15906 $parenthesislevel++;
15909 } elseif ($char ==
')') {
15910 $nbcharremaining = ($nb - $i - 1);
15911 if ($nbcharremaining >= $counter) {
15912 $parenthesislevel = min($parenthesislevel, $counter - 1);
15914 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
15915 $parenthesislevel = $counter;
15920 if ($counter < 0) {
15921 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
15922 $parenthesislevel = 0;
15930 if ($counter > 0) {
15931 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
15932 $parenthesislevel = 0;
15950 if (empty($matches[1])) {
15953 $tmp = explode(
':', $matches[1]);
15954 if (count($tmp) < 3) {
15974 if (empty($matches[1])) {
15977 $tmp = explode(
':', $matches[1], 3);
15978 if (count($tmp) < 3) {
15982 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
15984 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
15987 'NOTLIKE' =>
'NOT LIKE',
15988 'ISNOT' =>
'IS NOT',
15989 'NOTIN' =>
'NOT IN',
15993 if (array_key_exists($operator, $realOperator)) {
15994 $operator = $realOperator[$operator];
15997 $tmpescaped = $tmp[2];
16003 if ($operator ==
'IN' || $operator ==
'NOT IN') {
16005 $tmpescaped2 =
'(';
16007 $tmpelemarray = explode(
',', $tmpescaped);
16008 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
16010 $tmpelem = trim($tmpelem);
16011 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
16012 $tmpelemarray[$tmpkey] =
"'" . $db->escape($db->sanitize($reg[1], 2, 1, 1, 1)) .
"'";
16013 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 2, 1, 1, 1)).
"'";
16014 } elseif (preg_match(
'/^[0-9]+$/', (
string) $tmpelem)) {
16015 $tmpelemarray[$tmpkey] = (int) $tmpelem;
16016 } elseif (is_numeric((
string) $tmpelem)) {
16017 $tmpelemarray[$tmpkey] = (float) $tmpelem;
16018 } elseif (!
getDolGlobalString(
"MAIN_DISALLOW_UNSECURED_SELECT_INTO_EXTRAFIELDS_FILTER")) {
16019 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_<>=!\s]/i',
'', $tmpelem);
16021 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpelem);
16024 $tmpescaped2 .= implode(
',', $tmpelemarray);
16025 $tmpescaped2 .=
')';
16027 $tmpescaped = $tmpescaped2;
16028 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
16029 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
16030 $tmpescaped = $regbis[1];
16033 $tmpescaped =
"'" . $db->escape($tmpescaped) .
"'";
16034 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
16037 $tmpescaped =
"'" . $db->escape($regbis[1]) .
"'";
16039 if (strtoupper($tmpescaped) ==
'NULL') {
16040 $tmpescaped =
'NULL';
16041 } elseif (preg_match(
'/^[0-9]+$/', (
string) $tmpescaped)) {
16042 $tmpescaped = (int) $tmpescaped;
16043 } elseif (is_numeric((
string) $tmpescaped)) {
16044 $tmpescaped = (float) $tmpescaped;
16046 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
16050 return '(' . $db->escape($operand) .
' ' . strtoupper($operator) .
' ' . $tmpescaped .
')';
16067 $out =
'<!-- timeline icon -->' .
"\n";
16068 $iconClass =
'fa fa-comments';
16073 if ($histo[$key][
'percent'] == -1) {
16074 $colorClass =
'timeline-icon-not-applicble';
16075 $pictoTitle = $langs->trans(
'StatusNotApplicable');
16076 } elseif ($histo[$key][
'percent'] == 0) {
16077 $colorClass =
'timeline-icon-todo';
16078 $pictoTitle = $langs->trans(
'StatusActionToDo') .
' (0%)';
16079 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
16080 $colorClass =
'timeline-icon-in-progress';
16081 $pictoTitle = $langs->trans(
'StatusActionInProcess') .
' (' . $histo[$key][
'percent'] .
'%)';
16082 } elseif ($histo[$key][
'percent'] >= 100) {
16083 $colorClass =
'timeline-icon-done';
16084 $pictoTitle = $langs->trans(
'StatusActionDone') .
' (100%)';
16087 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
16088 $iconClass =
'fa fa-ticket';
16089 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
16090 $iconClass =
'fa fa-pencilxxx';
16091 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16092 $iconClass =
'fa fa-comments';
16093 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16094 $iconClass =
'fa fa-mask';
16096 if ($actionstatic->type_picto) {
16097 $img_picto =
img_picto(
'', $actionstatic->type_picto);
16099 if ($actionstatic->type_code ==
'AC_RDV') {
16100 $iconClass =
'fa fa-handshake';
16101 } elseif ($actionstatic->type_code ==
'AC_TEL') {
16102 $iconClass =
'fa fa-phone';
16103 } elseif ($actionstatic->type_code ==
'AC_FAX') {
16104 $iconClass =
'fa fa-fax';
16105 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
16106 $iconClass =
'fa fa-envelope';
16107 } elseif ($actionstatic->type_code ==
'AC_INT') {
16108 $iconClass =
'fa fa-shipping-fast';
16109 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
16110 $iconClass =
'fa fa-robot';
16111 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
16112 $iconClass =
'fa fa-robot';
16117 $out .=
'<i class="' . $iconClass .
' ' . $colorClass .
'" title="' . $pictoTitle .
'">' . $img_picto .
'</i>' .
"\n";
16131 $documents = array();
16133 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename, ecm.agenda_id';
16134 $sql .=
' FROM ' . MAIN_DB_PREFIX .
'ecm_files ecm';
16135 $sql .=
" WHERE ecm.filepath = 'agenda/" . ((int)
$object->id) .
"'";
16137 $sql .=
' OR ecm.agenda_id = ' . (int)
$object->id;
16138 $sql .=
' ORDER BY ecm.position ASC';
16140 $resql = $db->query($sql);
16142 if ($db->num_rows($resql)) {
16143 while ($obj = $db->fetch_object($resql)) {
16144 $documents[$obj->id] = $obj;
16170function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
16172 global $user, $conf;
16175 global $param, $massactionbutton;
16177 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16180 if (!is_object($filterobj) && !is_object($objcon)) {
16185 '@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';
16190 $sortfield_list = explode(
',', $sortfield);
16191 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
16192 $sortfield_new_list = array();
16193 foreach ($sortfield_list as $sortfield_value) {
16194 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
16196 $sortfield_new = implode(
',', $sortfield_new_list);
16203 if (is_object($objcon) && $objcon->id > 0) {
16204 $sql =
"SELECT DISTINCT a.id, a.label as label,";
16206 $sql =
"SELECT a.id, a.label as label,";
16208 $sql .=
" a.datep as dp,";
16209 $sql .=
" a.note as message,";
16210 $sql .=
" a.datep2 as dp2,";
16211 $sql .=
" a.percent as percent, 'action' as type,";
16212 $sql .=
" a.fk_element, a.elementtype,";
16213 $sql .=
" a.fk_contact,";
16214 $sql .=
" a.email_from as msg_from,";
16215 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
16216 $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";
16217 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16218 $sql .=
", sp.lastname, sp.firstname";
16219 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16220 $sql .=
", m.lastname, m.firstname";
16221 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur',
'Propal',
'Expedition'))) {
16224 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16228 $sql .=
" FROM " . MAIN_DB_PREFIX .
"actioncomm as a";
16229 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"user as u on u.rowid = a.fk_user_action";
16230 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_actioncomm as c ON a.fk_action = c.id";
16232 $force_filter_contact = $filterobj instanceof
User;
16234 if (is_object($objcon) && $objcon->id > 0) {
16235 $force_filter_contact =
true;
16236 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
16237 $sql .=
" AND r.element_type = '" . $db->escape($objcon->table_element) .
"' AND r.fk_element = " . ((int) $objcon->id);
16240 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
16241 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"socpeople as sp ON a.fk_contact = sp.rowid";
16242 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
16243 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"element_resources as er";
16244 $sql .=
" ON er.resource_type = 'dolresource'";
16245 $sql .=
" AND er.element_id = a.id";
16246 $sql .=
" AND er.resource_id = " . ((int) $filterobj->id);
16247 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16248 $sql .=
", " . MAIN_DB_PREFIX .
"adherent as m";
16249 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16250 $sql .=
", " . MAIN_DB_PREFIX .
"commande_fournisseur as o";
16251 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16252 $sql .=
", " . MAIN_DB_PREFIX .
"product as o";
16253 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16254 $sql .=
", " . MAIN_DB_PREFIX .
"ticket as o";
16255 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16256 $sql .=
", " . MAIN_DB_PREFIX .
"bom_bom as o";
16257 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16258 $sql .=
", " . MAIN_DB_PREFIX .
"contrat as o";
16259 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16260 $sql .=
", " . MAIN_DB_PREFIX .
"facture as o";
16261 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16262 $sql .=
", " . MAIN_DB_PREFIX .
"facture_fourn as o";
16263 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16264 $sql .=
", " . MAIN_DB_PREFIX .
"commande as o";
16265 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16266 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as o";
16267 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16268 $sql .=
", " . MAIN_DB_PREFIX .
"propal as o";
16270 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16271 $sql .=
", " . MAIN_DB_PREFIX . $filterobj->table_element .
" as o";
16274 $sql .=
" WHERE a.entity IN (" .
getEntity(
'agenda') .
")";
16275 if (!$force_filter_contact) {
16276 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
16277 $sql .=
" AND a.fk_soc = " . ((int) $filterobj->id);
16278 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
16279 $sql .=
" AND a.fk_project = o.rowid AND a.fk_project = " . ((int) $filterobj->id);
16280 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16281 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
16282 if ($filterobj->id) {
16283 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16285 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16286 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
16287 if ($filterobj->id) {
16288 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16290 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16291 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'shipping'";
16292 if ($filterobj->id) {
16293 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16295 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16296 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'propal'";
16297 if ($filterobj->id) {
16298 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16300 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16301 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
16302 if ($filterobj->id) {
16303 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16305 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16306 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
16307 if ($filterobj->id) {
16308 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16310 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16311 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
16312 if ($filterobj->id) {
16313 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16315 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16316 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
16317 if ($filterobj->id) {
16318 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16320 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16321 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
16322 if ($filterobj->id) {
16323 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16325 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
16326 $sql .=
" AND a.fk_contact = sp.rowid";
16327 if ($filterobj->id) {
16328 $sql .=
" AND a.fk_contact = " . ((int) $filterobj->id);
16330 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16331 $sql .=
" AND a.fk_element = o.rowid";
16332 if ($filterobj->id) {
16333 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice'";
16335 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16336 $sql .=
" AND a.fk_element = o.rowid";
16337 if ($filterobj->id) {
16338 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice_supplier'";
16341 if (is_object($filterobj) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16342 $sql .=
" AND a.fk_element = o.rowid";
16343 $sql .=
" AND a.elementtype = '" . $db->escape($filterobj->element) .
"'";
16344 if ($filterobj->id) {
16345 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16350 $sql .=
" AND u.rowid = " . ((int) $filterobj->id);
16354 if (!empty($actioncode) && $actioncode !=
'-1') {
16356 if ($actioncode ==
'AC_NON_AUTO') {
16357 $sql .=
" AND c.type != 'systemauto'";
16358 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16359 $sql .=
" AND c.type = 'systemauto'";
16361 if ($actioncode ==
'AC_OTH') {
16362 $sql .=
" AND c.type != 'systemauto'";
16363 } elseif ($actioncode ==
'AC_OTH_AUTO') {
16364 $sql .=
" AND c.type = 'systemauto'";
16368 if ($actioncode ==
'AC_NON_AUTO') {
16369 $sql .=
" AND c.type != 'systemauto'";
16370 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16371 $sql .=
" AND c.type = 'systemauto'";
16373 $sql .=
" AND c.code = '" . $db->escape($actioncode) .
"'";
16377 if ($donetodo ==
'todo') {
16378 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '" . $db->idate($now) .
"'))";
16379 } elseif ($donetodo ==
'done') {
16380 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '" . $db->idate($now) .
"'))";
16382 if (is_array($filters) && $filters[
'search_agenda_label']) {
16383 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
16390 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')
16392 $langs->load(
"mails");
16394 $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";
16395 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
16396 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
16397 $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";
16398 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16399 $sql2 .=
", '' as lastname, '' as firstname";
16400 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16401 $sql2 .=
", '' as lastname, '' as firstname";
16402 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16403 $sql2 .=
", '' as ref";
16404 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16405 $sql2 .=
", '' as ref";
16406 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16407 $sql2 .=
", '' as ref";
16409 $sql2 .=
" FROM " . MAIN_DB_PREFIX .
"mailing as m, " . MAIN_DB_PREFIX .
"mailing_cibles as mc, " . MAIN_DB_PREFIX .
"user as u";
16410 $sql2 .=
" WHERE mc.email = '" . $db->escape($objcon->email) .
"'";
16411 $sql2 .=
" AND mc.statut = 1";
16412 $sql2 .=
" AND u.rowid = m.fk_user_valid";
16413 $sql2 .=
" AND mc.fk_mailing=m.rowid";
16417 $MAXWITHOUTPAGINATION =
getDolGlobalInt(
'AGENDA_MAX_EVENTS_ON_PAGE_WITHOUT_PAGINATION', 100);
16419 if ($sql || $sql2) {
16420 if (!empty($sql) && !empty($sql2)) {
16421 $sql = $sql .
" UNION " . $sql2;
16422 } elseif (empty($sql) && !empty($sql2)) {
16428 $limit = $MAXWITHOUTPAGINATION;
16431 $sql .= $db->order($sortfield_new, $sortorder);
16433 $sql .= $db->plimit($limit + 1, $offset);
16436 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
16438 $resql = $db->query($sql);
16441 $num = $db->num_rows($resql);
16443 $imaxinloop = ($limit ? min($num, $limit) : $num);
16444 while ($i < $imaxinloop) {
16445 $obj = $db->fetch_object($resql);
16447 if ($obj->type ==
'action') {
16449 $contactaction->id = $obj->id;
16450 $result = $contactaction->fetchResources();
16453 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
16459 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
16460 $tododone =
'todo';
16463 $histo[$numaction] = array(
16464 'type' => $obj->type,
16465 'tododone' => $tododone,
16467 'datestart' => $db->jdate($obj->dp),
16468 'dateend' => $db->jdate($obj->dp2),
16469 'note' => $obj->label,
16470 'message' => $obj->message,
16471 'percent' => $obj->percent,
16473 'userid' => $obj->user_id,
16474 'login' => $obj->user_login,
16475 'userfirstname' => $obj->user_firstname,
16476 'userlastname' => $obj->user_lastname,
16477 'userphoto' => $obj->user_photo,
16478 'msg_from' => $obj->msg_from,
16480 'contact_id' => $obj->fk_contact,
16481 'socpeopleassigned' => $contactaction->socpeopleassigned,
16482 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
16483 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
16484 'fk_element' => $obj->fk_element,
16485 'elementtype' => $obj->elementtype,
16487 'acode' => $obj->acode,
16488 'alabel' => $obj->alabel,
16489 'libelle' => $obj->alabel,
16490 'apicto' => $obj->apicto
16493 $histo[$numaction] = array(
16494 'type' => $obj->type,
16495 'tododone' =>
'done',
16497 'datestart' => $db->jdate($obj->dp),
16498 'dateend' => $db->jdate($obj->dp2),
16499 'note' => $obj->label,
16500 'message' => $obj->message,
16501 'percent' => $obj->percent,
16502 'acode' => $obj->acode,
16504 'userid' => $obj->user_id,
16505 'login' => $obj->user_login,
16506 'userfirstname' => $obj->user_firstname,
16507 'userlastname' => $obj->user_lastname,
16508 'userphoto' => $obj->user_photo
16524 $langs->loadLangs(array(
"admin",
"errors"));
16525 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
16529 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
16531 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16532 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
16533 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
16534 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
16539 $userstatic =
new User($db);
16540 $contactstatic =
new Contact($db);
16541 $userGetNomUrlCache = array();
16542 $contactGetNomUrlCache = array();
16544 $out .=
'<div class="filters-container" >';
16545 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
16546 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
16549 $objcon && get_class($objcon) ==
'Contact' &&
16550 (is_null($filterobj) || get_class($filterobj) ==
'Societe')
16552 $out .=
'<input type="hidden" name="id" value="' . $objcon->id .
'" />';
16554 $out .=
'<input type="hidden" name="id" value="' . $filterobj->id .
'" />';
16556 if (($filterobj && get_class($filterobj) ==
'Societe')) {
16557 $out .=
'<input type="hidden" name="socid" value="' . $filterobj->id .
'" />';
16559 $out .=
'<input type="hidden" name="userid" value="' . $filterobj->id .
'" />';
16564 $out .=
'<div class="div-table-responsive-no-min">';
16565 $out .=
'<table class="noborder borderbottom centpercent">';
16567 $out .=
'<tr class="liste_titre">';
16571 $out .=
'<th class="liste_titre width50 middle">';
16572 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16573 $out .= $searchpicto;
16578 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ') .
"\n";
16580 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">' . $langs->trans(
"Search") .
' : </strong></th>';
16582 $out .=
'<th class="liste_titre"></th>';
16585 $out .=
'<th class="liste_titre">';
16586 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="' . $langs->trans(
"ActionType") .
'"></span>';
16587 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
16590 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
16591 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="' . $filters[
'search_agenda_label'] .
'" placeholder="' . $langs->trans(
"Label") .
'">';
16596 $out .=
'<th class="liste_titre width50 middle">';
16597 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
16598 $out .= $searchpicto;
16604 $out .=
'</table>';
16611 $out .=
'<ul class="timeline">';
16615 if ($filterobj instanceof
Societe) {
16616 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16618 if ($filterobj instanceof
User) {
16619 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
16621 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
16622 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
16623 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
16625 if ($filterobj instanceof
Societe) {
16628 if ($filterobj instanceof
User) {
16634 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/cactioncomm.class.php';
16636 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
16638 $actualCycleDate =
false;
16641 foreach ($histo as $key => $value) {
16642 $actionstatic->fetch($histo[$key][
'id']);
16644 $actionstatic->type_picto = $histo[$key][
'apicto'];
16645 $actionstatic->type_code = $histo[$key][
'acode'];
16647 $labeltype = $actionstatic->type_code;
16648 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
16649 $labeltype =
'AC_OTH';
16651 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16652 $labeltype = $langs->trans(
"Message");
16654 if (!empty($arraylist[$labeltype])) {
16655 $labeltype = $arraylist[$labeltype];
16657 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
16658 $labeltype .=
' - ' . $arraylist[$actionstatic->code];
16662 $url = DOL_URL_ROOT .
'/comm/action/card.php?id=' . $histo[$key][
'id'];
16664 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
16666 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'] .
'-' . $tmpa[
'yday']) {
16667 $actualCycleDate = $tmpa[
'year'] .
'-' . $tmpa[
'yday'];
16668 $out .=
'<!-- timeline time label -->';
16669 $out .=
'<li class="time-label">';
16670 $out .=
'<span class="timeline-badge-date">';
16671 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
16674 $out .=
'<!-- /.timeline-label -->';
16678 $out .=
'<!-- timeline item -->' .
"\n";
16679 $out .=
'<li class="timeline-code-' . (!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none") .
'">';
16682 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
16687 $out .=
'<div class="timeline-item">' .
"\n";
16689 $out .=
'<span class="time timeline-header-action2">';
16691 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
16692 $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") .
' ';
16693 $out .= $histo[$key][
'id'];
16696 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle') .
' ';
16700 $user->hasRight(
'agenda',
'allactions',
'create') ||
16701 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))
16703 $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) .
'">';
16705 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
16712 $out .=
'<span class="time"><i class="fa fa-clock valignmiddle"></i> ';
16713 $out .=
'<span class="valignmiddle marginrightonly">';
16714 $out .=
dol_print_date($histo[$key][
'datestart'],
'day',
'tzuserrel');
16717 $out .=
' '.dol_print_date($histo[$key][
'datestart'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
16719 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
16720 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
16721 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
16722 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
16723 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false, 1);
16725 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'day',
'tzuserrel');
16727 $out .=
' '.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
16732 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16735 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16738 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
16741 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
16745 $out .=
img_warning($langs->trans(
"Late")) .
' ';
16747 $out .=
"</span></span>\n";
16749 $out .=
'<span class="time">';
16750 $out .= $actionstatic->getLibStatut(2);
16754 $out .=
'<h3 class="timeline-header">';
16757 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
16758 if ($histo[$key][
'userid'] > 0) {
16759 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
16760 $userstatic->fetch($histo[$key][
'userid']);
16761 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
16763 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
16764 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
16765 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
16766 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
16767 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
16769 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
16772 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
16774 $out .=
'<img class="photomemberphoto userphoto" alt="" src="/public/theme/common/user_anonymous.png">'.$langs->trans(
"Anonymous");
16779 $out .=
' <div class="messaging-title inline-block">';
16781 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
16782 $out .= $labeltype .
' - ';
16787 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16788 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
16789 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16790 $out .= $langs->trans(
'TicketNewMessage');
16791 } elseif (isset($histo[$key][
'type'])) {
16792 if ($histo[$key][
'type'] ==
'action') {
16793 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
16794 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
16795 $libelle = $histo[$key][
'note'];
16796 $actionstatic->id = $histo[$key][
'id'];
16797 if ($libelle != $labeltype) {
16800 } elseif ($histo[$key][
'type'] ==
'mailing') {
16801 $out .=
'<a href="' . DOL_URL_ROOT .
'/comm/mailing/card.php?id=' . $histo[$key][
'id'] .
'">' .
img_object($langs->trans(
"ShowEMailing"),
"email") .
' ';
16802 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
16803 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
16806 $libelle .= $histo[$key][
'note'];
16810 $out = preg_replace(
'/ - $/',
'', $out);
16812 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
16813 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
16814 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
16816 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
16817 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
16819 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
16820 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
16823 $out .=
' - ' . $link;
16833 !empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
16834 && $actionstatic->code !=
'AC_TICKET_CREATE'
16835 && $actionstatic->code !=
'AC_TICKET_MODIFY'
16837 $out .=
'<div class="timeline-body wordbreak small">';
16838 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
16845 if ($truncateLines > 0 && strlen($newmess) > strlen($truncatedText)) {
16846 $out .=
'<div class="readmore-block --closed" >';
16847 $out .=
' <div class="readmore-block__excerpt">';
16849 $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>';
16851 $out .=
' <div class="readmore-block__full-text" >';
16853 $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>';
16867 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
16869 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
16870 if (empty($conf->cache[
'contact'][$cid])) {
16872 $contact->fetch($cid);
16873 $conf->cache[
'contact'][$cid] = $contact;
16875 $contact = $conf->cache[
'contact'][$cid];
16879 $contactList .= !empty($contactList) ?
', ' :
'';
16880 $contactList .= $contact->getNomUrl(1);
16881 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
16882 if (!empty($contact->phone_pro)) {
16889 $footer .= $langs->trans(
'ActionOnContact') .
' : ' . $contactList;
16890 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
16891 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
16893 $result = $contact->fetch($histo[$key][
'contact_id']);
16894 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
16896 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
16897 $result = ($contact instanceof
Contact) ? $contact->id : 0;
16901 $footer .= $contact->getNomUrl(1);
16902 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
16903 if (!empty($contact->phone_pro)) {
16911 if (!empty($documents)) {
16912 $footer .=
'<div class="timeline-documents-container">';
16913 foreach ($documents as $doc) {
16914 $footer .=
'<span id="document_' . $doc->id .
'" class="timeline-documents" ';
16915 $footer .=
' data-id="' . $doc->id .
'" ';
16916 $footer .=
' data-path="' . $doc->filepath .
'"';
16920 $filePath = DOL_DATA_ROOT .
'/' . $doc->filepath .
'/' . $doc->filename;
16922 if (empty($doc->agenda_id)) {
16923 $dir_ref = $actionstatic->id;
16924 $modulepart =
'actions';
16926 $split_dir = explode(
'/', $doc->filepath);
16927 $modulepart = array_shift($split_dir);
16928 $dir_ref = implode(
'/', $split_dir);
16931 $file = $dir_ref .
'/' . $doc->filename;
16932 $thumb = $dir_ref .
'/thumbs/' . substr($doc->filename, 0, strrpos($doc->filename,
'.')) .
'_mini' . substr($doc->filename, strrpos($doc->filename,
'.'));
16933 $doclink =
dol_buildpath(
'document.php', 1) .
'?modulepart=' . $modulepart .
'&attachment=0&file=' . urlencode($file) .
'&entity=' . $conf->entity;
16934 $viewlink =
dol_buildpath(
'viewimage.php', 1) .
'?modulepart=' . $modulepart .
'&file=' . urlencode($thumb) .
'&entity=' . $conf->entity;
16938 $mimeAttr =
' mime="' . $mime .
'" ';
16940 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
16941 $class .=
' documentpreview';
16944 $footer .=
'<a href="' . $doclink .
'" class="btn-link ' . $class .
'" target="_blank" rel="noopener noreferrer" ' . $mimeAttr .
' >';
16945 $footer .=
img_mime($filePath) .
' ' . $doc->filename;
16948 $footer .=
'</span>';
16950 $footer .=
'</div>';
16953 if (!empty($footer)) {
16954 $out .=
'<div class="timeline-footer">' . $footer .
'</div>';
16957 $out .=
'</div>' .
"\n";
16960 $out .=
'<!-- END timeline item -->';
16967 jQuery(document).ready(function () {
16968 $(document).on("click", "[data-read-more-action]", function(e){
16969 console.log("We click on data-read-more-action");
16970 let readMoreBloc = $(this).closest(".readmore-block");
16971 if(readMoreBloc.length > 0){
16972 e.preventDefault();
16973 if($(this).attr("data-read-more-action") == "close"){
16974 readMoreBloc.addClass("--closed").removeClass("--open");
16975 $("html, body").animate({
16976 scrollTop: readMoreBloc.offset().top - 200
16979 readMoreBloc.addClass("--open").removeClass("--closed");
16987 if (empty($histo)) {
16988 $out .=
'<span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span>';
16991 if ($num > $MAXWITHOUTPAGINATION) {
16992 $langs->load(
"errors");
16994 $out .=
'<center><span class="opacitymedium">...' . $langs->trans(
"WarningTooManyDataPleaseUseMoreFilters", $MAXWITHOUTPAGINATION) .
'...</span></center>';
17017function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
17019 if ($timestamp ===
null) {
17020 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
17027 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
17028 $TParam = array_merge($TParam, array(
17035 return '&' . http_build_query($TParam);
17056function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
17058 global $conf, $db, $langs, $hookmanager;
17061 if (!is_object($langs)) {
17062 include_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
17064 $langs->setDefaultLang();
17067 $langs->load(
"errors");
17069 if ($printheader) {
17070 if (function_exists(
"llxHeader")) {
17072 } elseif (function_exists(
"llxHeaderVierge")) {
17077 print
'<div class="error">';
17078 if (empty($message)) {
17079 print $langs->trans(
"ErrorRecordNotFound");
17081 print $langs->trans($message);
17086 if (empty($showonlymessage)) {
17087 if (empty($hookmanager)) {
17088 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
17091 $hookmanager->initHooks(array(
'main'));
17094 $parameters = array(
'message' => $message,
'params' => $params);
17095 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
17096 print $hookmanager->resPrint;
17099 if ($printfooter && function_exists(
"llxFooter")) {
17101 if (is_object($db)) {
17140 foreach ($array2 as $key => $value) {
17141 if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
17144 $merged[$key] = $value;
17159 if (!empty($obj->socid)) {
17160 return (
int) $obj->socid;
17161 } elseif (!empty($obj->soc_id)) {
17162 return (
int) $obj->soc_id;
17163 } elseif (!empty($obj->societe_id)) {
17164 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).
dolCloseUnclosedHtmlTags($text)
Close the HTML tags left open in a truncated HTML string.
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.