56if (!function_exists(
'utf8_encode')) {
64 function utf8_encode($elements)
66 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
70if (!function_exists(
'utf8_decode')) {
78 function utf8_decode($elements)
80 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
83if (!function_exists(
'str_starts_with')) {
92 function str_starts_with($haystack, $needle)
94 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
97if (!function_exists(
'str_ends_with')) {
106 function str_ends_with($haystack, $needle)
108 return $needle !==
'' && substr($haystack, -strlen($needle)) === (
string) $needle;
111if (!function_exists(
'str_contains')) {
120 function str_contains($haystack, $needle)
122 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
137 return json_encode($data);
140 return var_export($data,
true);
160 if (!is_object(
$object) && empty($module)) {
163 if (empty($module) && !empty(
$object->element)) {
170 $module =
'ficheinter';
172 case 'invoice_supplier':
173 $module =
'supplier_invoice';
175 case 'order_supplier':
176 $module =
'supplier_order';
178 case 'recruitmentjobposition':
179 $module =
'recruitment';
180 $subdirectory =
'/recruitmentjobposition';
182 case 'recruitmentcandidature':
183 $module =
'recruitment';
184 $subdirectory =
'/recruitmentcandidature';
186 case 'knowledgerecord':
187 $module =
'knowledgemanagement';
188 $subdirectory =
'/knowledgerecord';
190 case 'commande_fournisseur':
191 $module =
'fournisseur';
192 $subdirectory =
'/commande';
197 $module =
'expedition';
198 $subdirectory =
'/sending';
213 $subdirectory =
'/'.$object->project->ref;
225 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
226 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_output')) {
228 if ($mode !=
'outputrel') {
232 if (!isset(
$conf->$module->multidir_output[$entity])) {
233 return 'error-diroutput-not-defined-for-this-entity-and-object='.$module;
235 $s =
$conf->$module->multidir_output[$entity] . $subdirectory;
237 if ($forobject &&
$object->id > 0) {
241 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_output')) {
243 if ($mode !=
'outputrel') {
244 $s =
$conf->$module->dir_output . $subdirectory;
246 if ($forobject &&
$object->id > 0) {
251 return 'error-diroutput-not-defined-for-this-entity-and-object='.$module;
253 } elseif ($mode ==
'temp') {
254 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_temp')) {
257 if (!isset(
$conf->$module->multidir_temp[$entity])) {
258 return 'error-dirtemp-not-defined-for-this-entity-and-object='.$module;
261 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_temp')) {
264 return 'error-dirtemp-not-defined-for-this-entity-and-object='.$module;
267 return 'error-bad-value-for-mode';
311 return (
string) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
321 global $dolibarr_login_badcharunauthorized;
323 if (isset($dolibarr_login_badcharunauthorized)) {
324 if ($dolibarr_login_badcharunauthorized ===
'MAIN_LOGIN_BADCHARUNAUTHORIZED') {
328 return (
string) $dolibarr_login_badcharunauthorized;
346 return (
int) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
361 return (
float) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
375 return (
bool) (
$conf->global->$key ?? $default);
386 return (
string)
$conf->currency;
397 return (
string)
$conf->dol_optimize_smallscreen;
408 return (
int)
$conf->entity;
419 return $conf->db->type;
430 return str_replace(
'_',
'', basename(dirname($s)).basename($s,
'.php'));
444 if (empty($tmpuser)) {
449 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
462 if (empty($tmpuser)) {
467 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
483 'adherent' =>
'member',
484 'member_type' =>
'adherent_type',
486 'contrat' =>
'contract',
487 'entrepot' =>
'stock',
488 'projet' =>
'project',
489 'categorie' =>
'category',
490 'commande' =>
'order',
491 'expedition' =>
'shipping',
492 'facture' =>
'invoice',
493 'fichinter' =>
'intervention',
494 'ficheinter' =>
'intervention',
495 'propale' =>
'propal',
496 'societe' =>
'thirdparty',
497 'socpeople' =>
'contact',
498 'fournisseur' =>
'supplier',
500 'actioncomm' =>
'agenda',
501 'product_price' =>
'productprice',
502 'product_fournisseur_price' =>
'productsupplierprice',
522 $arrayconv[
'supplier_order'] =
'fournisseur';
523 $arrayconv[
'supplier_invoice'] =
'fournisseur';
526 $module_alt = $module;
527 if (!empty($arrayconv[$module])) {
528 $module_alt = $arrayconv[$module];
530 $module_bis = $module;
531 if (!empty($arrayconvbis[$module])) {
532 $module_bis = $arrayconvbis[$module];
535 return !empty(
$conf->modules[$module]) || !empty(
$conf->modules[$module_alt]) || !empty(
$conf->modules[$module_bis]);
553 $moduletomoduletouse = array(
554 'invoice' =>
'facture',
556 $moduleParmsMapping = array(
557 'product' =>
'produit',
560 if (!empty($moduletomoduletouse[$module])) {
561 $module = $moduletomoduletouse[$module];
564 $warningDelayPath = $parmlevel1;
565 if (!empty($moduleParmsMapping[$warningDelayPath])) {
566 $warningDelayPath = $moduleParmsMapping[$warningDelayPath];
570 if (!empty(
$conf->$module) && !empty(
$conf->$module->$warningDelayPath) && !empty(
$conf->$module->$warningDelayPath->$parmlevel2) && !empty(
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay)) {
571 return (
int)
$conf->$module->$warningDelayPath->$parmlevel2->warning_delay;
574 if (!empty(
$conf->$module) && !empty(
$conf->$module->$warningDelayPath) && !empty(
$conf->$module->$warningDelayPath->warning_delay)) {
575 return (
int)
$conf->$module->$warningDelayPath->warning_delay;
590 if ($timestamp ===
'') {
591 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page ' . $_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_DEBUG);
594 if (is_null($timestamp) || !is_numeric($timestamp)) {
614 require_once DOL_DOCUMENT_ROOT .
"/core/db/" . $type .
'.class.php';
616 $class =
'DoliDB' . ucfirst($type);
617 $db =
new $class($type, $host, $user, $pass, $name, $port);
638function getEntity($element, $shared = 1, $currentobject =
null)
642 if (!is_object($hookmanager)) {
643 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
650 $element =
'project';
653 $element =
'contract';
655 case 'order_supplier':
656 $element =
'supplier_order';
658 case 'invoice_supplier':
659 $element =
'supplier_invoice';
663 if (is_object($mc)) {
664 $out = $mc->getEntity($element, $shared, $currentobject);
667 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
669 $addzero[] =
'c_holiday_types';
671 if (in_array($element, $addzero)) {
674 $out .= ((int)
$conf->entity);
679 'element' => $element,
682 'currentobject' => $currentobject,
686 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
688 if (is_numeric($reshook)) {
689 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
690 $out .=
',' . $hookmanager->resPrint;
691 } elseif ($reshook == 1) {
692 $out = $hookmanager->resPrint;
709 if (is_object($mc) && method_exists($mc,
'setEntity')) {
710 return $mc->setEntity($currentobject);
712 return ((is_object($currentobject) && $currentobject->id > 0 && ((
int) $currentobject->entity) > 0) ? (
int) $currentobject->entity :
$conf->entity);
724 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
737 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
738 $r = chr($n % 26 + 0x41) . $r;
762 include_once DOL_DOCUMENT_ROOT .
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
769 $user_agent = substr($user_agent, 0, 512);
772 $detectmobile =
new Mobile_Detect(
null, $user_agent);
773 $tablet = $detectmobile->isTablet();
775 if ($detectmobile->isMobile()) {
779 if ($detectmobile->is(
'AndroidOS')) {
780 $os = $phone =
'android';
781 } elseif ($detectmobile->is(
'BlackBerryOS')) {
782 $os = $phone =
'blackberry';
783 } elseif ($detectmobile->is(
'iOS')) {
786 } elseif ($detectmobile->is(
'PalmOS')) {
787 $os = $phone =
'palm';
788 } elseif ($detectmobile->is(
'SymbianOS')) {
790 } elseif ($detectmobile->is(
'webOS')) {
792 } elseif ($detectmobile->is(
'MaemoOS')) {
794 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
800 if (preg_match(
'/linux/i', $user_agent)) {
802 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
804 } elseif (preg_match(
'/windows/i', $user_agent)) {
810 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
812 $version = empty($reg[2]) ?
'' : $reg[2];
813 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
815 $version = empty($reg[2]) ?
'' : $reg[2];
816 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
818 $version = empty($reg[2]) ?
'' : $reg[2];
819 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
822 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
824 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
826 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
828 $version = empty($reg[2]) ?
'' : $reg[2];
829 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
832 $version = empty($reg[2]) ?
'' : $reg[2];
833 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
835 $version = end($reg);
836 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
839 $version = end($reg);
840 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
842 $name =
'textbrowser';
843 $version = empty($reg[3]) ?
'' : $reg[3];
844 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
846 $name =
'textbrowser';
847 $version = empty($reg[1]) ?
'' : $reg[1];
859 'browsername' => $name,
860 'browserversion' => $version,
862 'browserua' => $user_agent,
877 $disconnectdone =
false;
879 if (is_object(
$db) && !empty(
$db->connected)) {
880 $depth =
$db->transaction_opened;
881 $disconnectdone =
$db->close();
883 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));
899 $relativepathstring = $_SERVER[
"PHP_SELF"];
901 if (constant(
'DOL_URL_ROOT')) {
902 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
904 $relativepathstring = ltrim($relativepathstring,
'/');
905 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
909 if (!empty($_GET[
'restore_lastsearch_values'])) {
910 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
911 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
912 if (is_array($tmp)) {
913 foreach ($tmp as $key => $val) {
914 if ($key == $paramname) {
922 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
924 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
926 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
928 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
932 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
949 if (empty($method)) {
950 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
951 } elseif ($method == 1) {
952 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
953 } elseif ($method == 2) {
954 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
955 } elseif ($method == 3) {
956 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
958 $val =
'BadFirstParameterForGETPOST';
961 return is_array($val);
975function GETPOSTINT($paramname, $method = 0, $nodefault = 0)
977 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0, $nodefault);
993function GETPOSTFLOAT($paramname, $rounding =
'', $option = 2)
1014function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto', $saverestore =
'')
1017 if ($hourTime ===
'getpost' || $hourTime ===
'getpostend') {
1021 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
1022 $hour = intval($m[1]);
1023 $minute = intval($m[2]);
1024 $second = intval($m[3]);
1025 } elseif ($hourTime ===
'end') {
1030 $hour = $minute = $second = 0;
1038 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_day'])
1039 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_month'])
1040 && isset($_SESSION[
'DOLDATE_' . $saverestore .
'_year'])
1042 $day = $_SESSION[
'DOLDATE_' . $saverestore .
'_day'];
1043 $month = $_SESSION[
'DOLDATE_' . $saverestore .
'_month'];
1044 $year = $_SESSION[
'DOLDATE_' . $saverestore .
'_year'];
1052 $hour = (int) min($hour, 23);
1053 $minute = (int) min($minute, 59);
1054 $second = (int) min($second, 59);
1057 $_SESSION[
'DOLDATE_' . $saverestore .
'_day'] = $day;
1058 $_SESSION[
'DOLDATE_' . $saverestore .
'_month'] = $month;
1059 $_SESSION[
'DOLDATE_' . $saverestore .
'_year'] = $year;
1063 return dol_mktime($hour, $minute, $second, $month, $day, $year, $gm);
1107function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0, $nodefault = 0)
1111 if (empty($paramname)) {
1112 return 'BadFirstParameterForGETPOST';
1114 if (empty($check)) {
1115 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);
1119 if (in_array($paramname, array(
'sortfield',
'sortorder'))) {
1120 $check =
'aZ09comma';
1123 if (empty($method)) {
1124 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
1125 } elseif ($method == 1) {
1126 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
1127 } elseif ($method == 2) {
1128 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
1129 } elseif ($method == 3) {
1130 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
1132 return 'BadThirdParameterForGETPOST';
1135 $relativepathstring =
'';
1137 if (empty($method) || $method == 3 || $method == 4) {
1138 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
1140 if (constant(
'DOL_URL_ROOT')) {
1141 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
1143 $relativepathstring = ltrim($relativepathstring,
'/');
1144 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
1148 if (!empty($_GET[
'restore_lastsearch_values'])) {
1149 if (!empty($_SESSION[
'lastsearch_values_' . $relativepathstring])) {
1150 $tmp = json_decode($_SESSION[
'lastsearch_values_' . $relativepathstring],
true);
1151 if (is_array($tmp)) {
1152 foreach ($tmp as $key => $val) {
1153 if ($key == $paramname) {
1161 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_' . $relativepathstring])) {
1162 $out = $_SESSION[
'lastsearch_contextpage_' . $relativepathstring];
1163 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_' . $relativepathstring])) {
1164 $out = $_SESSION[
'lastsearch_limit_' . $relativepathstring];
1165 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_' . $relativepathstring])) {
1166 $out = $_SESSION[
'lastsearch_page_' . $relativepathstring];
1167 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_' . $relativepathstring])) {
1168 $out = $_SESSION[
'lastsearch_mode_' . $relativepathstring];
1170 } elseif (!isset($_GET[
'sortfield'])) {
1173 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1176 '@phan-var-force CommonObject $object';
1177 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
1179 $out =
$object->fields[$paramname][
'default'];
1183 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
1185 if (!empty($user->default_values)) {
1186 if (isset($user->default_values[$relativepathstring][
'createform'])) {
1187 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
1189 if ($defkey !=
'_noquery_') {
1190 $tmpqueryarraytohave = explode(
'&', $defkey);
1193 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1194 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1206 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
1207 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
1214 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname]) && empty($nodefault)) {
1216 if (!empty($user->default_values)) {
1219 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
1221 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
1223 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
1225 if ($defkey !=
'_noquery_') {
1226 $tmpqueryarraytohave = explode(
'&', $defkey);
1229 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1230 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1242 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1243 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
1247 if ($paramname ==
'sortfield') {
1250 if ($paramname ==
'sortorder') {
1258 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
1259 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
1260 if (!empty($_GET[
'disabledefaultvalues'])) {
1264 if ($defkey !=
'_noquery_') {
1265 $tmpqueryarraytohave = explode(
'&', $defkey);
1268 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
1269 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
1280 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
1282 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
1285 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1286 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1289 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
1290 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1305 '@phan-var-force string $paramname';
1306 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1307 if (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out)) {
1308 $substitutionarray = getCommonSubstitutionArray($langs, 0,
null, $user, array(
'mycompany',
'date',
'system',
'user'));
1316 if (preg_match(
'/^array/', $check)) {
1317 $tmpcheck =
'alphanohtml';
1318 if ($out ===
null || $out ===
'') {
1320 } elseif (!is_array($out)) {
1321 $out = explode(
',', $out);
1323 $tmparray = explode(
':', $check);
1324 if (!empty($tmparray[1])) {
1325 $tmpcheck = $tmparray[1];
1328 foreach ($out as $outkey => $outval) {
1329 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1334 if (strpos($paramname,
'search_') === 0) {
1335 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1339 $out =
sanitizeVal($out, $check, $filter, $options);
1347 if (preg_match(
'/^backto/i', $paramname) || preg_match(
'/^urlfrom/i', $paramname)) {
1348 $out = str_replace(
'\\',
'/', $out);
1349 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1351 $oldstringtoclean = $out;
1352 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1353 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1354 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1355 }
while ($oldstringtoclean != $out);
1360 if (empty($method) || $method == 3 || $method == 4) {
1361 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1368 if ($out !=
'' && isset($user)) {
1369 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1374 if ($paramname ==
'hashp' && $out ==
'shared') {
1390function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1394 if ($out ===
null) {
1402 if (!is_numeric($out)) {
1407 if (is_array($out)) {
1408 $out = implode(
',', $out);
1410 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1415 dol_syslog(
"Use of parameter value 'san_alpha' in GETPOST is deprecated. Use 'alphanohtml', 'aZ09comma', ...", LOG_WARNING);
1416 $out = filter_var($out, FILTER_SANITIZE_STRING);
1419 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1423 $out = preg_replace(
'/[^:\/\[\]a-z0-9@\$\'\*\~\.\-_,;\?\!=%&+#]+/i',
'', $out);
1427 if (!is_array($out)) {
1429 if (preg_match(
'/[^a-z]+/i', $out)) {
1435 if (!is_array($out)) {
1437 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1443 if (!is_array($out)) {
1445 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1451 if (!is_array($out)) {
1453 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
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);
1479 case 'alphawithlgt':
1480 if (!is_array($out)) {
1483 $oldstringtoclean = $out;
1487 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1494 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1495 }
while ($oldstringtoclean != $out);
1501 case 'restricthtmlnolink':
1502 case 'restricthtml':
1503 case 'restricthtmlallowclass':
1504 case 'restricthtmlallowiframe':
1505 case 'restricthtmlallowlinkscript':
1506 case 'restricthtmlallowunvalid':
1511 if (empty($filter)) {
1512 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1514 if (is_null($options)) {
1517 $out = filter_var($out, $filter, $options);
1521 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1522 $out =
GETPOST($out,
'alphanohtml');
1537function dolSetCookie(
string $cookiename,
string $cookievalue,
int $expire = -1)
1539 include_once DOL_DOCUMENT_ROOT.
'/blockedlog/lib/securitycore.lib.php';
1541 global $dolibarr_main_force_https;
1543 if ($expire == -1) {
1544 $expire = (time() + (86400 * 354));
1547 if (PHP_VERSION_ID < 70300) {
1548 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, empty($cookievalue) ? 0 : $expire,
'/',
'', !(empty($dolibarr_main_force_https) &&
isHTTPS() === false), true);
1551 $cookieparams = array(
1552 'expires' => empty($cookievalue) ? 0 : $expire,
1555 'secure' => !(empty($dolibarr_main_force_https) &&
isHTTPS() === false),
1559 setcookie($cookiename, empty($cookievalue) ?
'' : $cookievalue, $cookieparams);
1561 if (empty($cookievalue)) {
1562 unset($_COOKIE[$cookiename]);
1566if (!function_exists(
'dol_getprefix')) {
1577 function dol_getprefix($mode =
'')
1580 if ($mode ==
'email') {
1586 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1587 return $_SERVER[
"SERVER_NAME"];
1592 if (!empty(
$conf->file->instance_unique_id)) {
1593 return sha1(
'dolibarr' .
$conf->file->instance_unique_id);
1597 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1601 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1602 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1605 if (!empty($tmp_instance_unique_id)) {
1606 return sha1(
'dolibarr' . $tmp_instance_unique_id);
1610 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1611 return sha1($_SERVER[
"SERVER_NAME"] . $_SERVER[
"DOCUMENT_ROOT"] . DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1613 return sha1(DOL_DOCUMENT_ROOT . DOL_URL_ROOT);
1632 if (strpos($relpath,
'..') !==
false) {
1634 dol_syslog(
'functions::dol_include_once Tried to load a file with a path including a forbidden sequence ".." : ' . $relpath, LOG_WARNING);
1637 if (!preg_match(
'/\.php$/', $relpath)) {
1639 dol_syslog(
'functions::dol_include_once Tried to load a file that is not a PHP file : ' . $relpath, LOG_WARNING);
1645 if (!file_exists($fullpath)) {
1646 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: ' . $relpath, LOG_WARNING);
1649 if (!empty($classname) && !class_exists($classname)) {
1650 return include $fullpath;
1652 return include_once $fullpath;
1670function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1674 $path = preg_replace(
'/^\//',
'', $path);
1677 $res = DOL_DOCUMENT_ROOT .
'/' . $path;
1678 if (is_array(
$conf->file->dol_document_root)) {
1679 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1680 if ($key ==
'main') {
1684 if (@file_exists($dirroot .
'/' . $path)) {
1685 if ($key !=
'main' && preg_match(
'/^core\//', $path)) {
1688 $res = $dirroot .
'/' . $path;
1693 if ($returnemptyifnotfound) {
1695 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1707 $res = DOL_URL_ROOT .
'/' . $path;
1710 $res = DOL_MAIN_URL_ROOT .
'/' . $path;
1713 $res = DOL_URL_ROOT .
'/' . $path;
1716 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1717 if ($key ==
'main') {
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) .
'/' . $path;
1731 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1732 if (!empty($regs[1])) {
1735 if (@file_exists($dirroot .
'/' . $regs[1])) {
1737 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1738 } elseif ($type == 2) {
1739 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1740 } elseif ($type == 3) {
1744 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1745 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
1748 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot) .
$conf->file->dol_url_root[$key] .
'/' . $path;
1768function dolBuildUrl($url, $params = [], $addtoken =
false, $anchor =
'')
1770 global
$db, $hookmanager;
1772 if (!is_object($hookmanager)) {
1773 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
1776 if ((!isset($params[
'mainmenu']) || empty($params[
'mainmenu'])) &&
GETPOSTISSET(
'mainmenu')) {
1777 $params = array_merge($params, [
'mainmenu' => (
GETPOST(
'mainmenu',
'restricthtml'))]);
1779 if ((!isset($params[
'leftmenu'])) &&
GETPOSTISSET(
'leftmenu')) {
1780 $params = array_merge($params, [
'leftmenu' => (
GETPOST(
'leftmenu',
'restricthtml'))]);
1784 'params' => &$params,
1785 'addtoken' => &$addtoken,
1787 $hookmanager->executeHooks(
'buildurl', $parameters);
1789 $params = array_merge($params, [
'token' =>
newToken()]);
1792 $url .=
'?' . http_build_query($params);
1795 $url .=
'#' . preg_replace(
'/[^a-z]/i',
'', $anchor);
1814 if (empty($properties)) {
1815 return get_object_vars($obj);
1818 $existingProperties = [];
1819 $realProperties = get_object_vars($obj);
1822 foreach ($properties as $property) {
1823 if (array_key_exists($property, $realProperties)) {
1825 $existingProperties[$property] = $obj->{$property};
1826 } elseif (property_exists($obj, $property)) {
1828 $existingProperties[$property] = $obj->{$property};
1832 return $existingProperties;
1853function dol_clone($srcobject, $native = 2)
1857 dol_syslog(
"Warning, call to dol_clone() with the deprecated parameter native=0, use 2 instead", LOG_WARNING);
1860 if (isset($srcobject->db) && isset($srcobject->db->db) && is_object($srcobject->db->db) && get_class($srcobject->db->db) ==
'PgSql\Connection') {
1861 $tmpsavdb = $srcobject->db;
1862 unset($srcobject->db);
1865 $myclone = unserialize(serialize($srcobject));
1867 if (!empty($tmpsavdb)) {
1868 $srcobject->db = $tmpsavdb;
1870 } elseif ($native == 2) {
1873 $tmparray = get_object_vars($srcobject);
1875 if (is_array($tmparray)) {
1876 foreach ($tmparray as $propertykey => $propertyval) {
1877 if (is_scalar($propertyval) || is_array($propertyval)) {
1878 $myclone->$propertykey = $propertyval;
1883 $myclone = clone $srcobject;
1900 if (is_object($srcobject)) {
1901 $srcobject = get_object_vars($srcobject);
1904 if (is_array($srcobject)) {
1906 foreach ($srcobject as $key => $value) {
1907 if (in_array($key, array(
'db',
'fields',
'error',
'errorhidden',
'errors',
'oldcopy',
'linkedObjects',
'linked_objects'))) {
1928function dol_size($size, $type =
'')
1931 if (empty(
$conf->dol_optimize_smallscreen)) {
1934 if ($type ==
'width' && $size > 250) {
1955function dol_sanitizeFileName($str, $newstr =
'_', $unaccent = 1, $includequotes = 0, $allowdash = 0)
1963 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1964 if ($includequotes) {
1965 $filesystem_forbidden_chars[] =
"'";
1968 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1969 if (empty($allowdash)) {
1970 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1971 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1973 $tmp = str_replace(
'..',
'', $tmp);
1974 $tmp = str_replace(
'~', $newstr, $tmp);
1975 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
2002 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
2009 $tmp = preg_replace(
'/\-\-+/', $newstr, $tmp);
2010 if (empty($allowdash)) {
2011 $tmp = preg_replace(
'/\s+\-([^\s])/',
' '.$newstr.
'$1', $tmp);
2012 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
2014 $tmp = str_replace(
'..', $newstr, $tmp);
2015 $tmp = str_replace(
'~', $newstr, $tmp);
2016 $tmp = preg_replace(
'/\s{2,}/',
' ', $tmp);
2032 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
2034 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
2036 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
2040 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
2044 $oldstringtoclean = $stringtoclean;
2047 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
2048 }
while ($oldstringtoclean != $stringtoclean);
2052 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
2055 return $stringtoclean;
2067 $oldstringtoclean = $stringtoclean;
2068 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
2069 }
while ($oldstringtoclean != $stringtoclean);
2071 return $stringtoclean;
2084 return preg_replace(
'/[^\w]+/',
'', $str);
2098 if (is_null($str)) {
2103 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
2104 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
2105 return $transliterator->transliterate($str);
2108 $string = rawurlencode($str);
2109 $replacements = array(
2110 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
2112 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
2113 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
2115 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
'%C5%90' =>
'O',
2117 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
'%C5%B0' =>
'U',
2118 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
2119 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
2121 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
2122 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
2124 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
'%C5%91' =>
'o',
2126 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
'%C5%B1' =>
'u',
2127 '%C3%BD' =>
'y',
'%C3%BF' =>
'y',
2148 $string = strtr($string, $replacements);
2149 return rawurldecode($string);
2154 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
2155 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
2156 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
2157 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
2158 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
2159 \xF9\xFA\xFB\xFC\xFD\xFF",
2167 $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"));
2185function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
2187 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
2188 if (empty($keepspaces)) {
2189 $forbidden_chars_to_replace[] =
" ";
2191 $forbidden_chars_to_remove = array();
2194 if (is_array($badcharstoreplace)) {
2195 $forbidden_chars_to_replace = $badcharstoreplace;
2197 if (is_array($badcharstoremove)) {
2198 $forbidden_chars_to_remove = $badcharstoremove;
2202 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
2221 if ($removetabcrlf) {
2222 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
2224 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
2239 if (function_exists(
'iconv')) {
2240 $slug = iconv(
'UTF-8',
'ASCII//TRANSLIT//IGNORE', $slug);
2244 $slug = strtolower($slug);
2247 $slug = preg_replace(
'/[^a-z0-9]+/',
'-', $slug);
2250 $slug = trim($slug,
'-');
2263function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
2265 if (is_null($stringtoescape)) {
2270 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
2272 if (empty($noescapebackslashn)) {
2273 $substitjs[
"\n"] =
'\\n';
2274 $substitjs[
'\\'] =
'\\\\';
2277 $substitjs[
"'"] =
"\\'";
2278 $substitjs[
'"'] =
"\\'";
2279 } elseif ($mode == 1) {
2280 $substitjs[
"'"] =
"\\'";
2281 } elseif ($mode == 2) {
2282 $substitjs[
'"'] =
'\\"';
2283 } elseif ($mode == 3) {
2284 $substitjs[
"'"] =
"\\'";
2285 $substitjs[
'"'] =
"\\\"";
2287 return strtr((
string) $stringtoescape, $substitjs);
2301 return rawurlencode($stringtoescape);
2312 return str_replace(
'"',
'\"', $stringtoescape);
2324 if (is_null($stringtoescape)) {
2328 if ($stringforquotes == 2) {
2329 return str_replace(
'"',
"'", $stringtoescape);
2330 } elseif ($stringforquotes == 1) {
2336 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
2337 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
2340 return 'Bad parameter for stringforquotes in dol_escape_php';
2351 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
2362 return $stringtoescape;
2403function dolPrintHTML($s, $allowiframe = 0, $moreallowedtags = array())
2412 $allowedtags =
'common';
2413 if (!empty($moreallowedtags)) {
2414 $allowedtags .=
','.implode(
',', $moreallowedtags);
2416 return dol_escape_htmltag(
dol_htmlwithnojs(
dol_string_onlythesehtmltags($stringWithEntitesForSpecialChar, 1, 1, 1, $allowiframe, $allowedtags)), 1, 1, $allowedtags, 0, 1);
2431 $allowedtags = array(
'br',
'b',
'font',
'hr',
'span');
2432 if (!empty($allowothertags) && is_array($allowothertags)) {
2433 $allowedtags = array_merge($allowedtags, $allowothertags);
2437 if ($escapeonlyhtmltags) {
2438 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 0, 0, 0, $allowedtags), 1, -1,
'', 1, 1);
2440 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, $allowedtags), 1, -1,
'', 0, 1);
2456 $escapeonlyhtmltags = 1;
2457 return dol_escape_htmltag(
dol_string_onlythesehtmltags($s, 1, 1, 1, 0, array()), 0, 0,
'', $escapeonlyhtmltags, 1);
2482 return htmlspecialchars($s, ENT_HTML5,
'UTF-8');
2502function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2505 if (preg_match(
'/^common([a-z,]*)/', $noescapetags, $reg)) {
2506 $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';
2508 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2509 if (!empty($reg[1])) {
2510 $noescapetags .= $reg[1];
2513 if ($cleanalsojavascript) {
2518 if ($escapeonlyhtmltags) {
2519 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2526 $tmp = (
string) $stringtoescape;
2529 $tmp = str_ireplace(
'<',
'__DONOTDECODELT', $tmp);
2530 $tmp = str_ireplace(
'>',
'__DONOTDECODEGT', $tmp);
2531 $tmp = str_ireplace(
'&',
'__DONOTDECODEAMP', $tmp);
2532 $tmp = str_ireplace(
'"',
'__DONOTDECODEQUOT', $tmp);
2533 $tmp = str_ireplace(
'&apos',
'__DONOTDECODEAPOS', $tmp);
2534 $tmp = str_ireplace(
''',
'__DONOTDECODE39', $tmp);
2536 $tmp = html_entity_decode((
string) $tmp, ENT_COMPAT,
'UTF-8');
2539 $tmp = str_ireplace(
'__DONOTDECODELT',
'<', $tmp);
2540 $tmp = str_ireplace(
'__DONOTDECODEGT',
'>', $tmp);
2541 $tmp = str_ireplace(
'__DONOTDECODEAMP',
'&', $tmp);
2542 $tmp = str_ireplace(
'__DONOTDECODEQUOT',
'"', $tmp);
2543 $tmp = str_ireplace(
'__DONOTDECODEAPOS',
'&apos', $tmp);
2544 $tmp = str_ireplace(
'__DONOTDECODE39',
''', $tmp);
2546 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE__', $tmp);
2549 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2552 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2553 } elseif ($keepn == -1) {
2554 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2557 if ($escapeonlyhtmltags) {
2558 $tmp = htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2562 $tmparrayoftags = array();
2563 if ($noescapetags) {
2564 $tmparrayoftags = explode(
',', $noescapetags);
2567 if (count($tmparrayoftags)) {
2572 $tmp = str_ireplace(array(
'__DOUBLEQUOTE',
'__BEGINTAGTOREPLACE',
'__ENDTAGTOREPLACE',
'__BEGINENDTAGTOREPLACE'),
'', $tmp);
2574 foreach ($tmparrayoftags as $tagtoreplace) {
2576 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
'>/',
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2577 $tmp = str_ireplace(
'</' . $tagtoreplace .
'>',
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2578 $tmp = preg_replace(
'/<' . preg_quote($tagtoreplace,
'/') .
' \/>/',
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__', $tmp);
2584 $tmp = preg_replace_callback(
2585 '/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)>/',
2590 static function ($reg) use ($tagtoreplace) {
2592 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2593 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE__', $tmpattributes);
2594 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2596 return '__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__';
2602 $tmp = str_ireplace(
'&',
'__ANDNOSEMICOLON__', $tmp);
2603 $tmp = str_ireplace(
'"',
'__DOUBLEQUOTENOSEMICOLON__', $tmp);
2604 $tmp = str_ireplace(
'<',
'__LESSTHAN__', $tmp);
2605 $tmp = str_ireplace(
'>',
'__GREATERTHAN__', $tmp);
2609 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2613 if (count($tmparrayoftags)) {
2615 foreach ($tmparrayoftags as $tagtoreplace) {
2616 $result = str_ireplace(
'__BEGINTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
'>', $result);
2617 $result = preg_replace(
'/__BEGINTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1>', $result);
2618 $result = str_ireplace(
'__ENDTAGTOREPLACE' . $tagtoreplace .
'__',
'</' . $tagtoreplace .
'>', $result);
2619 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'__',
'<' . $tagtoreplace .
' />', $result);
2620 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE' . $tagtoreplace .
'\[([^\]]*)\]__/',
'<' . $tagtoreplace .
' \1 />', $result);
2623 $result = str_ireplace(
'__DOUBLEQUOTE__',
'"', $result);
2625 $result = str_ireplace(
'__ANDNOSEMICOLON__',
'&', $result);
2626 $result = str_ireplace(
'__DOUBLEQUOTENOSEMICOLON__',
'"', $result);
2627 $result = str_ireplace(
'__LESSTHAN__',
'<', $result);
2628 $result = str_ireplace(
'__GREATERTHAN__',
'>', $result);
2631 $result = str_ireplace(
'__SIMPLEQUOTE__',
''', $result);
2648 if (function_exists(
'mb_strtolower')) {
2649 return mb_strtolower($string, $encoding);
2651 return strtolower($string);
2665 if (function_exists(
'mb_strtoupper')) {
2666 return mb_strtoupper($string, $encoding);
2668 return strtoupper($string);
2682 if (function_exists(
'mb_substr')) {
2683 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding) . mb_substr($string, 1,
null, $encoding);
2685 return ucfirst($string);
2699 if (function_exists(
'mb_convert_case')) {
2700 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2702 return ucwords($string);
2714 $backtrace = debug_backtrace();
2716 if (count($backtrace) >= 1) {
2718 if (count($backtrace) == 1) {
2721 $trace = $backtrace[$pos];
2722 if (isset($trace[
'file'], $trace[
'line'])) {
2723 $msg =
" From {$trace['file']}:{$trace['line']}.";
2751function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2753 global
$conf, $user, $debugbar;
2761 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2762 global $website, $websitekey;
2763 if (is_object($website) && !empty($website->ref)) {
2764 $suffixinfilename .=
'_website_' . $website->ref;
2765 } elseif (!empty($websitekey)) {
2766 $suffixinfilename .=
'_website_' . $websitekey;
2771 if (defined(
'USESUFFIXINLOG')) {
2772 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2776 foreach (
$conf->loghandlers as $loghandlerinstance) {
2777 $loghandlerinstance->setIdent($ident);
2781 if (!empty($message)) {
2784 $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');
2786 if (!array_key_exists($level, $logLevels)) {
2787 dol_syslog(
'Error Bad Log Level ' . $level, LOG_ERR);
2795 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2799 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2800 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))
2802 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2803 $osuser =
" " . sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2805 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S") .
" " . sprintf(
"%-7s", $logLevels[$level]) .
" " . $ospid .
" " . $osuser .
" " . $message;
2811 print
"\n\n<!-- Log start\n";
2813 print
"Log end -->\n";
2817 'message' => $message,
2818 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
''),
2820 'user' => ((is_object($user) && $user->id) ? $user->login :
''),
2822 'osuser' => function_exists(
'posix_getuid') ? (
string) posix_getuid() :
'',
2823 'ospid' => (
string) getmypid()
2828 if (!empty($remoteip)) {
2829 $data[
'ip'] = $remoteip;
2833 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
2834 $tmpips = explode(
',', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
2838 foreach ($tmpips as $tmpip) {
2839 $tmpip = trim($tmpip);
2840 if (strtolower($tmpip) == strtolower($remoteip)) {
2843 if (empty($data[
'ip'])) {
2844 $data[
'ip'] = $tmpip;
2847 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2850 if (!$foundremoteip) {
2852 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2854 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2855 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP'])) {
2856 $tmpips = explode(
',', $_SERVER[
'HTTP_CLIENT_IP']);
2860 foreach ($tmpips as $tmpip) {
2861 $tmpip = trim($tmpip);
2862 if (strtolower($tmpip) == strtolower($remoteip)) {
2865 if (empty($data[
'ip'])) {
2866 $data[
'ip'] = $tmpip;
2869 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $tmpip;
2872 if (!$foundremoteip) {
2874 $data[
'ip'] .= (($j == 1) ?
' [via ' :
',') . $remoteip;
2876 $data[
'ip'] .= (($j > 0) ?
']' :
'');
2878 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2880 $data[
'ip'] = (
string) $_SERVER[
'SERVER_ADDR'];
2881 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2883 $data[
'ip'] = (
string) $_SERVER[
'COMPUTERNAME'];
2885 $data[
'ip'] =
'???';
2888 if (!empty($_SERVER[
'USERNAME'])) {
2890 $data[
'osuser'] = (
string) $_SERVER[
'USERNAME'];
2891 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2893 $data[
'osuser'] = (
string) $_SERVER[
'LOGNAME'];
2897 foreach (
$conf->loghandlers as $loghandlerinstance) {
2898 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2901 $loghandlerinstance->export($data, $suffixinfilename);
2907 foreach (
$conf->loghandlers as $loghandlerinstance) {
2908 $loghandlerinstance->setIdent($ident);
2930 $templatenameforexport = $website->name_template;
2931 if (empty($templatenameforexport)) {
2932 $templatenameforexport =
'website_' . $website->ref;
2936 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="' .
dol_escape_htmltag($buttonstring) .
'"/>';
2939 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2940 $out .=
'jQuery(document).ready(function () {';
2941 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2942 $out .=
' var dialogHtml = \'';
2944 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2945 $dialogcontent .=
' <div style="margin-top: 20px;">';
2946 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>' . $langs->trans(
"ExportSiteLabel") .
'...</label><br>';
2947 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2948 $dialogcontent .=
' </div>';
2949 $dialogcontent .=
' <br>';
2950 $dialogcontent .=
' <div style="margin-top: 20px;">';
2951 $dialogcontent .=
' <strong>' . $langs->trans(
"ExportSiteGitLabel") .
' ' . $form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'') .
'</strong><br>';
2952 $dialogcontent .=
' <form action="' .
dol_escape_htmltag($overwriteGitUrl) .
'" method="POST">';
2953 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2954 $dialogcontent .=
' <input type="hidden" name="token" value="' .
newToken() .
'">';
2955 $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>';
2956 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2957 $dialogcontent .=
' </form>';
2958 $dialogcontent .=
' </div>';
2959 $dialogcontent .=
' </div>';
2966 // Add the content of the dialog to the body of the page
2967 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2968 $out .= ' if ($dialog.length > 0) {
2971 jQuery(
"body").append(dialogHtml);
';
2973 // Configuration of popup
2974 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2975 $out .= ' autoOpen:
false,
';
2976 $out .= ' modal:
true,
';
2977 $out .= ' height: 290,
';
2978 $out .= ' width:
"40%",
';
2979 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2982 // Simulate a click on the original "submit" input to export the site.
2983 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2984 $out .= ' console.log(
"Clic on exportsite.");
';
2985 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2986 $out .= ' console.log(
"element founded:", target.length > 0);
';
2987 $out .= ' if (target.length > 0) { target.click(); }
';
2988 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2992 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2993 $out .= ' return false;
';
2996 $out .= '</script>
';
3018function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $jsonclose = '', $accesskey = '')
3022 if (strpos($url, '?
') > 0) {
3023 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3025 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
' . urlencode($name);
3028 if (preg_match('/^https/i
', $url)) {
3031 $urltoopen = DOL_URL_ROOT . $url;
3036 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
3037 $out .= '<!-- a link
for button to open url into a dialog popup -->
';
3038 $out .= '<a
' . ($accesskey ? ' accesskey=
"' . $accesskey . '"' : '') . ' class=
"cursorpointer reposition button_' . $name . ($morecss ? ' ' . $morecss : '') . '"' . $disabled . ' title=
"' . dol_escape_htmltag($label) . '"';
3039 if (empty($conf->use_javascript_ajax)) {
3040 $out .= ' href=
"' . $urltoopen . '" target=
"_blank"';
3041 } elseif ($jsonopen) {
3042 $out .= ' href=
"#" onclick=
"' . $jsonopen . '"';
3044 $out .= ' href=
"#"';
3046 $out .= '>
' . $buttonstring . '</a>
';
3048 if (!empty($conf->use_javascript_ajax)) {
3049 // Add code to open url using the popup.
3050 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
3051 $out .= '<div
id=
"idfordialog' . $name . '" class=
"hidden">
' . (getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '') . '</div>
';
3053 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
3054 $out .= '<script nonce=
"' . getNonce() . '" type=
"text/javascript">
3055 jQuery(document).ready(
function () {
3056 jQuery(
".button_' . $name . '").click(
function () {
3057 console.log(\
'Open popup with jQuery(...).dialog() on URL ' .
dol_escape_js($urltoopen) .
'\');
3058 var $tmpdialog = $(\
'#idfordialog' . $name .
'\');
3059 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog' . $name .
'" style="border: 0px;" src="' . $urltoopen .
'" width="100%" height="98%"></iframe>\');
3063 height: (window.innerHeight - 150),
3066 open: function (event, ui) {
3067 console.log(
"open popup name=' . $name . '");
3069 close:
function (event, ui) {
3070 console.log(
"Popup is closed, run jsonclose = ' . $jsonclose . '");
3071 ' . (empty($jsonclose) || preg_match('/^TODO/
', $jsonclose) ? '' : $jsonclose . ';
') . '
3075 $tmpdialog.dialog(\
'open\');
3100function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
3102 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
3122function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0, $morecssdiv =
'')
3124 global
$conf, $langs, $hookmanager;
3128 if (!empty(
$conf->dol_optimize_smallscreen)) {
3132 $out =
"\n" .
'<!-- dol_fiche_head - dol_get_fiche_head -->';
3134 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3135 $out .=
'<div class="tabs' . ($picto ?
'' :
' nopaddingleft') .
'" data-role="controlgroup" data-type="horizontal">' .
"\n";
3139 if ($morehtmlright) {
3140 $out .=
'<div class="inline-block floatright tabsElem">' . $morehtmlright .
'</div>';
3147 if (is_array($links) && !empty($links)) {
3148 $keys = array_keys($links);
3150 $maxkey = max($keys);
3155 if (empty($limittoshow)) {
3158 if (!empty(
$conf->dol_optimize_smallscreen)) {
3166 for ($i = 0; $i <= $maxkey; $i++) {
3167 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3169 if ($i >= $limittoshow) {
3175 for ($i = 0; $i <= $maxkey; $i++) {
3176 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
3182 if ($i < $limittoshow || $isactive) {
3184 $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])) .
' -->';
3186 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3187 if (!empty($links[$i][0])) {
3188 $out .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3190 $out .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3192 } elseif (!empty($links[$i][1])) {
3194 $out .=
'<div class="tab tab' . ($isactive ?
'active' :
'unactive') .
'" style="margin: 0 !important">';
3196 if (!empty($links[$i][0])) {
3197 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
3198 $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) .
'">';
3201 if ($displaytab == 0 && $picto) {
3202 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
3205 $out .= $links[$i][1];
3206 if (!empty($links[$i][0])) {
3207 $out .=
'</a>' .
"\n";
3209 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
3218 $outmore .=
'<div class="popuptabset wordwrap">';
3220 $outmore_content =
'';
3222 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
3223 if (!empty($links[$i][0])) {
3224 $outmore_content .=
'<a class="tabimage' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">' . $links[$i][1] .
'</a>' .
"\n";
3226 $outmore_content .=
'<span class="tabspan">' . $links[$i][1] .
'</span>' .
"\n";
3228 } elseif (!empty($links[$i][1])) {
3229 $outmore_content .=
'<a' . (!empty($links[$i][2]) ?
' id="' . $links[$i][2] .
'"' :
'') .
' class="wordwrap inline-block' . ($morecss ?
' ' . $morecss :
'') .
'" href="' . $links[$i][0] .
'">';
3230 $outmore_content .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
3231 $outmore_content .=
'</a>' .
"\n";
3233 if ($outmore_content !==
'') {
3234 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">' . $outmore_content .
'</div>';
3240 $displaytab = $i + 1;
3243 $outmore .=
'</div>';
3247 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
3248 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
3249 $widthofpopup = 240;
3251 $tabsname = $moretabssuffix;
3252 if (empty($tabsname)) {
3253 $tabsname = str_replace(
"@",
"", $picto);
3255 $out .=
'<div id="moretabs' . $tabsname .
'" class="inline-block tabsElem valignmiddle">';
3257 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="fa fa-angle-down"></span> <span class="opacitymedium">+' . $nbintab .
'</span></a></div>';
3259 $out .=
'<div id="moretabsList' . $tabsname .
'" style="width: ' . $widthofpopup .
'px; position: absolute; ' . $left .
': -999em; text-align: ' . $left .
'; margin:0px; padding:2px; z-index:10;">';
3262 $out .=
'<div></div>';
3265 $out .=
'<script nonce="' .
getNonce() .
'">';
3266 $out .=
"$('#moretabs" . $tabsname .
"').mouseenter( function() {
3267 var x = this.offsetLeft, y = this.offsetTop;
3268 console.log('mouseenter " . $left .
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
3269 if ((window.innerWidth - x) < " . ($widthofpopup + 10) .
") {
3270 $('#moretabsList" . $tabsname .
"').css('" . $right .
"','8px');
3272 $('#moretabsList" . $tabsname .
"').css('" . $left .
"','auto');
3275 $out .=
"$('#moretabs" . $tabsname .
"').mouseleave( function() { console.log('mouseleave " . $left .
"'); $('#moretabsList" . $tabsname .
"').css('" . $left .
"','-999em');});";
3276 $out .=
"</script>";
3279 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
3283 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
3284 $out .=
"\n" .
'<div id="dragDropAreaTabBar" class="tabBar' . ($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'') . ($notab == -4 ?
'' :
' tabBarWithBottom'))));
3285 $out .= ($morecssdiv ?
' ' . $morecssdiv :
'');
3286 $out .=
'">' .
"\n";
3288 if (!empty($dragdropfile)) {
3290 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3293 $parameters = array(
'tabname' => $active,
'out' => $out);
3294 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
3296 $out = $hookmanager->resPrint;
3322 if (!$notab || $notab == -1) {
3323 return "\n</div>\n";
3348function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
3350 global
$conf, $form, $user, $langs, $hookmanager, $action;
3354 $maxvisiblephotos = 1;
3359 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
3362 $modulepart =
'unknown';
3364 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
3365 $modulepart =
$object->element;
3366 } elseif (
$object->element ==
'member') {
3367 $modulepart =
'memberphoto';
3368 } elseif (
$object->element ==
'user') {
3369 $modulepart =
'userphoto';
3372 if (class_exists(
"Imagick")) {
3373 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
3374 $modulepart =
$object->element;
3375 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
3376 $modulepart =
'ficheinter';
3377 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3378 $modulepart =
'contract';
3379 } elseif (
$object->element ==
'order_supplier') {
3380 $modulepart =
'supplier_order';
3381 } elseif (
$object->element ==
'invoice_supplier') {
3382 $modulepart =
'supplier_invoice';
3386 if (
$object->element ==
'product') {
3388 '@phan-var-force Product $object';
3390 $cssclass =
'photowithmargin photoref';
3391 $showimage =
$object->is_photo_available(
$conf->product->multidir_output[$entity]);
3393 if (
$conf->browser->layout ==
'phone') {
3394 $maxvisiblephotos = 1;
3396 $useLinkPathPhoto =
getDolGlobalInt(
'PRODUCT_USE_LINK_PATH_FOR_PHOTO');
3397 if ($showimage || $useLinkPathPhoto) {
3398 $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>';
3402 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3404 $nophoto =
'/public/theme/common/nophoto.png';
3405 $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>';
3408 } elseif (
$object->element ==
'category') {
3410 '@phan-var-force Categorie $object';
3412 $cssclass =
'photowithmargin photoref';
3413 $showimage =
$object->isAnyPhotoAvailable(
$conf->categorie->multidir_output[$entity]);
3415 if (
$conf->browser->layout ==
'phone') {
3416 $maxvisiblephotos = 1;
3419 $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>';
3423 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3425 $nophoto =
'/public/theme/common/nophoto.png';
3426 $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>';
3429 } elseif (
$object->element ==
'bom') {
3431 '@phan-var-force Bom $object';
3433 $cssclass =
'photowithmargin photoref';
3434 $showimage =
$object->is_photo_available(
$conf->bom->multidir_output[$entity]);
3436 if (
$conf->browser->layout ==
'phone') {
3437 $maxvisiblephotos = 1;
3440 $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>';
3444 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3446 $nophoto =
'/public/theme/common/nophoto.png';
3447 $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>';
3450 } elseif (
$object->element ==
'ticket') {
3452 $cssclass =
'photoref';
3454 '@phan-var-force Ticket $object';
3455 $showimage =
$object->is_photo_available(
$conf->ticket->multidir_output[$entity] .
'/' .
$object->ref);
3457 if (
$conf->browser->layout ==
'phone') {
3458 $maxvisiblephotos = 1;
3462 $showphoto =
$object->show_photos(
'ticket',
$conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
3464 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $showphoto .
'</div>';
3472 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
3474 $nophoto =
img_picto(
'No photo',
'object_ticket');
3475 $morehtmlleft .=
'<!-- No photo to show -->';
3476 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3477 $morehtmlleft .= $nophoto;
3478 $morehtmlleft .=
'</div></div>';
3483 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3486 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3488 $dir_output = (empty(
$conf->$modulepart->multidir_output[$entity]) ?
$conf->$modulepart->dir_output :
$conf->$modulepart->multidir_output[$entity]) .
"/";
3489 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3491 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'') . $objectref;
3495 if (empty($subdir)) {
3496 $subdir =
'errorgettingsubdirofobject';
3499 $filepath = $dir_output . $subdir .
"/";
3501 $filepdf = $filepath . $objectref .
".pdf";
3502 $relativepath = $subdir .
'/' . $objectref .
'.pdf';
3505 $fileimage = $filepdf .
'_preview.png';
3506 $relativepathimage = $relativepath .
'_preview.png';
3508 $pdfexists = file_exists($filepdf);
3513 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3515 include_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
3524 if ($pdfexists && !$error) {
3525 $heightforphotref = 80;
3526 if (!empty(
$conf->dol_optimize_smallscreen)) {
3527 $heightforphotref = 60;
3530 if (file_exists($fileimage)) {
3531 $phototoshow =
'<div class="photoref">';
3532 $phototoshow .=
'<img height="' . $heightforphotref .
'" class="photo photowithborder" src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=apercu' . $modulepart .
'&file=' . urlencode($relativepathimage) .
'">';
3533 $phototoshow .=
'</div>';
3536 } elseif (!$phototoshow) {
3537 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0);
3541 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3542 $morehtmlleft .= $phototoshow;
3543 $morehtmlleft .=
'</div>';
3547 if (empty($phototoshow)) {
3548 if (
$object->element ==
'action') {
3550 $cssclass =
'photorefcenter';
3551 $nophoto =
img_picto(
'No photo',
'title_agenda');
3554 $cssclass =
'photorefcenter';
3556 $prefix =
'object_';
3560 if (strpos($picto,
'fontawesome_') !==
false) {
3563 $nophoto =
img_picto(
'No photo', $prefix . $picto);
3565 $morehtmlleft .=
'<!-- No photo to show -->';
3566 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3567 $morehtmlleft .= $nophoto;
3568 $morehtmlleft .=
'</div></div>';
3573 $morehtmlref .=
'<div style="clear: both;"></div>';
3574 $morehtmlref .=
'<div class="smallimp refidno opacitymedium banner-object-technical-id">';
3575 $morehtmlref .= $langs->trans(
"TechnicalID") .
': ' . ((int)
$object->id);
3576 $morehtmlref .=
'</div>';
3582 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">' . $form->showbarcode(
$object, 100,
'photoref valignmiddle') .
'</div>';
3585 if (
$object->element ==
'societe') {
3587 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3590 $morehtmlstatus .=
$object->getLibStatut(6);
3592 } elseif (
$object->element ==
'product') {
3595 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3596 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'status',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3598 $morehtmlstatus .=
'<span class="statusrefsell">' .
$object->getLibStatut(6, 0) .
'</span>';
3600 $morehtmlstatus .=
' ';
3602 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3603 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'status_buy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3605 $morehtmlstatus .=
'<span class="statusrefbuy">' .
$object->getLibStatut(6, 1) .
'</span>';
3607 } elseif (in_array(
$object->element, array(
'salary'))) {
3609 '@phan-var-force Salary $object';
3611 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3614 $morehtmlstatus .= $tmptxt;
3615 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3617 '@phan-var-force Facture|FactureFournisseur|CommonInvoice $object';
3618 if (!isset(
$object->alreadypaid)) {
3624 $tmptxt =
$object->getLibStatut(6, (
float)
$object->alreadypaid);
3625 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3626 $tmptxt =
$object->getLibStatut(5, (
float)
$object->alreadypaid);
3628 $morehtmlstatus .= $tmptxt;
3629 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3631 '@phan-var-force ChargeSociales|Loan|Tva $object';
3633 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3636 $morehtmlstatus .= $tmptxt;
3637 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3640 $morehtmlstatus .=
$object->getLibStatut(5);
3642 $morehtmlstatus .=
$object->getLibStatut(4);
3644 } elseif (
$object->element ==
'facturerec') {
3646 '@phan-var-force FactureRec $object';
3647 if (
$object->frequency == 0) {
3648 $morehtmlstatus .=
$object->getLibStatut(2);
3650 $morehtmlstatus .=
$object->getLibStatut(5);
3652 } elseif (
$object->element ==
'project_task') {
3654 $tmptxt =
$object->getLibStatut(4);
3655 $morehtmlstatus .= $tmptxt;
3656 } elseif (method_exists(
$object,
'getLibStatut')) {
3657 $tmptxt =
$object->getLibStatut(6);
3658 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3659 $tmptxt =
$object->getLibStatut(5);
3661 $morehtmlstatus .= $tmptxt;
3665 if (
isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3667 if (method_exists(
$object,
'getVentilExportCompta')) {
3668 $accounted =
$object->getVentilExportCompta(1);
3669 $langs->load(
"accountancy");
3670 $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>';
3675 if (!empty(
$object->name_alias)) {
3677 '@phan-var-force Societe $object';
3678 $morehtmlref .=
'<div class="refidno opacitymedium banner-object-name-alias">' .
dol_escape_htmltag(
$object->name_alias) .
'</div>';
3682 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3685 $morehtmlref .=
'<div class="refidno banner-object-label">' .
$object->label .
'</div>';
3689 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3692 $morehtmlref .=
'<div class="refidno refaddress">';
3693 $morehtmlref .= $moreaddress;
3694 $morehtmlref .=
'</div>';
3698 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3699 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3702 } elseif (empty($reshook)) {
3703 $morehtmlref .= $hookmanager->resPrint;
3704 } elseif ($reshook > 0) {
3705 $morehtmlref = $hookmanager->resPrint;
3714 print
'<div class="' . ($onlybanner ?
'arearefnobottom ' :
'arearef ') .
'heightref valignmiddle centpercent object-banner-tab-container" data-module-part="'.
dolPrintHTMLForAttribute($modulepart).
'">';
3715 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3717 print
'<div class="underrefbanner clearboth"></div>';
3729function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3733 if ($fieldrequired) {
3734 $ret .=
'<span class="fieldrequired">';
3736 $ret .=
'<label for="' . $fieldkey .
'">';
3737 $ret .= $langs->trans($langkey);
3739 if ($fieldrequired) {
3760 global $langs, $hookmanager;
3763 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3768 $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)));
3771 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3773 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3774 $ret .= (($ret && $town) ? $sep :
'') . $town;
3777 $ret .= ($ret ? ($town ?
", " : $sep) :
'') .
$object->state;
3780 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'') .
$object->zip;
3782 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3784 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3785 $ret .= ($ret ? $sep :
'') . $town;
3787 $ret .= ($ret ?
", " :
'') .
$object->state;
3790 $ret .= ($ret ? $sep :
'') .
$object->zip;
3792 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3794 $ret .= ($ret ? $sep :
'') .
$object->zip;
3795 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3796 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3798 $ret .= $sep .
$object->state;
3800 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3803 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3805 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3807 $ret .= ($ret ? $sep :
'') .
$object->zip;
3808 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3809 $ret .= ($town ? ((
$object->zip ?
' ' :
'') . $town) :
'');
3810 $ret .= (empty(
$object->state_code) ?
'' : (
' ' .
$object->state_code));
3813 $town = (($extralangcode && !empty(
$object->array_languages[
'address'][$extralangcode])) ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3814 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'') .
$object->zip) :
'';
3815 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')) . $town) :
'');
3816 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3817 $ret .= ($ret ?
", " :
'') .
$object->state;
3821 if (!is_object($outputlangs)) {
3822 $outputlangs = $langs;
3825 $langs->load(
"dict");
3826 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'') . $outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country" .
$object->country_code)));
3829 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3830 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3834 $ret .= $hookmanager->resPrint;
3851function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3853 if ((abs($ts) <= 0x7FFFFFFF)) {
3856 return 'Error date outside supported range';
3882function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false, $decorate = 0)
3884 global
$conf, $langs;
3891 if ($tzoutput ===
'auto') {
3892 $tzoutput = (empty(
$conf) ?
'tzserver' : (isset(
$conf->tzuserinputkey) ?
$conf->tzuserinputkey :
'tzserver'));
3897 $offsettz = $offsetdst = 0;
3900 if (is_string($tzoutput)) {
3901 if ($tzoutput ==
'tzserver') {
3903 $offsettzstring = @date_default_timezone_get();
3908 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3911 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
getDolGlobalString(
'MAIN_DOLIBARR_USER_TIMEZONE',
'UTC') : $_SESSION[
'dol_tz_string']);
3913 if (class_exists(
'DateTimeZone')) {
3915 $user_date_tz =
new DateTimeZone($offsettzstring);
3918 dol_syslog(
"DateInvalidTimeZoneException for timezone string '".$offsettzstring.
"'. Falling back to UTC.", LOG_ERR);
3919 $user_date_tz =
new DateTimeZone(
'UTC');
3921 $user_dt =
new DateTime();
3922 $user_dt->setTimezone($user_date_tz);
3923 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3924 $offsettz = $user_dt->getOffset();
3926 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3927 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3932 if (!is_object($outputlangs)) {
3933 $outputlangs = $langs;
3936 $format =
'daytextshort';
3941 $reduceformat = (!empty(
$conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3942 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3943 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3944 if ($formatwithoutreduce != $format) {
3945 $format = $formatwithoutreduce;
3951 if ($format ==
'day') {
3952 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") :
$conf->format_date_short);
3953 } elseif ($format ==
'hour') {
3954 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") :
$conf->format_hour_short);
3955 } elseif ($format ==
'hoursec') {
3956 $s1 = $outputlangs->trans(
"FormatDateShort");
3957 $s2 = $outputlangs->trans(
"FormatDateHourSecShort");
3958 $s3 = trim(preg_replace(
'/'.preg_quote($s1,
'/').
'/',
'', $s2));
3961 } elseif ($format ==
'hourduration') {
3962 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") :
$conf->format_hour_short_duration);
3963 } elseif ($format ==
'daytext') {
3964 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") :
$conf->format_date_text);
3965 } elseif ($format ==
'daytextshort') {
3966 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") :
$conf->format_date_text_short);
3967 } elseif ($format ==
'dayhour') {
3968 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") :
$conf->format_date_hour_short);
3969 } elseif ($format ==
'dayhoursec') {
3970 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") :
$conf->format_date_hour_sec_short);
3971 } elseif ($format ==
'dayhourtext') {
3972 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") :
$conf->format_date_hour_text);
3973 } elseif ($format ==
'dayhourtextshort') {
3974 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") :
$conf->format_date_hour_text_short);
3975 } elseif ($format ==
'dayhourlog') {
3977 $format =
'%Y%m%d%H%M%S';
3978 } elseif ($format ==
'dayhourlogsmall') {
3980 $format =
'%y%m%d%H%M';
3981 } elseif ($format ==
'dayhourldap') {
3982 $format =
'%Y%m%d%H%M%SZ';
3983 } elseif ($format ==
'dayhourxcard') {
3984 $format =
'%Y%m%dT%H%M%SZ';
3985 } elseif ($format ==
'dayxcard') {
3987 } elseif ($format ==
'dayrfc') {
3988 $format =
'%Y-%m-%d';
3989 } elseif ($format ==
'dayhourrfc') {
3990 $format =
'%Y-%m-%dT%H:%M:%SZ';
3991 } elseif ($format ==
'standard') {
3992 $format =
'%Y-%m-%d %H:%M:%S';
3995 if ($reduceformat) {
3996 $format = str_replace(
'%Y',
'%y', $format);
3997 $format = str_replace(
'yyyy',
'yy', $format);
4001 if (preg_match(
'/%b/i', $format)) {
4003 $format = str_replace(
'%b',
'__b__', $format);
4004 $format = str_replace(
'%B',
'__B__', $format);
4006 if (preg_match(
'/%a/i', $format)) {
4008 $format = str_replace(
'%a',
'__a__', $format);
4009 $format = str_replace(
'%A',
'__A__', $format);
4014 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)) {
4017 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
4021 $syear = (!empty($reg[1]) ? $reg[1] :
'');
4022 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
4023 $sday = (!empty($reg[3]) ? $reg[3] :
'');
4024 $shour = (!empty($reg[4]) ? $reg[4] :
'');
4025 $smin = (!empty($reg[5]) ? $reg[5] :
'');
4026 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
4028 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
4031 $tzo =
new DateTimeZone(
'UTC');
4033 $tzo =
new DateTimeZone(date_default_timezone_get());
4035 $dtts =
new DateTime();
4036 $dtts->setTimestamp($time);
4037 $dtts->setTimezone($tzo);
4038 $newformat = str_replace(
4039 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4040 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4043 $ret = $dtts->format($newformat);
4045 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4046 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4051 if ($time < 100000000000) {
4052 $dtts =
new DateTime();
4055 $timetouse = (int) $time + $offsettz + $offsetdst;
4057 $tzo =
new DateTimeZone(
'UTC');
4058 $dtts->setTimezone($tzo);
4059 $dtts->setTimestamp($timetouse);
4061 $timetouse = (int) $time + $offsettz + $offsetdst;
4063 $tzo =
new DateTimeZone(date_default_timezone_get());
4064 $dtts->setTimestamp($timetouse);
4065 $dtts->setTimezone($tzo);
4068 $newformat = str_replace(
4069 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4070 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4074 $ret = $dtts->format($newformat);
4077 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
4078 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
4082 $ret =
'Bad value ' . $time .
' for date';
4086 if (preg_match(
'/__b__/i', $format)) {
4087 $timetouse = $time + $offsettz + $offsetdst;
4090 $tzo =
new DateTimeZone(
'UTC');
4092 $tzo =
new DateTimeZone(date_default_timezone_get());
4094 $dtts =
new DateTime();
4095 $dtts->setTimestamp($timetouse);
4096 $dtts->setTimezone($tzo);
4097 $month = (int) $dtts->format(
"m");
4098 $month = sprintf(
"%02d", $month);
4099 if ($encodetooutput) {
4100 $monthtext = $outputlangs->transnoentities(
'Month' . $month);
4101 $monthtextshort = $outputlangs->transnoentities(
'MonthShort' . $month);
4103 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month' . $month);
4104 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort' . $month);
4107 $ret = str_replace(
'__b__', $monthtextshort, $ret);
4108 $ret = str_replace(
'__B__', $monthtext, $ret);
4112 if (preg_match(
'/__a__/i', $format)) {
4114 $timetouse = $time + $offsettz + $offsetdst;
4117 $tzo =
new DateTimeZone(
'UTC');
4119 $tzo =
new DateTimeZone(date_default_timezone_get());
4121 $dtts =
new DateTime();
4122 $dtts->setTimestamp($timetouse);
4123 $dtts->setTimezone($tzo);
4124 $w = $dtts->format(
"w");
4125 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day' . $w);
4127 $ret = str_replace(
'__A__', $dayweek, $ret);
4128 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
4132 $ret = preg_replace(
'/(\d\d:\d\d [AP]M)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4133 $ret = preg_replace(
'/(\d\d:\d\d)$/',
'<span class="'.($decorate === 1 ?
'opacitymedium' : $decorate).
'">\1</span>', $ret);
4160function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
4162 if ($timestamp ===
'') {
4166 $datetimeobj =
new DateTime();
4167 $datetimeobj->setTimestamp($timestamp);
4168 if ($forcetimezone && $forcetimezone !=
'tzserver') {
4169 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
4172 'year' => ((
int) date_format($datetimeobj,
'Y')),
4173 'mon' => ((
int) date_format($datetimeobj,
'm')),
4174 'mday' => ((
int) date_format($datetimeobj,
'd')),
4175 'wday' => ((
int) date_format($datetimeobj,
'w')),
4176 'yday' => ((
int) date_format($datetimeobj,
'z')),
4177 'hours' => ((
int) date_format($datetimeobj,
'H')),
4178 'minutes' => ((
int) date_format($datetimeobj,
'i')),
4179 'seconds' => ((
int) date_format($datetimeobj,
's')),
4207function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
4212 if ($gm ===
'auto') {
4213 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
4218 if ($hour == -1 || empty($hour)) {
4221 if ($minute == -1 || empty($minute)) {
4224 if ($second == -1 || empty($second)) {
4230 if (!$month || !$day) {
4239 if ($hour < 0 || $hour > 24) {
4242 if ($minute < 0 || $minute > 60) {
4245 if ($second < 0 || $second > 60) {
4250 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
4251 $default_timezone = @date_default_timezone_get();
4252 $localtz =
new DateTimeZone($default_timezone);
4253 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
4255 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
4257 $localtz =
new DateTimeZone($default_timezone);
4259 dol_syslog(
"Warning dol_tz_string contains an invalid value " . json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
4260 $default_timezone = @date_default_timezone_get();
4262 } elseif (strrpos($gm,
"tz,") !==
false) {
4263 $timezone = (
string) str_replace(
"tz,",
"", $gm);
4265 $localtz =
new DateTimeZone($timezone);
4267 dol_syslog(
"Warning passed timezone contains an invalid value " . $timezone, LOG_WARNING);
4271 if (empty($localtz)) {
4272 $localtz =
new DateTimeZone(
'UTC');
4274 $dt =
new DateTime(
'now', $localtz);
4275 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
4276 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
4277 $date = $dt->getTimestamp();
4293function dol_now($mode =
'gmt')
4297 if ($mode ===
'auto') {
4301 if ($mode ==
'gmt') {
4303 } elseif ($mode ==
'tzserver') {
4304 require_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
4306 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
4311 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
4314 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
4315 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
4316 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
4333 global
$conf, $langs;
4336 if (!empty(
$conf->dol_optimize_smallscreen)) {
4341 if (empty($shortvalue) || $size < ($level * 10)) {
4343 $textunitshort = $langs->trans(
"b");
4344 $textunitlong = $langs->trans(
"Bytes");
4346 $ret = round($size / $level, 0);
4347 $textunitshort = $langs->trans(
"Kb");
4348 $textunitlong = $langs->trans(
"KiloBytes");
4351 if (empty($shortunit)) {
4352 $ret .=
' ' . $textunitlong;
4354 $ret .=
' ' . $textunitshort;
4370function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
4378 $linkstart =
'<a href="';
4379 if (!preg_match(
'/^http/i', $url)) {
4380 $linkstart .=
'http://';
4385 $linkstart .=
' target="' . $target .
'"';
4387 $linkstart .=
' title="' . $langs->trans(
"URL") .
': ' . $url .
'"';
4391 if (!preg_match(
'/^http/i', $url)) {
4398 if ($morecss ==
'float') {
4399 return '<div class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'') . $link .
'</div>';
4401 return $linkstart .
'<span class="nospan' . ($morecss ?
' ' . $morecss :
'') .
'" style="margin-right: 10px">' . ($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'') . $link .
'</span>' . $linkend;
4418function dol_print_email($email, $contactid = 0, $socid = 0, $addlink = 0, $max = 0, $showinvalid = 2, $withpicto = 0, $morecss =
'paddingrightonly')
4420 global $user, $langs, $hookmanager;
4431 if (empty($email)) {
4435 if ($addlink == 1) {
4436 $newemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="';
4437 if (!preg_match(
'/^mailto:/i', $email)) {
4438 $newemail .=
'mailto:';
4440 $newemail .= $email;
4441 $newemail .=
'" target="_blank">';
4443 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4448 $newemail .= $email;
4450 $newemail .=
'</a>';
4453 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4454 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4457 $langs->load(
"errors");
4458 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $emailonly),
'',
'paddingrightonly');
4460 $langs->load(
"errors");
4461 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly),
'',
'paddingrightonly');
4465 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4467 $linktoaddaction =
'';
4469 $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>';
4471 if ($linktoaddaction) {
4472 $newemail =
'<div>' . $newemail .
' ' . $linktoaddaction .
'</div>';
4475 } elseif ($addlink ===
'thirdparty') {
4476 $tmpnewemail =
'<a class="' . ($morecss ? $morecss :
'') .
'" style="text-overflow: ellipsis;" href="' . DOL_URL_ROOT .
'/societe/card.php?socid=' . $socid .
'&action=presend&mode=init#formmailbeforetitle">';
4477 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
4478 if ($withpicto == 1) {
4479 $tmpnewemail .= $newemail;
4481 $tmpnewemail .=
'</a>';
4483 $newemail = $tmpnewemail;
4485 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail") .
' : ' . $email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'') . $newemail;
4488 include_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
4489 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
4492 $langs->load(
"errors");
4493 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadEMail", $email));
4495 $langs->load(
"errors");
4496 $newemail .=
img_warning($langs->transnoentitiesnoconv(
"ErrorBadMXDomain", $emailonly));
4510 $parameters = array(
'cid' => $contactid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
4512 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
4516 $rep .= $hookmanager->resPrint;
4538function dolOutputDates($datep, $datef =
null, $fullday = 0, $addseconds = 0, $pictotoadd =
'', $tzoutput =
'tzuserrel', $reduceformat = 0)
4541 if (empty($datef)) {
4549 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
4551 $s .=
'<div class="center inline-block">';
4552 if ($tmpa[
'hours'] != $tmpb[
'hours'] || $tmpa[
'minutes'] != $tmpb[
'minutes']) {
4554 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''), $tzoutput);
4556 if (empty($fullday)) {
4557 $s .=
'<br><span class="small opacitymedium">';
4558 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4559 $s .=
'-'.dol_print_date($datef,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4564 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''),
'tzuserrel');
4566 if (empty($fullday)) {
4567 $s .=
'<br><span class="small opacitymedium">';
4568 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4575 $s .=
'<div class="center inline-block dateborderright">';
4576 $s .=
dol_print_date($datep,
'day'.($reduceformat ?
'reduceformat' :
''), $tzoutput);
4577 if (empty($fullday)) {
4578 $s .=
'<br><span class="small opacitymedium">';
4579 $s .=
dol_print_date($datep,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4583 $s .=
'<div class="center inline-block dateborderleft">';
4584 $s .=
dol_print_date($datef,
'day'.($reduceformat ?
'reduceformat' :
''),
'tzuserrel');
4586 if (empty($fullday)) {
4587 $s .=
'<br><span class="small opacitymedium">';
4588 $s .=
dol_print_date($datef,
'hour'.($addseconds ?
'sec' :
'').
'reduceformat', $tzoutput);
4607 $socialnetworks = array();
4609 require_once DOL_DOCUMENT_ROOT .
'/core/lib/memory.lib.php';
4613 if (!is_null($dataretrieved)) {
4614 $socialnetworks = $dataretrieved;
4616 $sql =
"SELECT rowid, code, label, url, icon, active FROM " . MAIN_DB_PREFIX .
"c_socialnetworks";
4617 $sql .=
" WHERE entity IN (" .
getEntity(
'c_socialnetworks').
")";
4619 $resql =
$db->query($sql);
4621 while ($obj =
$db->fetch_object($resql)) {
4622 $socialnetworks[$obj->code] = array(
4623 'rowid' => $obj->rowid,
4624 'label' => $obj->label,
4626 'icon' => $obj->icon,
4627 'active' => $obj->active,
4634 return (is_array($socialnetworks) ? $socialnetworks : array());
4649 global $hookmanager, $langs, $user;
4653 if (empty($value)) {
4657 if (!empty($type)) {
4658 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4660 $htmllink .=
'<span class="fab pictofixedwidth ' . ($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link') .
'"></span>';
4661 if ($type ==
'skype') {
4663 $htmllink .=
' <a href="skype:';
4665 $htmllink .=
'?call" alt="' . $langs->trans(
"Call") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Call") .
' ' . $value) .
'">';
4666 $htmllink .=
'<img src="' . DOL_URL_ROOT .
'/theme/common/skype_callbutton.png" border="0">';
4667 $htmllink .=
'</a><a href="skype:';
4669 $htmllink .=
'?chat" alt="' . $langs->trans(
"Chat") .
' ' . $value .
'" title="' .
dol_escape_htmltag($langs->trans(
"Chat") .
' ' . $value) .
'">';
4670 $htmllink .=
'<img class="paddingleft" src="' . DOL_URL_ROOT .
'/theme/common/skype_chatbutton.png" border="0">';
4671 $htmllink .=
'</a>';
4672 if (($contactid || $socid) &&
isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4673 $addlink =
'AC_SKYPE';
4676 $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>';
4678 $htmllink .= ($link ?
' ' . $link :
'');
4681 if (!empty($dictsocialnetworks[$type][
'url'])) {
4682 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4683 if ($tmpvirginurl) {
4684 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4685 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl,
'/') .
'\/?/',
'', $value);
4687 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4688 if ($tmpvirginurl3) {
4689 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4690 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl3,
'/') .
'\/?/',
'', $value);
4693 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4694 if ($tmpvirginurl2) {
4695 $value = preg_replace(
'/^www\.' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4696 $value = preg_replace(
'/^' . preg_quote($tmpvirginurl2,
'/') .
'\/?/',
'', $value);
4699 if (preg_match(
'/^https?:\/\//i', $value)) {
4702 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4704 $valuetoshow = $value;
4705 $valuetoshow = preg_replace(
'/https:\/\/www\.(twitter|x|linkedin)\.com\/?/',
'', $valuetoshow);
4706 if (preg_match(
'/^https?:\/\//i', $link)) {
4715 $htmllink .=
'</div>';
4717 $langs->load(
"errors");
4718 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4722 $parameters = array(
4724 'cid' => $contactid,
4727 'dictsocialnetworks' => $dictsocialnetworks,
4730 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4734 $htmllink .= $hookmanager->resPrint;
4749function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4753 if (empty($profID) || empty($profIDtype)) {
4756 if (empty($countrycode)) {
4757 $countrycode =
$mysoc->country_code;
4759 $newProfID = $profID;
4760 $id = substr($profIDtype, -1);
4762 if (strtoupper($countrycode) ==
'FR') {
4768 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3);
4772 $newProfID = substr($newProfID, 0, 3) .
' ' . substr($newProfID, 3, 3) .
' ' . substr($newProfID, 6, 3) .
' ' . substr($newProfID, 9, 5);
4776 $newProfID = substr($newProfID, 0, 2) .
'.' . substr($newProfID, 2, 3);
4778 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4780 $newProfID = substr($newProfID, 0, 4) .
' ' . substr($newProfID, 4, 3) .
' ' . substr($newProfID, 7, 3) .
' ' . substr($newProfID, 10, 3);
4783 if (!empty($addcpButton)) {
4806function dol_print_phone($phone, $countrycode =
'', $contactid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4808 global
$conf, $user, $langs,
$mysoc, $hookmanager;
4811 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4812 if (empty($phone)) {
4818 if (empty($countrycode) && is_object(
$mysoc)) {
4819 $countrycode =
$mysoc->country_code;
4823 if (!empty(
$conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4828 $newphonewa = $phone;
4829 if (strtoupper($countrycode) ==
"FR") {
4832 $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);
4834 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 2);
4836 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 2) . $separ . substr($newphone, 7, 2);
4838 $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);
4840 $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);
4842 $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);
4844 } elseif (strtoupper($countrycode) ==
"CA") {
4846 $newphone = ($separ !=
'' ?
'(' :
'') . substr($newphone, 0, 3) . ($separ !=
'' ?
')' :
'') . $separ . substr($newphone, 3, 3) . ($separ !=
'' ?
'-' :
'') . substr($newphone, 6, 4);
4848 } elseif (strtoupper($countrycode) ==
"PT") {
4850 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4852 } elseif (strtoupper($countrycode) ==
"SR") {
4854 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3);
4856 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
4858 } elseif (strtoupper($countrycode) ==
"DE") {
4860 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 4) . $separ . substr($newphone, 11, 3);
4862 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 4) . $separ . substr($newphone, 10, 3);
4864 } elseif (strtoupper($countrycode) ==
"ES") {
4866 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4868 } elseif (strtoupper($countrycode) ==
"BF") {
4870 $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);
4872 } elseif (strtoupper($countrycode) ==
"RO") {
4874 $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);
4876 } elseif (strtoupper($countrycode) ==
"TR") {
4878 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4880 } elseif (strtoupper($countrycode) ==
"US") {
4882 $newphone = substr($newphone, 0, 2) . $separ . substr($newphone, 2, 3) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4884 } elseif (strtoupper($countrycode) ==
"MX") {
4886 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4888 $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);
4890 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 4);
4892 } elseif (strtoupper($countrycode) ==
"ML") {
4894 $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);
4896 } elseif (strtoupper($countrycode) ==
"TH") {
4898 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4900 $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);
4902 } elseif (strtoupper($countrycode) ==
"MU") {
4905 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2);
4907 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 2);
4909 } elseif (strtoupper($countrycode) ==
"ZA") {
4911 $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);
4913 } elseif (strtoupper($countrycode) ==
"SY") {
4915 $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);
4917 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2) . $separ . substr($newphone, 10, 3);
4919 } elseif (strtoupper($countrycode) ==
"AE") {
4921 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 2);
4923 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4925 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 4);
4927 } elseif (strtoupper($countrycode) ==
"DZ") {
4929 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4931 } elseif (strtoupper($countrycode) ==
"BE") {
4933 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 3);
4935 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4937 } elseif (strtoupper($countrycode) ==
"PF") {
4939 $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);
4941 } elseif (strtoupper($countrycode) ==
"CO") {
4943 $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);
4945 } elseif (strtoupper($countrycode) ==
"JO") {
4947 $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);
4949 } elseif (strtoupper($countrycode) ==
"JM") {
4951 $newphone = substr($newphone, 0, 5) . $separ . substr($newphone, 5, 3) . $separ . substr($newphone, 8, 4);
4953 } elseif (strtoupper($countrycode) ==
"MG") {
4955 $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);
4957 } elseif (strtoupper($countrycode) ==
"GB") {
4959 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4) . $separ . substr($newphone, 7, 3) . $separ . substr($newphone, 10, 3);
4961 } elseif (strtoupper($countrycode) ==
"CH") {
4963 $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);
4965 $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);
4967 } elseif (strtoupper($countrycode) ==
"TN") {
4969 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4971 } elseif (strtoupper($countrycode) ==
"GF") {
4973 $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);
4975 } elseif (strtoupper($countrycode) ==
"GP") {
4977 $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);
4979 } elseif (strtoupper($countrycode) ==
"MQ") {
4981 $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);
4983 } elseif (strtoupper($countrycode) ==
"IT") {
4985 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
4987 $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);
4989 } elseif (strtoupper($countrycode) ==
"AU") {
4993 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 1) . $separ . substr($newphone, 4, 4) . $separ . substr($newphone, 8, 4);
4995 } elseif (strtoupper($countrycode) ==
"LU") {
4998 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 2) . $separ . substr($newphone, 6, 2) . $separ . substr($newphone, 8, 2);
5000 $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);
5002 $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);
5004 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 2) . $separ . substr($newphone, 9, 2) . $separ . substr($newphone, 11, 2);
5006 } elseif (strtoupper($countrycode) ==
"PE") {
5009 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 4);
5011 $newphonewa =
'+51' . $newphone;
5012 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3);
5014 $newphone = substr($newphone, 0, 4) . $separ . substr($newphone, 4, 3) . $separ . substr($newphone, 7, 4);
5016 $newphonewa = $newphone;
5017 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 3) . $separ . substr($newphone, 6, 3) . $separ . substr($newphone, 9, 3);
5019 } elseif (strtoupper($countrycode) ==
"IN") {
5021 if ($withpicto ==
'phone') {
5022 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 2) . $separ . substr($newphone, 5, 4) . $separ . substr($newphone, 9, 4);
5024 $newphone = substr($newphone, 0, 3) . $separ . substr($newphone, 3, 5) . $separ . substr($newphone, 8, 5);
5029 $newphoneastart = $newphoneaend =
'';
5030 if (!empty($addlink)) {
5032 $newphoneastart =
'<a href="tel:' . urlencode($phone) .
'">';
5033 $newphoneaend .=
'</a>';
5034 } elseif (
isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
5035 if (empty($user->clicktodial_loaded)) {
5036 $user->fetch_clicktodial();
5040 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
5041 if (!empty($user->clicktodial_url)) {
5042 $urlmask = $user->clicktodial_url;
5045 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
5046 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
5047 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
5049 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
5051 $substitarray = array(
5052 '__PHONEFROM__' => $clicktodial_poste,
5053 '__PHONETO__' => urlencode($phone),
5054 '__LOGIN__' => $clicktodial_login,
5055 '__PASS__' => $clicktodial_password
5060 $newphoneastart =
'<a href="' . $url .
'" class="cssforclicktodial">';
5061 $newphoneaend =
'</a>';
5064 $newphoneastart =
'<a href="' . $url .
'"';
5066 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
5068 $newphoneastart .=
'>';
5069 $newphoneaend .=
'</a>';
5074 if (
isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
5076 $addlinktoagenda =
'';
5077 if ($addlink ==
'AC_FAX') {
5081 $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>';
5083 if ($addlinktoagenda) {
5084 $newphone =
'<span>' . $newphone .
' ' . $addlinktoagenda .
'</span>';
5089 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
5091 $newphone .=
' <a href="https://wa.me/' . $newphonewa .
'" target="_blank"';
5092 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
5095 if (empty($titlealt) && isset($langs)) {
5096 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
5101 $parameters = array(
'countrycode' => $countrycode,
'cid' => $contactid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
5102 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
5103 $rep .= $hookmanager->resPrint;
5105 if (empty($reshook)) {
5108 if ($withpicto ==
'fax') {
5109 $picto =
'phoning_fax';
5110 } elseif ($withpicto ==
'phone') {
5112 } elseif ($withpicto ==
'mobile') {
5113 $picto =
'phoning_mobile';
5118 if ($adddivfloat == 1) {
5119 $rep .=
'<div class="nospan float' . ($morecss ?
' ' . $morecss :
'') .
'">';
5120 } elseif (empty($adddivfloat)) {
5121 $rep .=
'<span' . ($morecss ?
' class="' . $morecss .
'"' :
'') .
'>';
5124 $rep .= $newphoneastart;
5125 $rep .= ($withpicto ?
img_picto($titlealt, $picto) :
'');
5126 if ($separ !=
'hidenum') {
5127 $rep .= ($withpicto ?
' ' :
'') . $newphone;
5129 $rep .= $newphoneaend;
5131 if ($adddivfloat == 1) {
5133 } elseif (empty($adddivfloat)) {
5154 if (!isset(
$conf->cache[
'resolveips'])) {
5155 $conf->cache[
'resolveips'] = array();
5161 if (file_exists(DOL_DOCUMENT_ROOT .
'/theme/common/flags/' . $countrycode .
'.png')) {
5164 $ret .=
'(' . $countrycode .
')';
5172 if (in_array($mode, [0, 2])) {
5175 if (!array_key_exists($ip,
$conf->cache[
'resolveips'])) {
5176 $domain = gethostbyaddr($ip);
5177 $conf->cache[
'resolveips'][$ip] = $domain;
5179 $domain =
$conf->cache[
'resolveips'][$ip];
5207 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5214 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
5215 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]\s]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
5216 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
5217 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
5219 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
5222 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_CLIENT_IP']);
5225 $ip = preg_replace(
'/,.*$/',
'', $_SERVER[
'HTTP_X_FORWARDED_FOR']);
5245 $datafile = $diroffile .
'/' .
getDolGlobalString(
'GEOIPMAXMIND_COUNTRY_DATAFILE_EMBEDDED');
5251 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5252 $geoip =
new DolGeoIP(
'country', $datafile);
5254 $countrycode = $geoip->getCountryCodeFromIP($ip);
5261 return $countrycode;
5273 global
$conf, $langs, $user;
5282 include_once DOL_DOCUMENT_ROOT .
'/core/class/dolgeoip.class.php';
5283 $geoip =
new DolGeoIP(
'country', $datafile);
5284 $countrycode = $geoip->getCountryCodeFromIP($ip);
5285 $ret = $countrycode;
5304 global $hookmanager;
5310 $parameters = array(
'element' => $element,
'id' =>
$id);
5311 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
5312 $out .= $hookmanager->resPrint;
5314 if (empty($reshook)) {
5315 if (empty($charfornl)) {
5316 $out .= nl2br((
string) $address);
5318 $out .= preg_replace(
'/[\r\n]+/', $charfornl, (
string) $address);
5322 $showgmap = $showomap = 0;
5348 $url =
dol_buildpath(
'/google/gmaps.php?mode=' . $element .
'&id=' .
$id, 1);
5349 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5352 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode=' . $element .
'&id=' .
$id, 1);
5353 $out .=
' <a href="' . $url .
'" target="_gmaps"><img id="' . $htmlid .
'_openstreetmap" class="valigntextbottom" src="' . DOL_URL_ROOT .
'/theme/common/gmap.png"></a>';
5375function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
5377 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
5380 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
5383 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
5401 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
5402 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
5405 if (function_exists(
'getmxrr')) {
5408 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
5409 if (count($mxhosts) > 1) {
5412 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
5449 $tmparray = explode(
' ', $s);
5450 foreach ($tmparray as $tmps) {
5465function dol_strlen($string, $stringencoding =
'UTF-8')
5467 if (is_null($string)) {
5471 if (function_exists(
'mb_strlen')) {
5472 return mb_strlen($string, $stringencoding);
5474 return strlen($string);
5488function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
5492 if (empty($stringencoding)) {
5493 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
5497 if (empty($trunconbytes)) {
5498 if (function_exists(
'mb_substr')) {
5499 $ret = mb_substr($string, $start, $length, $stringencoding);
5501 $ret = substr($string, $start, $length);
5504 if (function_exists(
'mb_strcut')) {
5505 $ret = mb_strcut($string, $start, $length, $stringencoding);
5507 $ret = substr($string, $start, $length);
5527function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
5535 if (empty($stringencoding)) {
5536 $stringencoding =
'UTF-8';
5539 if (!empty(
$conf->dol_optimize_smallscreen) &&
$conf->dol_optimize_smallscreen == 1 && $display == 1) {
5540 $size = round($size / 3);
5544 if ($trunc ==
'right') {
5546 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5548 return dol_substr($newstring, 0, $size, $stringencoding) . ($nodot ?
'' :
'…');
5553 } elseif ($trunc ==
'middle') {
5555 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5556 $size1 = (int) round($size / 2);
5557 $size2 = (int) round($size / 2);
5558 return dol_substr($newstring, 0, $size1, $stringencoding) .
'…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
5562 } elseif ($trunc ==
'left') {
5564 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
5566 return '…' .
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
5570 } elseif ($trunc ==
'wrap') {
5572 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
5578 return 'BadParam3CallingDolTrunc';
5592 $type2picto = array(
5593 'varchar' =>
'font',
5596 'int' =>
'sort-numeric-down',
5597 'double' =>
'sort-numeric-down',
5598 'price' =>
'currency',
5599 'pricecy' =>
'multicurrency',
5600 'password' =>
'key',
5601 'boolean' =>
'check-square',
5602 'date' =>
'calendar',
5603 'datetime' =>
'calendar',
5604 'duration' =>
'hourglass',
5610 'sellist' =>
'list',
5611 'stars' =>
'fontawesome_star_fas',
5612 'radio' =>
'check-circle',
5613 'checkbox' =>
'list',
5614 'chkbxlst' =>
'list',
5616 'icon' =>
"question",
5617 'point' =>
"country",
5618 'multipts' =>
'country',
5619 'linestrg' =>
"country",
5620 'polygon' =>
"country",
5621 'separate' =>
'minus'
5624 if (!empty($type2picto[$key])) {
5625 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5628 return img_picto(
'',
'generic',
'class="pictofixedwidth' . ($morecss ?
' ' . $morecss :
'') .
'"');
5655function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2, $allowothertags = array())
5660 $url = DOL_URL_ROOT;
5661 $theme = isset(
$conf->theme) ?
$conf->theme :
null;
5662 $path =
'theme/' . $theme;
5663 if (empty($picto)) {
5668 $titlealt = str_replace(array(
'\n',
"\n"),
' - ', $titlealt);
5672 if ($pictoisfullpath) {
5674 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5677 $fullpathpicto = $picto;
5679 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5680 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5681 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5686 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5687 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5688 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5691 $pictoconvertkey = array(
5692 'facture' =>
'bill',
5693 'shipping' =>
'shipment',
5694 'fichinter' =>
'intervention',
5695 'agenda' =>
'calendar',
5696 'invoice_supplier' =>
'supplier_invoice',
5697 'order_supplier' =>
'supplier_order');
5698 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5699 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5702 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5704 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5705 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5708 if ($pictowithouttext ==
'file-o') {
5709 $pictowithouttext =
'file';
5712 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5713 $marginleftonlyshort = 0;
5715 if (!empty($pictowithouttextarray[1])) {
5717 $fakey =
'fa-' . $pictowithouttextarray[0];
5718 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5719 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5720 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5722 $fakey =
'fa-' . $pictowithouttext;
5732 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5733 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
5734 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
5736 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5737 $morestyle = $reg[1];
5738 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
5740 $moreatt = trim($moreatt);
5742 $enabledisablehtml =
'<span class="' . $faprefix .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5743 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
5744 $enabledisablehtml .=
'</span>';
5746 return $enabledisablehtml;
5749 if (empty($srconly) && !preg_match(
'/[\.\/@]/', $picto)) {
5750 $fakey = $pictowithouttext;
5754 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'))) {
5757 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'))) {
5763 if ($pictowithouttext ==
'off') {
5764 $fakey =
'fa-square';
5766 } elseif ($pictowithouttext ==
'on') {
5767 $fakey =
'fa-check-square';
5769 } elseif ($pictowithouttext ==
'listlight') {
5770 $fakey =
'fa-download';
5771 $marginleftonlyshort = 1;
5772 } elseif ($pictowithouttext ==
'printer') {
5773 $fakey =
'fa-print';
5775 } elseif ($pictowithouttext ==
'note') {
5776 $fakey =
'fa-sticky-note';
5777 $marginleftonlyshort = 1;
5778 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5779 $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');
5780 $fakey =
'fa-' . $convertarray[$pictowithouttext];
5781 if (preg_match(
'/selected/', $pictowithouttext)) {
5784 $marginleftonlyshort = 1;
5785 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5786 $fakey =
'fa-' . $arrayconvpictotofa[$pictowithouttext];
5788 $fakey =
'fa-' . $pictowithouttext;
5791 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5792 $morecss .=
' em092';
5794 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'eventorganization',
'holiday',
'info',
'info_black',
'project',
'workstation'))) {
5795 $morecss .=
' em088';
5797 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5798 $morecss .=
' em080';
5802 $arrayconvpictotomarginleftonly = array(
5832 '1uparrow_selected',
5833 '1downarrow_selected',
5834 '1leftarrow_selected',
5835 '1rightarrow_selected'
5837 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5838 $marginleftonlyshort = 0;
5842 $arrayconvpictotomorcess = array(
5843 'action' =>
'infobox-action',
5844 'account' =>
'infobox-bank_account',
5845 'accounting_account' =>
'infobox-bank_account',
5846 'accountline' =>
'infobox-bank_account',
5847 'accountancy' =>
'infobox-bank_account',
5848 'admin' =>
'opacitymedium',
5849 'asset' =>
'infobox-bank_account',
5850 'bank_account' =>
'infobox-bank_account',
5851 'bill' =>
'infobox-commande',
5852 'billa' =>
'infobox-commande',
5853 'billr' =>
'infobox-commande',
5854 'billd' =>
'infobox-commande',
5855 'bookcal' =>
'infobox-portal',
5856 'margin' =>
'infobox-bank_account',
5857 'conferenceorbooth' =>
'infobox-project',
5858 'cash-register' =>
'infobox-portal',
5859 'contract' =>
'infobox-contrat',
5860 'check' =>
'font-status4',
5861 'conversation' =>
'infobox-contrat',
5862 'donation' =>
'infobox-commande',
5863 'dolly' =>
'infobox-commande',
5864 'dollyrevert' =>
'flip infobox-order_supplier',
5865 'ecm' =>
'infobox-action',
5866 'eventorganization' =>
'infobox-project',
5867 'hrm' =>
'infobox-adherent',
5868 'group' =>
'infobox-adherent',
5869 'intervention' =>
'infobox-contrat',
5870 'incoterm' =>
'infobox-supplier_proposal',
5871 'intracommreport' =>
'infobox-bank_account',
5872 'currency' =>
'infobox-bank_account',
5873 'multicurrency' =>
'infobox-bank_account',
5874 'members' =>
'infobox-adherent',
5875 'member' =>
'infobox-adherent',
5876 'money-bill-alt' =>
'infobox-bank_account',
5877 'order' =>
'infobox-commande',
5878 'user' =>
'infobox-adherent',
5879 'users' =>
'infobox-adherent',
5880 'error' =>
'pictoerror',
5881 'warning' =>
'pictowarning',
5882 'switch_on' =>
'font-status4',
5883 'switch_on_warning' =>
'font-status4 warning',
5884 'switch_on_red' =>
'font-status8',
5885 'switch_off_warning' =>
'font-status4 warning',
5886 'switch_off_red' =>
'font-status8',
5887 'holiday' =>
'infobox-holiday',
5888 'info' =>
'opacityhigh',
5889 'info_black' =>
'purple',
5890 'invoice' =>
'infobox-commande',
5891 'knowledgemanagement' =>
'infobox-contrat rotate90',
5892 'loan' =>
'infobox-commande',
5893 'payment' =>
'infobox-bank_account',
5894 'payment_vat' =>
'infobox-bank_account',
5895 'poll' =>
'infobox-portal',
5896 'pos' =>
'infobox-bank_account',
5897 'project' =>
'infobox-project',
5898 'projecttask' =>
'infobox-project',
5899 'propal' =>
'infobox-propal',
5900 'proposal' =>
'infobox-propal',
5901 'private' =>
'infobox-project',
5902 'reception' =>
'flip infobox-order_supplier',
5903 'recruitmentjobposition' =>
'infobox-adherent',
5904 'recruitmentcandidature' =>
'infobox-adherent',
5905 'resource' =>
'infobox-action',
5906 'salary' =>
'infobox-commande',
5907 'shapes' =>
'infobox-adherent',
5908 'shipment' =>
'infobox-commande',
5909 'store' =>
'infobox-portal',
5910 'stripe' =>
'infobox-bank_account',
5911 'supplier_invoice' =>
'infobox-order_supplier',
5912 'supplier_invoicea' =>
'infobox-order_supplier',
5913 'supplier_invoiced' =>
'infobox-order_supplier',
5914 'supplier_invoicer' =>
'infobox-order_supplier',
5915 'supplier' =>
'infobox-order_supplier',
5916 'supplier_order' =>
'infobox-order_supplier',
5917 'supplier_proposal' =>
'infobox-supplier_proposal',
5918 'ticket' =>
'infobox-contrat',
5919 'title_accountancy' =>
'infobox-bank_account',
5920 'title_hrm' =>
'infobox-holiday',
5921 'expensereport' =>
'infobox-expensereport',
5922 'trip' =>
'infobox-expensereport',
5923 'title_agenda' =>
'infobox-action',
5924 'vat' =>
'infobox-bank_account',
5925 'webportal' =>
'infobox-portal',
5926 'website' =>
'infobox-portal',
5928 'list-alt' =>
'imgforviewmode',
5929 'calendar' =>
'imgforviewmode',
5930 'calendarweek' =>
'imgforviewmode',
5931 'calendarmonth' =>
'imgforviewmode',
5932 'calendarday' =>
'imgforviewmode',
5933 'calendarperuser' =>
'imgforviewmode',
5934 'calendarpertype' =>
'imgforviewmode'
5936 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5937 $morecss .= ($morecss ?
' ' :
'') . $arrayconvpictotomorcess[$pictowithouttext];
5941 $arrayconvpictotocolor = array(
5942 'address' =>
'#6c6aa8',
5943 'building' =>
'#6c6aa8',
5947 'companies' =>
'#6c6aa8',
5948 'company' =>
'#6c6aa8',
5949 'contact' =>
'#6c6aa8',
5951 'dynamicprice' =>
'#a69944',
5956 'listlight' =>
'#999',
5957 'language' =>
'#555',
5961 'map-marker-alt' =>
'#aaa',
5963 'product' =>
'#a69944',
5964 'service' =>
'#a69944',
5965 'inventory' =>
'#a69944',
5966 'stock' =>
'#a69944',
5967 'movement' =>
'#a69944',
5969 'world' =>
'#986c6a',
5970 'partnership' =>
'#6c6aa8',
5971 'playdisabled' =>
'#ccc',
5972 'printer' =>
'#444',
5973 'projectpub' =>
'#986c6a',
5977 'search-plus' =>
'#808080',
5978 'security' =>
'#999',
5980 'stop-circle' =>
'#888',
5982 'superadmin' =>
'#600',
5983 'switch_off' =>
'#999',
5984 'technic' =>
'#999',
5986 'timespent' =>
'#555',
5987 'uncheck' =>
'#800',
5988 'uparrow' =>
'#555',
5989 'user-cog' =>
'#999',
5990 'country' =>
'#aaa',
5991 'globe-americas' =>
'#aaa',
5995 'workstation' =>
'#a69944'
5997 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5998 $facolor = $arrayconvpictotocolor[$pictowithouttext];
6005 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
6006 $morecss .= ($morecss ?
' ' :
'') . $reg[1];
6007 $moreatt = str_replace(
'class="' . $reg[1] .
'"',
'', $moreatt);
6009 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
6010 $morestyle = $reg[1];
6011 $moreatt = str_replace(
'style="' . $reg[1] .
'"',
'', $moreatt);
6013 $moreatt = trim($moreatt);
6015 $enabledisablehtml =
'<span class="' . $fa .
' ' . $fakey . ($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
6016 $enabledisablehtml .= ($morecss ?
' ' . $morecss :
'') .
'" style="' . ($fasize ? (
'font-size: ' . $fasize .
';') :
'') . ($facolor ? (
' color: ' . $facolor .
';') :
'') . ($morestyle ?
' ' . $morestyle :
'') .
'"' . (($notitle || empty($titlealt)) ?
'' :
' title="' .
dol_escape_htmltag($titlealt) .
'"') . ($moreatt ?
' ' . $moreatt :
'') .
'>';
6017 $enabledisablehtml .=
'</span>';
6019 return $enabledisablehtml;
6026 } elseif (!empty(
$conf->modules_parts[
'theme']) && array_key_exists($theme,
$conf->modules_parts[
'theme'])) {
6027 $path = $theme .
'/theme/' . $theme;
6032 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
6038 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
6043 foreach (
$conf->file->dol_document_root as $type => $dirroot) {
6044 if ($type ==
'main') {
6048 if (file_exists($dirroot .
'/' . $path .
'/img/' . $picto) && !empty(
$conf->file->dol_url_root)) {
6049 $url = DOL_URL_ROOT .
$conf->file->dol_url_root[$type];
6055 $fullpathpicto = $url .
'/' . $path .
'/img/' . $picto;
6059 return $fullpathpicto;
6063 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 :
'') .
'"') .
'>';
6077 if (empty($mode) || $mode ==
'fa') {
6079 $arrayconvpictotofa = array(
6080 'account' =>
'university',
6081 'accounting_account' =>
'clipboard-list',
6082 'accountline' =>
'receipt',
6083 'accountancy' =>
'search-dollar',
6084 'action' =>
'calendar-alt',
6085 'add' =>
'plus-circle',
6086 'address' =>
'address-book',
6089 'asset' =>
'money-check-alt',
6090 'autofill' =>
'fill',
6091 'back' =>
'arrow-left',
6092 'bank_account' =>
'university',
6093 'bill' =>
'file-invoice-dollar',
6094 'billa' =>
'file-excel',
6095 'billr' =>
'file-invoice-dollar',
6096 'billd' =>
'file-medical',
6097 'blockedlog' =>
'file-archive',
6098 'bookcal' =>
'calendar-check',
6099 'supplier_invoice' =>
'file-invoice-dollar',
6100 'supplier_invoicea' =>
'file-excel',
6101 'supplier_invoicer' =>
'file-invoice-dollar',
6102 'supplier_invoiced' =>
'file-medical',
6104 'card' =>
'address-card',
6105 'chart' =>
'chart-line',
6106 'company' =>
'building',
6107 'contact' =>
'address-book',
6108 'contract' =>
'suitcase',
6109 'collab' =>
'people-arrows',
6110 'conversation' =>
'comments',
6111 'country' =>
'globe-americas',
6112 'cron' =>
'business-time',
6114 'chevron-double-left' =>
'angle-double-left',
6115 'chevron-double-right' =>
'angle-double-right',
6116 'chevron-double-down' =>
'angle-double-down',
6117 'chevron-double-top' =>
'angle-double-up',
6118 'donation' =>
'gift',
6119 'dynamicprice' =>
'hand-holding-usd',
6121 'companies' =>
'building',
6122 'products' =>
'cube',
6123 'commercial' =>
'suitcase',
6124 'invoicing' =>
'coins',
6125 'accounting' =>
'search-dollar',
6126 'category' =>
'tag',
6127 'dollyrevert' =>
'dolly',
6129 'generate' =>
'plus-square',
6130 'hrm' =>
'user-tie',
6131 'incoterm' =>
'truck-loading',
6132 'margin' =>
'calculator',
6133 'members' =>
'user-friends',
6134 'ticket' =>
'ticket-alt',
6135 'globe' =>
'external-link-alt',
6138 'establishment' =>
'building',
6139 'edit' =>
'pencil-alt',
6140 'entity' =>
'globe',
6141 'graph' =>
'chart-line',
6142 'grip_title' =>
'arrows-alt',
6143 'grip' =>
'arrows-alt',
6144 'help' =>
'question-circle',
6145 'generic' =>
'file',
6146 'holiday' =>
'umbrella-beach',
6147 'info' =>
'info-circle',
6148 'info_black' =>
'info-circle',
6149 'inventory' =>
'boxes',
6150 'intracommreport' =>
'globe-europe',
6151 'jobprofile' =>
'cogs',
6152 'knowledgemanagement' =>
'ticket-alt',
6153 'label' =>
'layer-group',
6154 'layout' =>
'columns',
6156 'loan' =>
'money-bill-alt',
6157 'member' =>
'user-alt',
6158 'meeting' =>
'chalkboard-teacher',
6160 'next' =>
'arrow-alt-circle-right',
6162 'expensereport' =>
'wallet',
6164 'movement' =>
'people-carry',
6165 'sign-out' =>
'sign-out-alt',
6166 'superadmin' =>
'star',
6167 'switch_off' =>
'toggle-off',
6168 'switch_off_grey' =>
'toggle-off',
6169 'switch_off_warning' =>
'toggle-off',
6170 'switch_off_red' =>
'toggle-off',
6171 'switch_on' =>
'toggle-on',
6172 'switch_on_grey' =>
'toggle-on',
6173 'switch_on_warning' =>
'toggle-on',
6174 'switch_on_red' =>
'toggle-on',
6176 'bookmark' =>
'star',
6177 'bank' =>
'university',
6178 'close_title' =>
'times',
6179 'delete' =>
'trash',
6180 'filter' =>
'filter',
6181 'list-alt' =>
'list-alt',
6182 'calendarlist' =>
'bars',
6183 'calendar' =>
'calendar-alt',
6184 'calendarmonth' =>
'calendar-alt',
6185 'calendarweek' =>
'calendar-week',
6186 'calendarday' =>
'calendar-day',
6187 'calendarperuser' =>
'table',
6188 'calendarpertype' =>
'table',
6189 'intervention' =>
'ambulance',
6190 'invoice' =>
'file-invoice-dollar',
6191 'order' =>
'file-invoice',
6192 'error' =>
'exclamation-triangle',
6193 'warning' =>
'exclamation-triangle',
6194 'other' =>
'square',
6195 'playdisabled' =>
'play',
6196 'pdf' =>
'file-pdf',
6197 'poll' =>
'check-double',
6198 'pos' =>
'cash-register',
6199 'preview' =>
'binoculars',
6200 'project' =>
'project-diagram',
6201 'projectpub' =>
'project-diagram',
6202 'projecttask' =>
'tasks',
6203 'propal' =>
'file-signature',
6204 'proposal' =>
'file-signature',
6205 'partnership' =>
'handshake',
6206 'payment' =>
'money-check-alt',
6207 'payment_vat' =>
'money-check-alt',
6208 'pictoconfirm' =>
'check-square',
6209 'phoning' =>
'phone',
6210 'phoning_mobile' =>
'mobile-alt',
6211 'phoning_fax' =>
'fax',
6212 'previous' =>
'arrow-alt-circle-left',
6213 'printer' =>
'print',
6214 'product' =>
'cube',
6215 'puce' =>
'angle-right',
6216 'recent' =>
'check-square',
6217 'reception' =>
'dolly',
6218 'recruitmentjobposition' =>
'id-card-alt',
6219 'recruitmentcandidature' =>
'id-badge',
6221 'supplier_order' =>
'dol-order_supplier',
6222 'supplier_proposal' =>
'file-signature',
6223 'refresh' =>
'redo',
6224 'region' =>
'map-marked',
6225 'replacement' =>
'exchange-alt',
6226 'resource' =>
'laptop-house',
6227 'recurring' =>
'history',
6228 'service' =>
'concierge-bell',
6229 'skill' =>
'shapes',
6230 'state' =>
'map-marked-alt',
6231 'security' =>
'key',
6232 'salary' =>
'wallet',
6233 'shipment' =>
'dolly',
6234 'stock' =>
'box-open',
6235 'stats' =>
'chart-bar',
6236 'split' =>
'code-branch',
6237 'status' =>
'stop-circle',
6238 'stripe' =>
'stripe-s',
6239 'supplier' =>
'building',
6240 'technic' =>
'cogs',
6242 'timespent' =>
'clock',
6243 'title_setup' =>
'tools',
6244 'title_accountancy' =>
'money-check-alt',
6245 'title_bank' =>
'university',
6246 'title_hrm' =>
'umbrella-beach',
6247 'title_agenda' =>
'calendar-alt',
6248 'uncheck' =>
'times',
6249 'uparrow' =>
'share',
6250 'url' =>
'external-link-alt',
6251 'vat' =>
'money-check-alt',
6252 'vcard' =>
'arrow-alt-circle-down',
6253 'jabber' =>
'comment',
6254 'website' =>
'globe-americas',
6255 'workstation' =>
'pallet',
6256 'webhook' =>
'bullseye',
6258 'private' =>
'user-lock',
6259 'conferenceorbooth' =>
'chalkboard-teacher',
6260 'eventorganization' =>
'project-diagram',
6261 'webportal' =>
'door-open'
6264 if (
$conf->currency ==
'EUR') {
6265 $arrayconvpictotofa[
'currency'] =
'euro-sign';
6266 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
6268 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
6269 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
6272 $arrayconvpictotofa = array();
6275 return $arrayconvpictotofa;
6293function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $allowothertags = array())
6295 if (strpos($picto,
'^') === 0) {
6296 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6298 return img_picto($titlealt,
'object_' . $picto, $moreatt, $pictoisfullpath, $srconly, $notitle,
'',
'', 2, $allowothertags);
6313function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
6317 if (is_numeric($picto)) {
6320 return '<i class="fa fa-weather-level' . $picto .
'"></i>';
6321 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6325 $path = DOL_URL_ROOT .
'/theme/' .
$conf->theme .
'/img/weather/' . $picto;
6327 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
6341function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
6345 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
6349 if ($pictoisfullpath) {
6352 $path = DOL_URL_ROOT .
'/theme/common/' . $picto;
6355 $themepath = DOL_DOCUMENT_ROOT .
'/theme/' .
$conf->theme .
'/img/' . $picto;
6357 if (file_exists($themepath)) {
6363 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
6379function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
6383 if (empty($titlealt) || $titlealt ==
'default') {
6384 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
6386 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
6387 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
6389 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
6390 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
6392 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
6393 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
6395 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
6396 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
6398 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
6400 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus ' . $numaction);
6404 if (!is_numeric($numaction)) {
6408 return img_picto($titlealt, (empty($picto) ?
'stcomm' . $numaction .
'.png' : $picto), $moreatt);
6418function img_edit_add($titlealt =
'default', $other =
'')
6422 if ($titlealt ==
'default') {
6423 $titlealt = $langs->trans(
'Add');
6426 return img_picto($titlealt,
'edit_add.png', $other);
6439 if ($titlealt ==
'default') {
6440 $titlealt = $langs->trans(
'Remove');
6443 return img_picto($titlealt,
'edit_remove.png', $other);
6454function img_edit($titlealt =
'default', $float = 0, $other =
'')
6458 if ($titlealt ==
'default') {
6459 $titlealt = $langs->trans(
'Modify');
6462 return img_picto($titlealt,
'edit', ($float ?
'style="float: ' . ($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right') .
'"' :
"") . ($other ?
' ' . $other :
''));
6473function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
6477 if ($titlealt ==
'default') {
6478 $titlealt = $langs->trans(
'View');
6481 $moreatt = ($float ?
'style="float: right" ' :
'') . $other;
6483 return img_picto($titlealt,
'eye', $moreatt);
6494function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
6498 if ($titlealt ==
'default') {
6499 $titlealt = $langs->trans(
'Delete');
6502 return img_picto($titlealt,
'delete', $other, 0, 0, 0,
'', $morecss);
6512function img_printer($titlealt =
"default", $other =
'')
6515 if ($titlealt ==
"default") {
6516 $titlealt = $langs->trans(
"Print");
6518 return img_picto($titlealt,
'printer', $other);
6528function img_split($titlealt =
'default', $other =
'class="pictosplit"')
6532 if ($titlealt ==
'default') {
6533 $titlealt = $langs->trans(
'Split');
6536 return img_picto($titlealt,
'split', $other);
6546function img_help($usehelpcursor = 1, $usealttitle = 1)
6551 if (is_string($usealttitle)) {
6554 $usealttitle = $langs->trans(
'Info');
6558 return img_picto($usealttitle,
'info',
'style="vertical-align: middle;' . ($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')) .
'"');
6567function img_info($titlealt =
'default')
6571 if ($titlealt ==
'default') {
6572 $titlealt = $langs->trans(
'Informations');
6575 return img_picto($titlealt,
'info',
'style="vertical-align: middle;"');
6586function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
6590 if ($titlealt ==
'default') {
6591 $titlealt = $langs->trans(
'Warning');
6595 return img_picto($titlealt,
'warning',
'class="' . $morecss .
'"' . ($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' ' . $moreatt) :
''));
6604function img_error($titlealt =
'default')
6608 if ($titlealt ==
'default') {
6609 $titlealt = $langs->trans(
'Error');
6622function img_next($titlealt =
'default', $moreatt =
'')
6626 if ($titlealt ==
'default') {
6627 $titlealt = $langs->trans(
'Next');
6631 return '<span class="fa fa-chevron-right paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6641function img_previous($titlealt =
'default', $moreatt =
'')
6645 if ($titlealt ==
'default') {
6646 $titlealt = $langs->trans(
'Previous');
6650 return '<span class="fa fa-chevron-left paddingright paddingleft" title="' .
dol_escape_htmltag($titlealt) .
'"></span>';
6661function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
6665 if ($titlealt ==
'default') {
6666 $titlealt = $langs->trans(
'Down');
6669 return img_picto($titlealt, ($selected ?
'1downarrow_selected' :
'1downarrow'),
'class="imgdown' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6680function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
6684 if ($titlealt ==
'default') {
6685 $titlealt = $langs->trans(
'Up');
6688 return img_picto($titlealt, ($selected ?
'1uparrow_selected' :
'1uparrow'),
'class="imgup' . ($moreclass ?
" " . $moreclass :
"") .
'"');
6699function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
6703 if ($titlealt ==
'default') {
6704 $titlealt = $langs->trans(
'Left');
6707 return img_picto($titlealt, ($selected ?
'1leftarrow_selected' :
'1leftarrow'), $moreatt);
6718function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
6722 if ($titlealt ==
'default') {
6723 $titlealt = $langs->trans(
'Right');
6726 return img_picto($titlealt, ($selected ?
'1rightarrow_selected' :
'1rightarrow'), $moreatt);
6736function img_allow($allow, $titlealt =
'default')
6740 if ($titlealt ==
'default') {
6741 $titlealt = $langs->trans(
'Active');
6758function img_credit_card($brand, $morecss =
'fa-2x inline-block valignmiddle')
6760 if (is_null($morecss)) {
6764 if ($brand ==
'visa' || $brand ==
'Visa') {
6766 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
6767 $brand =
'cc-mastercard';
6768 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
6770 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
6771 $brand =
'cc-discover';
6772 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
6774 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
6775 $brand =
'cc-diners-club';
6776 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
6777 $brand =
'credit-card';
6780 return '<span class="fa fa-' . $brand .
' fa-fw' . ($morecss ?
' ' . $morecss :
'') .
'"></span>';
6791function img_mime($file, $titlealt =
'', $morecss =
'')
6793 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
6799 if (empty($titlealt)) {
6800 $titlealt =
'Mime type: ' . $mimetype;
6804 return '<i class="fa fa-' . $mimefa .
' ' . (preg_match(
'/pictofixedwidth/', $morecss) ?
'' :
'paddingright ') . ($morecss ?
' ' . $morecss :
'') .
'"' . ($titlealt ?
' title="' .
dolPrintHTMLForAttribute($titlealt) .
'"' :
'') .
'></i>';
6815function img_search($titlealt =
'default', $other =
'')
6819 if ($titlealt ==
'default') {
6820 $titlealt = $langs->trans(
'Search');
6823 $img =
img_picto($titlealt,
'search', $other, 0, 1);
6825 $input =
'<input type="image" class="liste_titre" name="button_search" src="' . $img .
'" ';
6842 if ($titlealt ==
'default') {
6843 $titlealt = $langs->trans(
'Search');
6846 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
6848 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="' . $img .
'" ';
6868function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'', $textonpictotooltip =
'', $cssfordropdown =
'info_admin')
6870 global
$conf, $langs;
6872 if ($infoonimgalt) {
6873 $result =
img_picto($text,
'info',
'class="' . ($morecss ?
' ' . $morecss :
'') .
'"');
6875 if (empty(
$conf->use_javascript_ajax)) {
6876 $textfordropdown =
'';
6879 $class = (empty($admin) ?
'undefined' : ((
string) $admin ==
'1' ?
'info' : $admin));
6880 $fa =
'info-circle';
6881 if ($picto ==
'warning') {
6882 $fa =
'exclamation-triangle';
6884 $result = ($nodiv ?
'' :
'<div class="wordbreak ' . $class . ($cssfordropdown ?
' ' . $cssfordropdown :
'') . ($morecss ?
' ' . $morecss :
'') . ($textfordropdown ?
' hidden' :
'') .
'">');
6885 $result .=
img_picto(((
string) $admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note')).($textonpictotooltip ?
' : '.$textonpictotooltip :
''), $fa);
6888 $result .= ($nodiv ?
'' :
'</div>');
6890 if ($textfordropdown) {
6891 $tmpresult =
'<span class="' . $class .
' '. $cssfordropdown.
'text opacitymedium cursorpointer">' . $langs->trans($textfordropdown) .
' ' .
img_picto($langs->trans($textfordropdown),
'1downarrow') .
'</span>';
6892 $tmpresult .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">
6893 jQuery(document).ready(function() {
6894 jQuery(".' . $cssfordropdown .
'text").click(function() {
6895 console.log("toggle text of .'.$cssfordropdown.
'");
6896 jQuery(".' . $cssfordropdown .
'").toggle().removeClass("hidden");
6901 $result = $tmpresult . $result;
6922 global
$conf, $langs, $user, $argv;
6923 global $dolibarr_main_prod;
6930 require_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
6932 $langs->load(
"main");
6936 $langs->loadLangs(array(
'main',
'errors'));
6938 if ($_SERVER[
'DOCUMENT_ROOT']) {
6939 $out .= $langs->trans(
"DolibarrHasDetectedError") .
".<br>\n";
6941 $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";
6943 $out .= $langs->trans(
"InformationToHelpDiagnose") .
":<br>\n";
6945 $out .=
"<b>" . $langs->trans(
"Date") .
":</b> " .
dol_print_date(time(),
'dayhourlog') .
"<br>\n";
6946 $out .=
"<b>" . $langs->trans(
"Dolibarr") .
":</b> " . DOL_VERSION .
" - https://www.dolibarr.org<br>\n";
6947 if (isset(
$conf->global->MAIN_FEATURES_LEVEL)) {
6948 $out .=
"<b>" . $langs->trans(
"LevelOfFeature") .
":</b> " .
getDolGlobalInt(
'MAIN_FEATURES_LEVEL') .
"<br>\n";
6950 if ($user instanceof
User) {
6951 $out .=
"<b>" . $langs->trans(
"Login") .
":</b> " . $user->login .
"<br>\n";
6953 if (function_exists(
"phpversion")) {
6954 $out .=
"<b>" . $langs->trans(
"PHP") .
":</b> " . phpversion() .
"<br>\n";
6956 $out .=
"<b>" . $langs->trans(
"Server") .
":</b> " . (isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'') .
"<br>\n";
6957 if (function_exists(
"php_uname")) {
6958 $out .=
"<b>" . $langs->trans(
"OS") .
":</b> " . php_uname() .
"<br>\n";
6960 $out .=
"<b>" . $langs->trans(
"UserAgent") .
":</b> " . (isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'') .
"<br>\n";
6962 $out .=
"<b>" . $langs->trans(
"RequestedUrl") .
":</b> " . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT) :
'') .
"<br>\n";
6963 $out .=
"<b>" . $langs->trans(
"Referer") .
":</b> " . (isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'') .
"<br>\n";
6964 $out .=
"<b>" . $langs->trans(
"MenuManager") .
":</b> " . (isset(
$conf->standard_menu) ?
dol_htmlentities(
$conf->standard_menu, ENT_COMPAT) :
'') .
"<br>\n";
6966 $syslog .=
"url=" . (isset($_SERVER[
"REQUEST_URI"]) ?
dol_escape_htmltag($_SERVER[
"REQUEST_URI"]) :
'');
6967 $syslog .=
", query_string=" . (isset($_SERVER[
"QUERY_STRING"]) ?
dol_escape_htmltag($_SERVER[
"QUERY_STRING"]) :
'');
6969 $out .=
'> ' . $langs->transnoentities(
"ErrorInternalErrorDetected") .
":\n" . $argv[0] .
"\n";
6973 if (!empty(
$conf->modules)) {
6974 $out .=
"<b>" . $langs->trans(
"Modules") .
":</b> " . implode(
', ',
$conf->modules) .
"<br>\n";
6977 if (is_object(
$db)) {
6978 if ($_SERVER[
'DOCUMENT_ROOT']) {
6979 $out .=
"<b>" . $langs->trans(
"DatabaseTypeManager") .
":</b> " .
$db->type .
"<br>\n";
6980 $lastqueryerror =
$db->lastqueryerror();
6982 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6984 $out .=
"<b>" . $langs->trans(
"RequestLastAccessInError") .
":</b> " . ($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6985 $out .=
"<b>" . $langs->trans(
"ReturnCodeLastAccessInError") .
":</b> " . (
$db->lasterrno() ?
dol_escape_htmltag(
$db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6986 $out .=
"<b>" . $langs->trans(
"InformationLastAccessInError") .
":</b> " . (
$db->lasterror() ?
dol_escape_htmltag(
$db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")) .
"<br>\n";
6990 $out .=
'> ' . $langs->transnoentities(
"DatabaseTypeManager") .
":\n" .
$db->type .
"\n";
6991 $out .=
'> ' . $langs->transnoentities(
"RequestLastAccessInError") .
":\n" . (
$db->lastqueryerror() ?
$db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6992 $out .=
'> ' . $langs->transnoentities(
"ReturnCodeLastAccessInError") .
":\n" . (
$db->lasterrno() ?
$db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6993 $out .=
'> ' . $langs->transnoentities(
"InformationLastAccessInError") .
":\n" . (
$db->lasterror() ?
$db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")) .
"\n";
6995 $syslog .=
", sql=" .
$db->lastquery();
6996 $syslog .=
", db_error=" .
$db->lasterror();
6999 if ($error || $errors) {
7001 if (is_array($error) && is_array($errors)) {
7002 $errors = array_merge($error, $errors);
7003 } elseif (is_array($error)) {
7005 } elseif (is_array($errors) && !empty($error)) {
7006 $errors = array_merge(array($error), $errors);
7007 } elseif (!empty($error)) {
7008 $errors = array_merge(array($error), array($errors));
7011 $langs->load(
"errors");
7013 foreach ($errors as $msg) {
7017 if ($_SERVER[
'DOCUMENT_ROOT']) {
7018 $out .=
"<b>" . $langs->trans(
"Message") .
":</b> " .
dol_escape_htmltag($msg) .
"<br>\n";
7020 $out .=
'> ' . $langs->transnoentities(
"Message") .
":\n" . $msg .
"\n";
7022 $syslog .=
", msg=" . $msg;
7025 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
7026 xdebug_print_function_stack();
7027 $out .=
'<b>XDebug information:</b>' .
"<br>\n";
7028 $out .=
'File: ' . xdebug_call_file() .
"<br>\n";
7029 $out .=
'Line: ' . xdebug_call_line() .
"<br>\n";
7030 $out .=
'Function: ' . xdebug_call_function() .
"<br>\n";
7035 if (!headers_sent()) {
7036 if (function_exists(
'top_httphead')) {
7040 http_response_code(202);
7043 if (empty($dolibarr_main_prod)) {
7046 if (empty($langs->defaultlang)) {
7047 $langs->setDefaultLang();
7049 $langs->loadLangs(array(
"main",
"errors"));
7051 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";
7052 print $langs->trans(
"DolibarrHasDetectedError") .
'. ';
7053 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
7054 if (!defined(
"MAIN_CORE_ERROR")) {
7055 define(
"MAIN_CORE_ERROR", 1);
7072function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
7076 if (empty($email)) {
7080 $langs->load(
"errors");
7083 print
'<br><div class="center login_main_message"><div class="' . $morecss .
'">';
7084 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode .
'-' .
dol_print_date($now,
'%Y%m%d%H%M%S'));
7085 if ($errormessage) {
7086 print
'<br><br>' . $errormessage;
7088 if (is_array($errormessages) && count($errormessages)) {
7089 foreach ($errormessages as $mesgtoshow) {
7090 print
'<br><br>' . $mesgtoshow;
7093 print
'</div></div>';
7112function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $param =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
7114 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $param, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
7135function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
7137 global $langs, $form;
7140 if ($moreattrib ==
'class="right"') {
7141 $prefix .=
'right ';
7144 $tooltip = (
string) $tooltip;
7146 $sortorder = strtoupper((
string) $sortorder);
7155 $tmpsortfield = explode(
',', (
string) $sortfield);
7156 $sortfield1 = trim($tmpsortfield[0]);
7157 $tmpfield = explode(
',', $field);
7158 $field1 = trim($tmpfield[0]);
7160 if (strpos((
string) $tooltip,
':') !==
false) {
7161 $tmptooltip = explode(
':', (
string) $tooltip);
7163 $tmptooltip = array($tooltip);
7166 $wrapcolumntitle = (empty($forcenowrapcolumntitle) || (!empty($tmptooltip[2]) && $tmptooltip[2] ==
'-1'));
7168 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && $wrapcolumntitle) {
7169 $prefix =
'wrapcolumntitle ' . $prefix;
7175 $liste_titre =
'liste_titre';
7176 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
7177 $liste_titre =
'liste_titre_sel';
7180 $tagstart =
'<' . $tag .
' class="' . $prefix . $liste_titre .
'" ' . $moreattrib;
7185 if (empty($thead) && $field && empty($disablesortlink)) {
7186 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7187 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7188 $options = preg_replace(
'/&+/i',
'&', $options);
7189 if (!preg_match(
'/^&/', $options)) {
7190 $options =
'&' . $options;
7193 $sortordertouseinlink =
'';
7194 if ($field1 != $sortfield1) {
7195 if (preg_match(
'/^DESC/i', $sortorder)) {
7196 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7198 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7201 if (preg_match(
'/^ASC/i', $sortorder)) {
7202 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
7204 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
7207 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
7208 $out .=
'<a class="reposition" href="' .
dolBuildUrl($file, [
'sortfield' => $field,
'sortorder' => $sortordertouseinlink,
'begin' => $begin]) . $options .
'"';
7212 if ($tooltip && $tmptooltip[0]) {
7214 $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]));
7216 $out .= $langs->trans((
string) $name);
7219 if (empty($thead) && $field && empty($disablesortlink)) {
7223 if (empty($thead) && $field) {
7224 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
7225 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
7226 $options = preg_replace(
'/&+/i',
'&', $options);
7227 if (!preg_match(
'/^&/', $options)) {
7228 $options =
'&' . $options;
7231 if (!$sortorder || ($field1 != $sortfield1)) {
7234 if (preg_match(
'/^DESC/', $sortorder)) {
7235 $sortimg .=
'<span class="nowrap">' .
img_up(
"Z-A", 0,
'paddingright') .
'</span>';
7237 if (preg_match(
'/^ASC/', $sortorder)) {
7238 $sortimg .=
'<span class="nowrap">' .
img_down(
"A-Z", 0,
'paddingright') .
'</span>';
7243 $tagend =
'</' . $tag .
'>';
7245 $out = $tagstart . $sortimg . $out . $tagend;
7260 dol_syslog(__FUNCTION__ .
" is deprecated", LOG_WARNING);
7262 print
'<div class="titre">' . $title .
'</div>';
7276function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
7295function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'', $morecssonpicto =
'widthpictotitle')
7299 if ($picto ==
'setup') {
7304 $return .=
'<table ' . (
$id ?
'id="' .
$id .
'" ' :
'') .
'class="centpercent notopnoleftnoright table-fiche-title' . ($morecssontable ?
' ' . $morecssontable :
'') .
'">';
7305 $return .=
'<tr class="toptitle">';
7307 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">' .
img_picto(
'', $picto,
'class="valignmiddle pictotitle'.($morecssonpicto ?
' '.$morecssonpicto :
'').
'"', $pictoisfullpath) .
'</td>';
7309 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
7310 $return .=
'<div class="titre inline-block">';
7311 $return .=
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7312 $return .=
'</div>';
7315 $return .=
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7318 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">' . $morehtmlright .
'</td>';
7320 $return .=
'</tr></table>' .
"\n";
7348function 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 =
'')
7350 global
$conf, $langs;
7353 $savtotalnboflines = $totalnboflines;
7354 if (is_numeric($totalnboflines)) {
7355 $totalnboflines = abs($totalnboflines);
7360 $tmparray = preg_split(
'/<br>/i', $title, 2);
7361 if (!empty($tmparray[1])) {
7362 $title = $tmparray[0];
7363 $subtitle = $tmparray[1];
7366 $page = (int) $page;
7368 if ($picto ==
'setup') {
7369 $picto =
'title_setup';
7371 if ((
$conf->browser->name ==
'ie') && $picto ==
'generic') {
7372 $picto =
'title.gif';
7375 $limit =
$conf->liste_limit;
7378 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
7386 print
"<!-- Begin print_barre_liste -->\n";
7387 print
'<table class="centpercent notopnoleftnoright table-fiche-title' . ($morecss ?
' ' . $morecss :
'') .
'">';
7388 print
'<tr class="toptitle">';
7392 if ($picto && $title) {
7393 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
7394 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
7398 print
'<td class="nobordernopadding valignmiddle col-title">';
7399 print
'<div class="titre inline-block nowrap">';
7400 print
'<span class="inline-block valignmiddle print-barre-liste">' . $title .
'</span>';
7401 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
7402 if (is_numeric($totalnboflines) && (
int) $totalnboflines > 0) {
7403 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="' . $langs->trans(
"NbRecordQualified") .
'">(' . $totalnboflines .
')</span>';
7405 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle">(' . $totalnboflines .
')</span>';
7409 if (!empty($subtitle)) {
7410 print
'<br><div class="subtitle inline-block hideonsmartphone">' . $subtitle .
'</div>';
7415 if ($morehtmlcenter && empty(
$conf->dol_optimize_smallscreen)) {
7416 print
'<td class="nobordernopadding center valignmiddle col-center">' . $morehtmlcenter .
'</td>';
7420 print
'<td class="nobordernopadding valignmiddle right col-right">';
7421 print
'<input type="hidden" name="pageplusoneold" value="' . ((int) $page + 1) .
'">';
7423 parse_str($options, $query);
7425 $query += [
'sortfield' => $sortfield];
7428 $query += [
'sortorder' => $sortorder];
7431 $options =
'&' . http_build_query($query);
7433 $query = array_merge($query, [
'page' => $page]);
7437 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
7438 if ($totalnboflines) {
7440 $maxnbofpage = (empty(
$conf->dol_optimize_smallscreen) ? 4 : 0);
7443 $nbpages = ceil($totalnboflines / $limit);
7447 $cpt = ($page - $maxnbofpage);
7453 if (empty($pagenavastextinput)) {
7455 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">1</a></li>';
7457 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7458 } elseif ($cpt == 2) {
7460 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">2</a></li>';
7466 if ($pagenavastextinput) {
7467 if ($cpt == $page) {
7468 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="' . ($totalnboflines > 100 ?
'width40' :
'width25') .
' center pageplusone heightofcombo" name="pageplusone" value="' . ($page + 1) .
'"></li>';
7472 if ($cpt == $page) {
7473 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
'</span></li>';
7475 $query[
'page'] = $cpt;
7476 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($cpt + 1) .
'</a></li>';
7480 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
7482 if (empty($pagenavastextinput)) {
7483 if ($cpt < $nbpages) {
7484 if ($cpt < $nbpages - 2) {
7485 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
7486 } elseif ($cpt == $nbpages - 2) {
7487 $query[
'page'] = ($nbpages - 2);
7488 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . ($nbpages - 1) .
'</a></li>';
7490 $query[
'page'] = ($nbpages - 1);
7491 $pagelist .=
'<li class="pagination"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7494 $query[
'page'] = ($nbpages - 1);
7495 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="' .
dolBuildUrl($file, $query) .
'">' . $nbpages .
'</a></li>';
7498 $pagelist .=
'<li class="pagination"><span class="active">' . ($page + 1) .
"</li>";
7502 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
7504 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
7508 if ($pagenavastextinput) {
7518 if ($morehtmlcenter && !empty(
$conf->dol_optimize_smallscreen)) {
7519 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">' . $morehtmlcenter .
'</div>';
7522 print
"<!-- End title -->\n\n";
7541function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
7543 global
$conf, $langs;
7545 print
'<div class="pagination"><ul>';
7546 if ($beforearrows) {
7547 print
'<li class="paginationbeforearrows">';
7548 print $beforearrows;
7552 if (empty($hidenavigation)) {
7553 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
7554 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
7555 $pagesizechoices .=
',5000:5000';
7565 print
'<li class="pagination">';
7566 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 .
'">';
7567 print
'<datalist id="limitlist">';
7569 print
'<li class="paginationcombolimit valignmiddle">';
7570 print
'<select id="limit' . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix) .
'" name="'.(is_numeric($selectlimitsuffix) ?
'limit' : $selectlimitsuffix).
'" class="flat selectlimit nopadding maxwidth75 center' . (is_numeric($selectlimitsuffix) ?
'' :
' ' . $selectlimitsuffix) .
'" title="' .
dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")) .
'">';
7572 $tmpchoice = explode(
',', $pagesizechoices);
7573 $tmpkey = $limit .
':' . $limit;
7574 if (!in_array($tmpkey, $tmpchoice)) {
7575 $tmpchoice[$tmpkey] = $tmpkey;
7577 $tmpkey =
$conf->liste_limit .
':' .
$conf->liste_limit;
7578 if (!in_array($tmpkey, $tmpchoice)) {
7579 $tmpchoice[$tmpkey] = $tmpkey;
7581 asort($tmpchoice, SORT_NUMERIC);
7582 foreach ($tmpchoice as $val) {
7584 $tmp = explode(
':', $val);
7587 if ($key !=
'' && $val !=
'') {
7588 if ((
int) $key == (
int) $limit) {
7589 $selected =
' selected="selected"';
7591 print
'<option name="' . $key .
'"' . $selected .
'>' .
dol_escape_htmltag($val) .
'</option>' .
"\n";
7595 print
'</datalist>';
7598 print
ajax_combobox(
"limit" . (is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
7602 if (
$conf->use_javascript_ajax) {
7603 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
7605 jQuery(document).ready(function () {
7606 jQuery(".selectlimit").change(function() {
7607 console.log("We change limit so we submit the form");
7608 $(this).parents(\'form:first\').submit();
7617 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>';
7619 if ($betweenarrows) {
7620 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
7621 print $betweenarrows;
7622 print
'<!--</div>-->';
7624 if ($nextpage > 0) {
7625 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>';
7628 print
'<li class="paginationafterarrows">';
7633 print
'</ul></div>' .
"\n";
7648function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
7652 if (preg_match(
'/%/', $rate)) {
7653 $rate = str_replace(
'%',
'', $rate);
7657 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
7658 $morelabel =
' (' . $reg[1] .
')';
7659 $rate = preg_replace(
'/\s*' . preg_quote($morelabel,
'/') .
'/',
'', $rate);
7660 $morelabel =
' ' . ($html ?
'<span class="opacitymedium small">' :
'') .
'(' . $reg[1] .
')' . ($html ?
'</span>' :
'');
7662 if (preg_match(
'/\*/', $rate)) {
7663 $rate = str_replace(
'*',
'', $rate);
7668 if (!preg_match(
'/\//', $rate)) {
7669 $ret =
price($rate, 0,
'', 0, 0) . ($addpercent ?
'%' :
'');
7672 $ret = $rate . ($addpercent ?
'%' :
'');
7674 if (($info_bits & 1) && $usestarfornpr >= 0) {
7696function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
7698 global $langs,
$conf;
7701 if (empty($amount)) {
7704 $amount = (is_numeric($amount) ? $amount : 0);
7705 if ($rounding == -1) {
7708 $nbdecimal = $rounding;
7710 if ($outlangs ===
'none') {
7720 if (!($outlangs instanceof
Translate)) {
7724 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7725 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
7727 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7728 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
7730 if ($thousand ==
'None') {
7732 } elseif ($thousand ==
'Space') {
7739 $amount = str_replace(
',',
'.', $amount);
7741 $data = explode(
'.', $amount);
7742 $decpart = isset($data[1]) ? $data[1] :
'';
7743 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
7753 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
7754 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
7755 $nbdecimal = $nbdecimalmaxshown;
7763 if ((
string) $forcerounding !=
'-1' && (
string) $forcerounding !=
'') {
7764 if ($forcerounding ===
'MU') {
7766 } elseif ($forcerounding ===
'MT') {
7768 } elseif ($forcerounding >= 0) {
7769 $nbdecimal = (int) $forcerounding;
7774 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
7776 $cursymbolbefore = $cursymbolafter =
'';
7777 if ($currency_code && is_object($outlangs)) {
7778 if ($currency_code ==
'auto') {
7779 $currency_code =
$conf->currency;
7782 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
7783 $listoflanguagesbefore = array(
'nl_NL');
7784 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
7785 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
7787 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
7788 $cursymbolafter .= ($tmpcur == $currency_code ?
' ' . $tmpcur : $tmpcur);
7792 $output = preg_replace(
'/\s/',
' ', $output);
7793 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' <span class="small">'.$cursymbolafter.
'</span>' :
'');
7794 $output = preg_replace(
'/\'/',
''', $output);
7796 $output = $cursymbolbefore . $output . $end . ($cursymbolafter ?
' '.$cursymbolafter :
'');
7827function price2num($amount, $rounding =
'', $option = 0)
7832 if (is_null($amount)) {
7841 if (is_null($langs)) {
7845 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
7846 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
7848 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
7849 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
7852 if ($thousand ==
'None') {
7854 } elseif ($thousand ==
'Space') {
7862 if (!is_numeric($amount)) {
7863 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
7866 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
7867 $amount = str_replace($thousand,
'', $amount);
7873 if (is_numeric($amount)) {
7875 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7876 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7878 $amount = number_format($amount, $nbofdec, $dec, $thousand);
7884 if ($thousand !=
',' && $thousand !=
'.') {
7897 if (preg_match(
'/^(?<int>[^,]*,|[^.]*\.)(?<dec>[^.,]*)$/u', $amount, $matches)) {
7898 $intPart = $matches[
'int'];
7899 $decPart = $matches[
'dec'];
7902 $intPart = str_replace([
'.',
','],
'', $intPart);
7905 $amount = $intPart . $dec . $decPart;
7909 $amount = str_replace(
' ',
'', $amount);
7910 $amount = str_replace($thousand,
'', $amount);
7911 $amount = str_replace($dec,
'.', $amount);
7913 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7919 $nbofdectoround =
'';
7920 if ($rounding ==
'MU') {
7922 } elseif ($rounding ==
'MT') {
7924 } elseif ($rounding ==
'MS') {
7926 } elseif ($rounding ==
'CU') {
7928 } elseif ($rounding ==
'CT') {
7930 } elseif (is_numeric($rounding)) {
7931 $nbofdectoround = (int) $rounding;
7936 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7938 return 'ErrorBadParameterProvidedToFunction';
7944 if (is_numeric($amount)) {
7946 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7947 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7949 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7955 if ($thousand !=
',' && $thousand !=
'.') {
7956 $amount = str_replace(
',',
'.', $amount);
7959 $amount = str_replace(
' ',
'', $amount);
7960 $amount = str_replace($thousand,
'', $amount);
7961 $amount = str_replace($dec,
'.', $amount);
7963 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7981function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7983 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
7985 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7986 $dimension *= 1000000;
7988 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7991 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7992 $dimension /= 1000000;
7994 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
8011 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
8031function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
8035 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
8036 $thirdparty_seller =
$mysoc;
8039 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);
8041 $vatratecleaned = $vatrate;
8043 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
8044 $vatratecleaned = trim($reg[1]);
8045 $vatratecode = $reg[2];
8054 if (
$mysoc->country_code ==
'ES') {
8056 if (!
$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
8059 if ($thirdparty_seller->id ==
$mysoc->id) {
8060 if (!$thirdparty_buyer->localtax1_assuj) {
8064 if (!$thirdparty_seller->localtax1_assuj) {
8072 if (!
$mysoc->localtax2_assuj) {
8075 if ($thirdparty_seller->id ==
$mysoc->id) {
8076 if (!$thirdparty_buyer->localtax2_assuj) {
8080 if (!$thirdparty_seller->localtax2_assuj) {
8086 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
8089 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
8095 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8096 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
8102 if ($thirdparty_seller !=
$mysoc) {
8104 return $thirdparty_seller->localtax1_value;
8113 if ($thirdparty_seller !=
$mysoc) {
8116 return $thirdparty_seller->localtax2_value;
8119 if (in_array(
$mysoc->country_code, array(
'ES'))) {
8120 return $thirdparty_buyer->localtax2_value;
8129 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
8130 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8131 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($thirdparty_seller->country_code) .
"'";
8132 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8133 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8134 if (!empty($vatratecode)) {
8135 $sql .=
" AND t.code ='" .
$db->escape($vatratecode) .
"'";
8137 $sql .=
" AND t.recuperableonly = '" .
$db->escape((
string) $vatnpr) .
"'";
8140 $resql =
$db->query($sql);
8143 $obj =
$db->fetch_object($resql);
8146 return $obj->localtax1;
8147 } elseif ($local == 2) {
8148 return $obj->localtax2;
8169 $valors = explode(
":", $tax);
8171 if (count($valors) > 1) {
8188 $sql =
" SELECT t.localtax" . ((int) $local) .
" as localtax";
8189 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t INNER JOIN " . MAIN_DB_PREFIX .
"c_country as c ON c.rowid = t.fk_pays";
8190 $sql .=
" WHERE c.code = '" .
$db->escape(
$mysoc->country_code) .
"' AND t.active = 1 AND t.entity IN (" .
getEntity(
'c_tva') .
") AND t.taux = (";
8191 $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";
8192 $sql .=
" WHERE c.code = '" .
$db->escape(
$mysoc->country_code) .
"' AND t.entity IN (" .
getEntity(
'c_tva') .
") AND tt.active = 1)";
8193 $sql .=
" AND t.localtax" . ((int) $local) .
"_type <> '0'";
8194 $sql .=
" ORDER BY t.rowid DESC";
8196 $resql =
$db->query($sql);
8198 $obj =
$db->fetch_object($resql);
8200 return $obj->localtax;
8221function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
8225 dol_syslog(
"getTaxesFromId vat id or rate = " . $vatrate);
8228 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
8229 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
8230 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8231 if ($firstparamisid) {
8232 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8234 $vatratecleaned = $vatrate;
8237 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8238 $vatratecleaned = $reg[1];
8239 $vatratecode = $reg[2];
8242 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8245 $sql .=
" WHERE t.fk_pays = c.rowid";
8247 $sql .=
" AND c.code = '" .
$db->escape($buyer->country_code) .
"'";
8249 $sql .=
" AND c.code = '" .
$db->escape($seller->country_code) .
"'";
8251 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8252 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8254 $sql .=
" AND t.code = '" .
$db->escape($vatratecode) .
"'";
8258 $resql =
$db->query($sql);
8260 $obj =
$db->fetch_object($resql);
8263 'rowid' => $obj->rowid,
8264 'code' => $obj->code,
8265 'rate' => $obj->rate,
8266 'localtax1' => $obj->localtax1,
8267 'localtax1_type' => $obj->localtax1_type,
8268 'localtax2' => $obj->localtax2,
8269 'localtax2_type' => $obj->localtax2_type,
8271 'accountancy_code_sell' => $obj->accountancy_code_sell,
8272 'accountancy_code_buy' => $obj->accountancy_code_buy
8304 dol_syslog(
"getLocalTaxesFromRate vatrate=" . $vatrate .
" local=" . $local);
8307 $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";
8308 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t";
8309 if ($firstparamisid) {
8310 $sql .=
" WHERE t.rowid = " . (int) $vatrate;
8312 $vatratecleaned = $vatrate;
8315 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
8316 $vatratecleaned = $reg[1];
8317 $vatratecode = $reg[2];
8320 $sql .=
", " . MAIN_DB_PREFIX .
"c_country as c";
8322 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ?
$mysoc->country_code : $buyer->country_code);
8323 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($countrycodetouse) .
"'";
8325 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ?
$mysoc->country_code : $seller->country_code);
8326 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '" .
$db->escape($countrycodetouse) .
"'";
8328 $sql .=
" AND t.taux = " . ((float) $vatratecleaned) .
" AND t.active = 1";
8330 $sql .=
" AND t.code = '" .
$db->escape($vatratecode) .
"'";
8334 $resql =
$db->query($sql);
8336 $obj =
$db->fetch_object($resql);
8339 $vateratestring = $obj->rate . ($obj->code ?
' (' . $obj->code .
')' :
'');
8342 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8343 } elseif ($local == 2) {
8344 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
8346 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);
8368 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8376 $product->fetch($idprod);
8378 if ((
$mysoc->country_code == $thirdpartytouseforcountry->country_code)
8379 || (in_array(
$mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouseforcountry->country_code, array(
'FR',
'MC')))
8380 || (in_array(
$mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouseforcountry->country_code, array(
'MQ',
'GP')))
8383 if ($idprodfournprice > 0) {
8384 $result = $product->get_buyprice($idprodfournprice, 0, 0,
'');
8386 $ret = $product->vatrate_supplier;
8387 if ($product->default_vat_code_supplier) {
8388 $ret .=
' (' . $product->default_vat_code_supplier .
')';
8394 $ret = $product->tva_tx;
8395 if ($product->default_vat_code) {
8396 $ret .=
' (' . $product->default_vat_code .
')';
8409 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
8410 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8411 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '" .
$db->escape($thirdpartytouseforcountry->country_code) .
"'";
8412 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8413 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8414 $sql .=
$db->plimit(1);
8416 $resql =
$db->query($sql);
8418 $obj =
$db->fetch_object($resql);
8420 $ret = $obj->vat_rate;
8421 if ($obj->default_vat_code) {
8422 $ret .=
' (' . $obj->default_vat_code .
')';
8446 dol_syslog(
"get_product_vat_for_country: ret=" . $ret);
8464 if (!class_exists(
'Product')) {
8465 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8474 $result = $product->fetch($idprod);
8476 if (
$mysoc->country_code == $thirdpartytouseforcountry->country_code) {
8490 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
8491 $sql .=
" FROM " . MAIN_DB_PREFIX .
"c_tva as t, " . MAIN_DB_PREFIX .
"c_country as c";
8492 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='" .
$db->escape($thirdpartytouseforcountry->country_code) .
"'";
8493 $sql .=
" AND t.entity IN (" .
getEntity(
'c_tva') .
")";
8494 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
8495 $sql .=
$db->plimit(1);
8497 $resql =
$db->query($sql);
8499 $obj =
$db->fetch_object($resql);
8502 $ret = $obj->localtax1;
8503 } elseif ($local == 2) {
8504 $ret = $obj->localtax2;
8512 dol_syslog(
"get_product_localtax_for_country: ret=" . $ret);
8538 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
8541 $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;
8543 if (empty($thirdparty_seller->country_code)) {
8544 $thirdparty_seller->country_code =
$mysoc->country_code;
8546 $seller_country_code = $thirdparty_seller->country_code;
8547 $seller_in_cee =
isInEEC($thirdparty_seller);
8549 if (empty($thirdparty_buyer->country_code)) {
8550 $thirdparty_buyer->country_code =
$mysoc->country_code;
8552 $buyer_country_code = $thirdparty_buyer->country_code;
8553 $buyer_in_cee =
isInEEC($thirdparty_buyer);
8555 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'));
8563 if ($seller_in_cee && $buyer_in_cee) {
8564 $isacompany = $thirdparty_buyer->
isACompany();
8565 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8566 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8574 $vatrule =
'VATRULE 0';
8580 if (empty($vatrule) && !$seller_use_vat) {
8588 $vatrule =
'VATRULE 1';
8592 if (empty($vatrule) && !empty($thirdparty_buyer->state_id)) {
8593 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
8594 $sql .=
" FROM " .
$db->prefix() .
"c_tva as t";
8595 $sql .=
" INNER JOIN " .
$db->prefix() .
"c_departements as d ON t.fk_department_buyer = d.rowid";
8596 $sql .=
" WHERE d.rowid = " . ((int) $thirdparty_buyer->state_id);
8597 $sql .=
" AND t.active > 0";
8598 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
8599 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
8601 $res =
$db->query($sql);
8603 if (
$db->num_rows($res)) {
8604 $obj =
$db->fetch_object($res);
8606 $vatvalue = $obj->vat_default_rate .
' (' . $obj->vat_default_code .
')';
8607 $vatrule =
'VATRULE 2';
8614 if (empty($vatrule) && (
8615 ($seller_country_code == $buyer_country_code)
8616 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
8617 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
8622 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
8626 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
8628 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
8629 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
8631 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
8635 $vatvalue = $tmpvat;
8636 $vatrule =
'VATRULE 3b';
8644 if (empty($vatrule) && ($seller_in_cee && $buyer_in_cee)) {
8645 $isacompany = $thirdparty_buyer->
isACompany();
8646 if ($isacompany && !
getDolGlobalString(
'MAIN_USE_VAT_ZERO_FOR_COMPANIES_IN_EEC_EVEN_IF_VAT_ID_UNKNOWN')) {
8647 require_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
8656 $vatrule =
'VATRULE 5';
8663 $vatrule =
'VATRULE 6';
8669 if (empty($vatrule) &&
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
8670 $isacompany = $thirdparty_buyer->
isACompany();
8673 $vatrule =
'VATRULE extra';
8686 $parameters = array(
'vatvalue' => $vatvalue,
'vatrule' => $vatrule);
8690 $reshook = $hookmanager->executeHooks(
'get_default_tva', $parameters, $tmpobject, $tmpaction);
8691 if ($reshook > 0 && !empty($hookmanager->resArray[
'vatvalue'])) {
8692 $vatvalue = $hookmanager->resArray[
'vatvalue'];
8693 $vatrule = $hookmanager->resArray[
'vatrule'];
8714 if ($idprodfournprice > 0) {
8715 if (!class_exists(
'ProductFournisseur')) {
8716 require_once DOL_DOCUMENT_ROOT .
'/fourn/class/fournisseur.product.class.php';
8719 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
8720 return $prodprice->fourn_tva_npr;
8721 } elseif ($idprod > 0) {
8722 if (!class_exists(
'Product')) {
8723 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
8726 $prod->fetch($idprod);
8727 return $prod->tva_npr;
8750 if (!is_object($thirdparty_seller)) {
8753 if (!is_object($thirdparty_buyer)) {
8757 if (empty($thirdparty_seller->country_code)) {
8758 $thirdparty_seller->country_code =
$mysoc->country_code;
8760 $seller_country_code = $thirdparty_seller->country_code;
8763 if (empty($thirdparty_buyer->country_code)) {
8764 $thirdparty_buyer->country_code =
$mysoc->country_code;
8766 $buyer_country_code = $thirdparty_buyer->country_code;
8770 if (
$mysoc->country_code ==
'ES') {
8771 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
8776 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
8779 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
8783 } elseif ($local == 2) {
8785 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
8788 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
8793 if ($seller_country_code == $buyer_country_code) {
8808function yn($yesno, $format = 1, $color = 0)
8812 $result =
'unknown';
8814 if ($yesno ===
true || (
int) $yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
8815 $result = $langs->trans(
'yes');
8816 if ($format == 1 || $format == 3) {
8817 $result = $langs->trans(
"Yes");
8820 $result =
'<input type="checkbox" value="1" checked disabled>';
8823 $result =
'<input type="checkbox" value="1" checked disabled> ' . $result;
8825 if ($format == 4 || !is_numeric($format)) {
8826 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
8831 $result = $langs->trans(
"no");
8832 if ($format == 1 || $format == 3) {
8833 $result = $langs->trans(
"No");
8836 $result =
'<input type="checkbox" value="0" disabled>';
8839 $result =
'<input type="checkbox" value="0" disabled> ' . $result;
8841 if ($format == 4 || !is_numeric($format)) {
8842 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
8848 $classname =
'error';
8852 return '<span class="' . $classname .
'">' . $result .
'</span>';
8875function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
8877 if (empty($modulepart) && is_object(
$object)) {
8878 if (!empty(
$object->module)) {
8879 $modulepart =
$object->module;
8880 } elseif (!empty(
$object->element)) {
8881 $modulepart =
$object->element;
8888 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
8890 $arrayforoldpath[
'product'] = 2;
8893 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8894 $level = $arrayforoldpath[$modulepart];
8896 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
8898 if (empty($num) && is_object(
$object)) {
8901 if (empty($alpha)) {
8902 $num = preg_replace(
'/([^0-9])/i',
'', $num);
8904 $num = preg_replace(
'/^.*\-/i',
'', $num);
8906 $num = substr(
"000" . $num, -$level);
8908 $path = substr($num, 0, 1);
8911 $path = substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8914 $path = substr($num, 2, 1) .
'/' . substr($num, 1, 1) .
'/' . substr($num, 0, 1);
8920 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceof
Societe) {
8928 if (empty($withoutslash) && !empty($path)) {
8943function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
8945 dol_syslog(
"functions.lib::dol_mkdir: dir=" . $dir, LOG_INFO);
8950 if (@is_dir($dir_osencoded)) {
8958 if (!empty($dataroot)) {
8960 $dir = str_replace($dataroot .
'/',
'', $dir);
8961 $ccdir = $dataroot .
'/';
8964 $cdir = explode(
"/", $dir);
8965 $num = count($cdir);
8966 for ($i = 0; $i < $num; $i++) {
8968 $ccdir .=
'/' . $cdir[$i];
8970 $ccdir .= $cdir[$i];
8973 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
8981 if (!@is_dir($ccdir_osencoded)) {
8982 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' is not found (does not exists or is outside open_basedir PHP setting).", LOG_DEBUG);
8985 $dirmaskdec = octdec((
string) $newmask);
8986 if (empty($newmask)) {
8989 $dirmaskdec |= octdec(
'0111');
8990 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
8992 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '" . $ccdir .
"' (no permission to write into parent or directory already exists).", LOG_WARNING);
8995 dol_syslog(
"functions.lib::dol_mkdir: Directory '" . $ccdir .
"' created", LOG_DEBUG);
9004 return ($nberr ? -$nberr : $nbcreated);
9015function dolChmod($filepath, $newmask =
'')
9017 if (!empty($newmask)) {
9018 @chmod($filepath, octdec($newmask));
9032 return '<span class="fieldrequired">*</span>';
9052function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
9054 if (is_null($stringtoclean)) {
9058 if ($removelinefeed == 2) {
9059 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
9061 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
9066 $temp = str_replace(
'< ',
'__ltspace__', $temp);
9067 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
9070 $temp = strip_tags($temp);
9073 $pattern =
"/<[^<>]+>/";
9080 $tempbis = str_replace(
'<>',
'', $temp);
9081 $tempbis = preg_replace($pattern,
'', $tempbis);
9083 }
while ($tempbis != $temp);
9088 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
9094 if ($removelinefeed == 1) {
9095 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
9099 if ($removedoublespaces) {
9100 while (strpos($temp,
" ") !==
false) {
9101 $temp = str_replace(
" ",
" ", $temp);
9105 $temp = str_replace(
'__ltspace__',
'< ', $temp);
9106 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
9130function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
9132 $sav_allowed_tags = $allowed_tags;
9134 if (empty($allowed_tags) || (is_string($allowed_tags) && preg_match(
'/^common/', $allowed_tags))) {
9135 $allowed_tags = array(
9192 $allowed_tags[] =
"comment";
9194 if (!in_array(
'iframe', $allowed_tags)) {
9195 $allowed_tags[] =
"iframe";
9199 if (!in_array(
'link', $allowed_tags)) {
9200 $allowed_tags[] =
"link";
9202 if (!in_array(
'meta', $allowed_tags)) {
9203 $allowed_tags[] =
"meta";
9207 if (!in_array(
'script', $allowed_tags)) {
9208 $allowed_tags[] =
"script";
9212 if (!in_array(
'style', $allowed_tags)) {
9213 $allowed_tags[] =
"style";
9216 if (is_string($sav_allowed_tags)) {
9217 $tmptags = explode(
',', $sav_allowed_tags);
9218 foreach ($tmptags as $tag) {
9219 if ($tag !=
'common') {
9220 $allowed_tags[] = $tag;
9226 $allowed_tags_string = implode(
"><", $allowed_tags);
9227 $allowed_tags_string =
'<' . $allowed_tags_string .
'>';
9229 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
9234 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
9237 $allowed_tags[] =
"commentphp";
9238 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
9239 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
9242 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
9243 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
9246 $temp = strip_tags($stringtoclean, $allowed_tags_string);
9248 if ($cleanalsosomestyles) {
9250 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)/i',
'', $temp);
9251 $temp = preg_replace(
'/z-index\s*:/i',
'', $temp);
9253 if ($removeclassattribute) {
9254 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
9259 if ($cleanalsojavascript) {
9260 $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);
9263 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
9266 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
9269 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
9290 if (is_null($allowed_attributes)) {
9291 $allowed_attributes = array(
9325 if (!in_array(
"content", $allowed_attributes)) {
9326 $allowed_attributes[] =
"content";
9328 if (!in_array(
"http-equiv", $allowed_attributes)) {
9329 $allowed_attributes[] =
"http-equiv";
9332 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
9334 $stringtoclean =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $stringtoclean .
'</body></html>';
9337 $dom =
new DOMDocument(
'',
'UTF-8');
9339 $savwarning = error_reporting();
9340 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
9341 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
9342 error_reporting($savwarning);
9344 if ($dom instanceof DOMDocument) {
9345 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
9346 $el = $els->item($i);
9347 if (!$el instanceof DOMElement) {
9350 $attrs = $el->attributes;
9351 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
9353 if (!empty($attrs->item($ii)->name)) {
9354 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
9356 $els->item($i)->removeAttribute($attrs->item($ii)->name);
9357 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
9359 $valuetoclean = $attrs->item($ii)->value;
9361 if (isset($valuetoclean)) {
9363 $oldvaluetoclean = $valuetoclean;
9364 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
9365 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
9366 if ($els->item($i)->tagName ==
'a') {
9367 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
9368 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
9369 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
9373 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
9374 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
9375 }
while ($oldvaluetoclean != $valuetoclean);
9378 $attrs->item($ii)->value = $valuetoclean;
9385 $dom->encoding =
'UTF-8';
9387 $return = $dom->saveHTML();
9391 $return = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]*' . preg_quote(
'></head><body>',
'/') .
'/',
'', $return);
9392 $return = preg_replace(
'/' . preg_quote(
'</body></html>',
'/') .
'$/',
'', trim($return));
9394 return trim($return);
9396 return $stringtoclean;
9413 $temp = $stringtoclean;
9414 foreach ($disallowed_tags as $tagtoremove) {
9415 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'>/',
'', $temp);
9416 $temp = preg_replace(
'/<\/?' . $tagtoremove .
'\s+[^>]*>/',
'', $temp);
9419 if ($cleanalsosomestyles) {
9420 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
9438 if (!is_string($text) || $text ===
'') {
9443 $selfclosing = array(
'br',
'hr',
'img',
'input',
'meta',
'link',
'source',
'col',
'area',
'base',
'embed',
'param',
'track',
'wbr');
9446 if (preg_match_all(
'/<\s*(\/?)([a-zA-Z][a-zA-Z0-9]*)[^>]*?(\/?)\s*>/', $text, $matches, PREG_SET_ORDER)) {
9447 foreach ($matches as $match) {
9448 $tag = strtolower($match[2]);
9449 if (in_array($tag, $selfclosing) || !empty($match[3])) {
9452 if (empty($match[1])) {
9456 $idx = array_search($tag, array_reverse($opened,
true),
true);
9457 if ($idx !==
false) {
9458 unset($opened[$idx]);
9464 foreach (array_reverse($opened) as $tag) {
9465 $text .=
'</'.$tag.
'>';
9482 if ($nboflines == 1) {
9484 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
9485 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
9488 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
9493 return $firstline . (isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
9497 $text = preg_replace(
'/\n/',
'', $text);
9499 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9501 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
9504 $text = strtr($text, $repTable);
9505 if ($charset ==
'UTF-8') {
9506 $pattern =
'/(<br[^>]*>)/Uu';
9509 $pattern =
'/(<br[^>]*>)/U';
9511 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
9516 $lastaddediscontent = 1;
9517 while ($countline < $nboflines && isset($a[$i])) {
9518 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
9519 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
9520 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
9522 if (!$lastaddediscontent) {
9525 $lastaddediscontent = 0;
9528 $firstline .= $a[$i];
9529 $lastaddediscontent = 1;
9535 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
9537 $ret = $firstline . ($adddots ?
'...' :
'');
9555function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
9557 if (is_null($stringtoencode)) {
9562 return nl2br($stringtoencode, $forxml);
9564 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
9578function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
9580 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
9585 return $stringtoencode;
9587 $out = $stringtoencode;
9591 $oldstringtoclean = $out;
9599 if (!empty($out) &&
getDolGlobalInt(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
9601 libxml_use_internal_errors(
false);
9602 if (LIBXML_VERSION < 20900) {
9606 libxml_disable_entity_loader(
true);
9609 $dom =
new DOMDocument();
9617 $out =
'<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">' . $out .
'</div></body></html>';
9621 $out = preg_replace(
'/&(?![a-zA-Z0-9#]+;)/',
'__AMPINTEXT__', $out);
9624 $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>';
9630 $out = preg_replace_callback(
9631 '/__\[([0-9a-zA-Z_]+)\]__/',
9637 return '__BRACKETSTART' . $m[1] .
'BRACKETEND__';
9642 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
9644 $dom->encoding =
'UTF-8';
9648 foreach ($dom->getElementsByTagName(
'*') as $el) {
9649 if (!$el instanceof DOMElement) {
9654 if ($el->hasAttribute(
'style')) {
9656 $style = $el->getAttribute(
'style');
9659 $style = preg_replace(
'/z-index\s*:/i',
'', $style);
9660 $style = preg_replace(
'/position\s*:/i',
'', $style);
9661 $style = preg_replace(
'/top\s*:/i',
'', $style);
9662 $style = preg_replace(
'/left\s*:/i',
'', $style);
9663 $style = preg_replace(
'/background\s*:/i',
'', $style);
9669 if (trim($style) ===
'') {
9671 $el->removeAttribute(
'style');
9674 $el->setAttribute(
'style', $style);
9680 $out = trim($dom->saveHTML());
9683 $out = preg_replace_callback(
9684 '/__BRACKETSTART([0-9a-zA-Z_]+)BRACKETEND__/',
9690 return '__[' . $m[1] .
']__';
9697 $out = preg_replace(
'/^' . preg_quote(
'<html><head><',
'/') .
'[^<>]+' . preg_quote(
'></head><body><div class="tricktoremove">',
'/') .
'/',
'', $out);
9698 $out = preg_replace(
'/' . preg_quote(
'</div></body></html>',
'/') .
'$/',
'', trim($out));
9703 $out = str_replace(
'__AMPINTEXT__',
'&', $out);
9704 $out = str_replace(
'<br>',
'', $out);
9709 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9716 if (!empty($out) &&
getDolGlobalInt(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript')) && $outishtml) {
9722 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
9729 'quote-marks' =>
false,
9730 'doctype' =>
'strict',
9731 'show-body-only' =>
true,
9732 "indent-attributes" =>
false,
9733 "vertical-space" =>
false,
9736 'preserve-entities' =>
true
9745 $locale = setlocale(LC_NUMERIC,
'0');
9748 $out = $tidy->repairString($out, $config,
'utf8');
9750 setlocale(LC_NUMERIC, $locale);
9759 $out =
'InvalidHTMLStringCantBeCleaned ' . $e->getMessage();
9765 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
9768 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
9772 $out = preg_replace(
'/'/i',
''', $out);
9777 if (function_exists(
'realCharForNumericEntities')) {
9778 $out = preg_replace_callback(
9779 '/&#(x?[0-9][0-9a-f]+;?)/i',
9784 static function ($m) {
9792 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
9795 if ($check ==
'restricthtmlallowlinkscript') {
9797 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
9799 } elseif ($check ==
'restricthtmlallowiframe') {
9812 $out = preg_replace(
'/'/i',
"'", $out);
9816 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
9817 $out = preg_replace(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|command|contentvisibility|context|cuechange|copy|cut)[a-z]*\s*=/i',
'', $out);
9818 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
9819 $out = preg_replace(
'/on(lost|offline|online|message|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
9820 $out = preg_replace(
'/on(paste|pause|play|playing|progress|ratechange|rejectionn|reset|resize|scroll|search|security|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i',
'', $out);
9821 $out = preg_replace(
'/on(timeupdate|toggle|unhandled|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
9823 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
9825 $out = preg_replace(
'/\son[a-z]+\s*=/i',
' ', $out);
9826 }
while ($oldstringtoclean != $out);
9833 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
9834 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
9835 $nblinks = count($reg[0]);
9836 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
9837 $out =
'ErrorTooManyLinksIntoHTMLString';
9840 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
9842 $out =
'ErrorHTMLLinksNotAllowed';
9844 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
9849 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
9854 if (preg_match_all($pattern, $out, $matches)) {
9857 foreach ($matches[1] as $tmpval) {
9858 if (!empty($tmpval)) {
9862 foreach ($matches[2] as $tmpval) {
9863 if (!empty($tmpval)) {
9871 foreach ($urls as $url) {
9873 $parsedurl = parse_url($url);
9874 if (!empty($parsedurl)) {
9883 if (empty($firstexturl)) {
9884 $firstexturl = $url;
9885 } elseif (empty($secondexturl)) {
9886 $secondexturl = $url;
9892 $out =
'ErrorHTMLExternalLinksNotAllowed (Example: '.$firstexturl.($secondexturl ?
' '.$secondexturl :
'').
')';
9921function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
9923 if (is_null($stringtoencode)) {
9927 $newstring = $stringtoencode;
9929 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
9930 if ($removelasteolbr) {
9931 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
9933 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
9934 $newstring = strtr($newstring, array(
'&' =>
'__PROTECTand__',
'<' =>
'__PROTECTlt__',
'>' =>
'__PROTECTgt__',
'"' =>
'__PROTECTdquot__'));
9936 $newstring = strtr($newstring, array(
'__PROTECTand__' =>
'&',
'__PROTECTlt__' =>
'<',
'__PROTECTgt__' =>
'>',
'__PROTECTdquot__' =>
'"'));
9938 if ($removelasteolbr) {
9939 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
9958 $ret = preg_replace(
'/' .
"\r\n" .
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
9959 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\r\n" .
'/i',
"\r\n", $ret);
9960 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>' .
"\n" .
'/i',
"\n", $ret);
9961 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
9973 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
9974 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|' .
"\n" .
'|' .
"\r" .
')+$/i',
"", $ret);
9990 if ($keepsomeentities) {
9991 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
9993 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string)
$c);
9994 if ($keepsomeentities) {
9995 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
10011function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
10013 return htmlentities($string, $flags, $encoding, $double_encode);
10032 for ($scursor = 0; $scursor < $len; $scursor++) {
10033 $ordchar = ord($s[$scursor]);
10035 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
10038 } elseif ($ordchar > 126 && $ordchar < 160) {
10041 } elseif ($clean) {
10042 $out .= $s[$scursor];
10064 $arraystring = explode(
"\n", $s);
10065 $nb = count($arraystring);
10082 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
10084 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
10087 $text = strtr($text, $repTable);
10088 if ($charset ==
'UTF-8') {
10089 $pattern =
'/(<br[^>]*>)/Uu';
10092 $pattern =
'/(<br[^>]*>)/U';
10094 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
10096 $nblines = (int) floor((count($a) + 1) / 2);
10098 if ($maxlinesize) {
10099 foreach ($a as $line) {
10102 $line_dec = html_entity_decode($line);
10104 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
10105 $nblines += substr_count($line_dec,
'\n');
10125 if (is_null($msg)) {
10129 if ($option == 1) {
10130 if (preg_match(
'/<(html|link|script)/i', $msg)) {
10132 } elseif (preg_match(
'/<body/i', $msg)) {
10134 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
10136 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
10138 } elseif (preg_match(
'/<br/i', $msg)) {
10144 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
10145 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
10147 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
10149 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
10151 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
10153 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
10155 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
10157 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
10159 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
10161 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
10163 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
10166 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
10168 } elseif (preg_match(
'/&#x[a-f0-9][a-f0-9];/i', $msg)) {
10190function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
10192 if (!empty($invert)) {
10200 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
10215 return $text1.$text2;
10227 if (!is_string($callback)) {
10228 throw new InvalidArgumentException(
"Les callbacks sont désactivés.");
10231 $allowed_callbacks = [
'strtolower',
'strtoupper',
'intval'];
10232 if (!in_array($callback, $allowed_callbacks,
true)) {
10233 throw new InvalidArgumentException(
"Callback function not allowed.");
10235 return array_map($callback, $array);
10252function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude =
null,
$object =
null, $include =
null)
10256 $substitutionarray = array();
10258 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
10262 $emailsendersignature = $user->signature;
10263 $usersignature = $user->signature;
10264 $substitutionarray = array_merge($substitutionarray, array(
10265 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
10269 if (is_object($user) && ($user instanceof
User)) {
10270 $substitutionarray = array_merge($substitutionarray, array(
10271 '__USER_ID__' => (
string) $user->id,
10272 '__USER_LOGIN__' => (
string) $user->login,
10273 '__USER_EMAIL__' => (
string) $user->email,
10274 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
10275 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10276 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10277 '__USER_FAX__' => (
string) $user->office_fax,
10278 '__USER_LASTNAME__' => (
string) $user->lastname,
10279 '__USER_FIRSTNAME__' => (
string) $user->firstname,
10280 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
10281 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
10282 '__USER_JOB__' => (
string) $user->job,
10284 '__USER_VCARD_URL__' => (
string) $user->getOnlineVirtualCardUrl(
'',
'external')
10288 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object(
$mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
10289 $substitutionarray = array_merge($substitutionarray, array(
10290 '__MYCOMPANY_NAME__' =>
$mysoc->name,
10291 '__MYCOMPANY_EMAIL__' =>
$mysoc->email,
10292 '__MYCOMPANY_URL__' =>
$mysoc->url,
10294 '__MYCOMPANY_PHONEMOBILE__' =>
dol_print_phone((
string)
$mysoc->phone_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
10296 '__MYCOMPANY_PROFID1__' =>
$mysoc->idprof1,
10297 '__MYCOMPANY_PROFID2__' =>
$mysoc->idprof2,
10298 '__MYCOMPANY_PROFID3__' =>
$mysoc->idprof3,
10299 '__MYCOMPANY_PROFID4__' =>
$mysoc->idprof4,
10300 '__MYCOMPANY_PROFID5__' =>
$mysoc->idprof5,
10301 '__MYCOMPANY_PROFID6__' =>
$mysoc->idprof6,
10302 '__MYCOMPANY_PROFID7__' =>
$mysoc->idprof7,
10303 '__MYCOMPANY_PROFID8__' =>
$mysoc->idprof8,
10304 '__MYCOMPANY_PROFID9__' =>
$mysoc->idprof9,
10305 '__MYCOMPANY_PROFID10__' =>
$mysoc->idprof10,
10306 '__MYCOMPANY_CAPITAL__' =>
$mysoc->capital,
10307 '__MYCOMPANY_FULLADDRESS__' => (method_exists(
$mysoc,
'getFullAddress') ?
$mysoc->getFullAddress(1,
', ') :
''),
10309 '__MYCOMPANY_VATNUMBER__' =>
$mysoc->tva_intra,
10310 '__MYCOMPANY_ZIP__' =>
$mysoc->zip,
10311 '__MYCOMPANY_TOWN__' =>
$mysoc->town,
10312 '__MYCOMPANY_STATE__' =>
$mysoc->state,
10313 '__MYCOMPANY_COUNTRY__' =>
$mysoc->country,
10314 '__MYCOMPANY_COUNTRY_ID__' =>
$mysoc->country_id,
10315 '__MYCOMPANY_COUNTRY_CODE__' =>
$mysoc->country_code,
10316 '__MYCOMPANY_CURRENCY_CODE__' =>
$conf->currency
10320 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
10322 $substitutionarray[
'__ID__'] =
'__ID__';
10323 $substitutionarray[
'__REF__'] =
'__REF__';
10324 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
10325 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
10326 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
10327 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
10328 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
10329 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
10330 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
10333 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
10334 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
10335 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
10336 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
10337 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
10338 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
10340 $substitutionarray[
'__THIRDPARTY_URL__'] =
'__THIRDPARTY_URL__';
10342 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
10343 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
10344 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
10345 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
10346 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
10347 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
10348 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
10349 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
10350 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
10351 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
10352 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
10353 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
10354 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
10355 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
10356 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
10357 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
10358 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
10359 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
10360 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
10362 if (
isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
10363 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
10364 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
10365 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
10366 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
10367 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
10372 if (
isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
10373 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
10374 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
10375 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
10376 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
10377 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
10378 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
10379 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
10380 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
10381 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
10382 $substitutionarray[
'__TICKET_TYPE_LABEL__'] =
'__TICKET_TYPE_LABEL__';
10383 $substitutionarray[
'__TICKET_SEVERITY_LABEL__'] =
'__TICKET_SEVERITY_LABEL__';
10384 $substitutionarray[
'__TICKET_CATEGORY_LABEL__'] =
'__TICKET_CATEGORY_LABEL__';
10385 $substitutionarray[
'__TICKET_PUBLIC_URL__'] =
'__TICKET_PUBLIC_URL__';
10386 $substitutionarray[
'__TICKET_MANAGEMENT_URL__'] =
'__TICKET_MANAGEMENT_URL__';
10388 if (
isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
10389 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
10390 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
10391 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
10393 if (
isModEnabled(
'holiday') && (!is_object(
$object) ||
$object->element ==
'holiday') && (empty($exclude) || !in_array(
'holiday', $exclude)) && (empty($include) || in_array(
'holiday', $include))) {
10394 $substitutionarray[
'__HOLIDAY_ARRAY_PER_EMPLOYEE_FOR_PERIOD__'] =
'__HOLIDAY_ARRAY_PER_EMPLOYEE_FOR_PERIOD__';
10396 if (
isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
10397 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
10398 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
10399 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
10403 if (
isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
10404 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
10405 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
10406 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
10407 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
10409 if (
isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
10410 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
10412 if (
isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
10413 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
10415 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
10416 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
10417 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
10418 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
10419 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
10420 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
10421 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
10423 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
10424 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
10425 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
10426 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
10427 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
10428 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
'Direct download url of a supplier order';
10429 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
'Direct download url of a supplier invoice';
10432 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
10433 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
10434 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
10437 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
10438 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
10441 '@phan-var-force Adherent|Delivery $object';
10443 $substitutionarray[
'__ID__'] =
$object->id;
10444 $substitutionarray[
'__REF__'] =
$object->ref;
10445 $substitutionarray[
'__NEWREF__'] =
$object->newref;
10447 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10448 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10449 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
10450 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
10452 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
10453 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
10454 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
10457 $date_delivery =
null;
10458 if (property_exists(
$object,
'date_delivery')) {
10459 $date_delivery =
$object->date_delivery;
10460 } elseif (property_exists(
$object,
'delivery_date')) {
10461 $date_delivery =
$object->delivery_date;
10463 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10464 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
10465 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
10466 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
10467 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
10468 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
10469 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
10470 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
10471 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
10474 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
10475 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
10477 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day',
false, $outputlangs) :
'');
10478 $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 :
'')) :
'');
10482 '@phan-var-force Adherent $object';
10486 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
10487 if (method_exists(
$object,
'getCivilityLabel')) {
10488 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
10490 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
10491 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
10492 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
10493 if (method_exists(
$object,
'getFullName')) {
10494 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
10496 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
10497 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
10498 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
10499 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
10500 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
10501 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
10502 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
10503 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
10504 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
10505 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
10506 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
10510 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
10511 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
10513 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
10514 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
10515 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
10516 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
10517 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
10518 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
10519 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
10520 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
10521 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
10522 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
10523 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
10528 '@phan-var-force Societe $object';
10529 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->id ??
'';
10530 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->name ??
'';
10531 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->name_alias ??
'';
10532 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->code_client ??
'';
10533 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->code_fournisseur ??
'';
10534 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->email ??
'';
10535 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->email ??
'');
10536 $substitutionarray[
'__THIRDPARTY_URL__'] =
$object->url ??
'';
10537 $substitutionarray[
'__THIRDPARTY_URL_URLENCODED__'] = urlencode(
$object->url ??
'');
10540 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->address ??
'';
10541 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->zip ??
'';
10542 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->town ??
'';
10543 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->state ??
'';
10544 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->country_id > 0 ?
$object->country_id :
'');
10545 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->country_code ??
'';
10546 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->idprof1 ??
'';
10547 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->idprof2 ??
'';
10548 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->idprof3 ??
'';
10549 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->idprof4 ??
'';
10550 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->idprof5 ??
'';
10551 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->idprof6 ??
'';
10552 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->tva_intra ??
'';
10555 } elseif (is_object(
$object) && is_object(
$object->thirdparty)) {
10556 $substitutionarray[
'__THIRDPARTY_ID__'] =
$object->thirdparty->id ??
'';
10557 $substitutionarray[
'__THIRDPARTY_NAME__'] =
$object->thirdparty->name ??
'';
10558 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
$object->thirdparty->name_alias ??
'';
10559 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
$object->thirdparty->code_client ??
'';
10560 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
$object->thirdparty->code_fournisseur ??
'';
10561 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
$object->thirdparty->email ??
'';
10562 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(
$object->thirdparty->email ??
'');
10565 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
$object->thirdparty->address ??
'';
10566 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
$object->thirdparty->zip ??
'';
10567 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
$object->thirdparty->town ??
'';
10568 $substitutionarray[
'__THIRDPARTY_STATE__'] =
$object->thirdparty->state ??
'';
10569 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (
$object->thirdparty->country_id > 0 ?
$object->thirdparty->country_id :
'');
10570 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] =
$object->thirdparty->country_code ??
'';
10571 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
$object->thirdparty->idprof1 ??
'';
10572 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
$object->thirdparty->idprof2 ??
'';
10573 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
$object->thirdparty->idprof3 ??
'';
10574 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
$object->thirdparty->idprof4 ??
'';
10575 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
$object->thirdparty->idprof5 ??
'';
10576 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
$object->thirdparty->idprof6 ??
'';
10577 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
$object->thirdparty->tva_intra ??
'';
10582 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
10583 '@phan-var-force RecruitmentCandidature $object';
10585 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
10586 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10587 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10589 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
10590 '@phan-var-force ConferenceOrBoothAttendee $object';
10592 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
10593 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
10594 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
10598 '@phan-var-force Project $object';
10600 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
10601 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
10602 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
10603 } elseif (is_object(
$object)) {
10605 if (!empty(
$object->project)) {
10608 if (!is_null($project) && is_object($project)) {
10609 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
10610 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
10611 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
10616 $project_id =
$object->fk_project;
10617 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
10618 $project_id =
$object->fk_project;
10620 if ($project_id > 0) {
10622 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10623 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10624 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
10630 '@phan-var-force Facture $object';
10632 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
10635 '@phan-var-force Expedition $object';
10637 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
10638 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
10639 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
10642 '@phan-var-force Reception $object';
10644 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
10645 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
10649 '@phan-var-force Contrat $object';
10651 $dateplannedstart =
'';
10652 $datenextexpiration =
'';
10653 foreach (
$object->lines as $line) {
10654 if ($line->date_start > $dateplannedstart) {
10655 $dateplannedstart = $line->date_start;
10657 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
10658 $datenextexpiration = $line->date_end;
10661 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
10662 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
10663 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
10665 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
10666 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
10667 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
10671 '@phan-var-force Ticket $object';
10673 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
10674 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
10675 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
10676 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
10677 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
10678 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
10679 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
10680 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
10683 $substitutionarray[
'__TICKET_TYPE_LABEL__'] = empty(
$object->type_code) ?
'' : $outputlangs->getLabelFromKey(
$db,
'TicketTypeShort'.
$object->type_code,
'c_ticket_type',
'code',
'label',
$object->type_code);
10684 $substitutionarray[
'__TICKET_SEVERITY_LABEL__'] = empty(
$object->severity_code) ?
'' : $outputlangs->getLabelFromKey(
$db,
'TicketSeverityShort'.
$object->severity_code,
'c_ticket_severity',
'code',
'label',
$object->severity_code);
10685 $substitutionarray[
'__TICKET_CATEGORY_LABEL__'] = empty(
$object->category_code) ?
'' : $outputlangs->getLabelFromKey(
$db,
'TicketCategoryShort'.
$object->category_code,
'c_ticket_category',
'code',
'label',
$object->category_code);
10686 $substitutionarray[
'__TICKET_PUBLIC_URL__'] =
getDolGlobalString(
'TICKET_URL_PUBLIC_INTERFACE',
dol_buildpath(
'/public/ticket/', 2)).
'view.php?track_id='.urlencode((
string)
$object->track_id);
10687 $substitutionarray[
'__TICKET_MANAGEMENT_URL__'] =
dol_buildpath(
'/ticket/card.php', 2).
'?track_id='.urlencode((
string)
$object->track_id);
10689 if (
$object->fk_user_assign > 0) {
10690 $userstat->fetch(
$object->fk_user_assign);
10691 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10694 if (
$object->fk_user_create > 0) {
10695 $userstat->fetch(
$object->fk_user_create);
10696 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
10702 if (!is_object($extrafields)) {
10705 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
10707 if (
$object->fetch_optionals() > 0) {
10708 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
10709 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
10710 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
10711 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day');
10712 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'day',
'tzserver', $outputlangs);
10713 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_' . $key],
'dayrfc');
10714 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
10715 $datetime =
$object->array_options[
'options_' . $key];
10716 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
10717 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
10718 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
10719 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
10720 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
10721 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
dol_print_phone(
$object->array_options[
'options_' . $key]);
10722 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
10723 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] =
$object->array_options[
'options_' . $key];
10724 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATED__'] =
price(
$object->array_options[
'options_' . $key]);
10725 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'_FORMATTED__'] =
price(
$object->array_options[
'options_' . $key]);
10726 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'select') {
10727 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10728 $val = $extrafields->attributes[
$object->table_element][
'param'][$key][
'options'][
$object->array_options[
'options_'.$key]] ??
$object->array_options[
'options_'.$key];
10729 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LABEL__'] = $val;
10730 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
10731 $substitutionarray[
'__EXTRAFIELD_' . strtoupper($key) .
'__'] = !empty(
$object->array_options[
'options_' . $key]) ?
$object->array_options[
'options_' . $key] :
'';
10739 if (empty($substitutionarray[
'__REF__'])) {
10743 require_once DOL_DOCUMENT_ROOT .
'/core/lib/payments.lib.php';
10744 $outputlangs->loadLangs(array(
'paypal',
'other'));
10747 $typeforonlinepayment =
'free';
10749 $typeforonlinepayment =
'order';
10752 $typeforonlinepayment =
'invoice';
10755 $typeforonlinepayment =
'member';
10756 if (!empty(
$object->last_subscription_amount)) {
10757 $amounttouse =
$object->last_subscription_amount;
10761 $typeforonlinepayment =
'contract';
10764 $typeforonlinepayment =
'ficheinter';
10767 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], (
float) $amounttouse);
10768 $paymenturl = $url;
10772 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
10773 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
10777 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions_be.lib.php';
10782 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10784 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
10787 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10789 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
10792 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10794 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
10797 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
10799 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
10802 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
10804 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
10807 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
10809 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
10812 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
10814 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_ORDER__'] =
'';
10817 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
10819 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_INVOICE__'] =
'';
10823 '@phan-var-force Propal $object';
10825 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/comm/propal/card.php?id=" .
$object->id;
10826 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10827 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', (
string)
$object->ref, 1,
$object);
10830 '@phan-var-force Commande $object';
10832 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT .
"/commande/card.php?id=" .
$object->id;
10835 '@phan-var-force Facture $object';
10837 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/compta/facture/card.php?id=" .
$object->id;
10840 '@phan-var-force Contrat $object';
10842 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT .
"/contrat/card.php?id=" .
$object->id;
10843 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10844 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', (
string)
$object->ref, 1,
$object);
10847 '@phan-var-force Fichinter $object';
10849 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT .
"/fichinter/card.php?id=" .
$object->id;
10850 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10851 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', (
string)
$object->ref, 1,
$object);
10853 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
10854 '@phan-var-force SupplierProposal $object';
10856 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT .
"/supplier_proposal/card.php?id=" .
$object->id;
10858 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
10859 '@phan-var-force FactureFournisseur $object';
10861 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT .
"/fourn/facture/card.php?id=" .
$object->id;
10863 if (is_object(
$object) &&
$object->element ==
'payment_supplier') {
10864 '@phan-var-force PaiementFourn $object';
10867 $liste_factures = [];
10871 $sql =
'SELECT f.ref,f.multicurrency_code as f_mccode, pf.*
10872 FROM '.MAIN_DB_PREFIX.
'paiementfourn_facturefourn as pf
10873 JOIN '.MAIN_DB_PREFIX.
'facture_fourn as f ON pf.fk_facturefourn = f.rowid
10874 WHERE pf.fk_paiementfourn = '.((int)
$object->id);
10876 $resql =
$db->query($sql);
10878 while ($objp =
$db->fetch_object($resql)) {
10879 $liste_factures[] =
' - '.$outputlangs->trans(
'Invoice').
' '. $objp->ref.
' '.$outputlangs->trans(
'AmountPayed').
' '.
price($objp->multicurrency_amount, 0, $outputlangs, 0, -1, -1, $objp->multicurrency_code);
10882 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_LIST__'] = implode(
"\n", $liste_factures);
10884 $substitutionarray[
'__SUPPLIER_PAYMENT_INVOICES_TOTAL__'] =
price(
$object->multicurrency_amount, 0, $outputlangs, 0, -1, -1,
$object->multicurrency_code ?
$object->multicurrency_code :
$conf->currency);
10887 '@phan-var-force Expedition $object';
10889 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT .
"/expedition/card.php?id=" .
$object->id;
10891 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
10892 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'expedition', (
string)
$object->ref, 1,
$object);
10898 '@phan-var-force ActionComm $object';
10900 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
10901 $substitutionarray[
'__EVENT_DESCRIPTION__'] =
$object->note;
10902 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action" .
$object->type_code);
10903 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date(
$object->datep,
'day',
'auto', $outputlangs);
10904 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
10905 $substitutionarray[
'__EVENT_DATE_TZUSER__'] =
dol_print_date(
$object->datep,
'day',
'tzuserrel', $outputlangs);
10906 $substitutionarray[
'__EVENT_TIME_TZUSER__'] =
dol_print_date(
$object->datep,
'hour',
'tzuserrel', $outputlangs);
10911 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
10912 '@phan-var-force Facture|FactureRec $object';
10914 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functionsnumtoword.lib.php';
10917 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
10919 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
10921 $already_payed_all = 0;
10927 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
10931 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
10935 $substitutionarray[
'__DEPOSIT_PERCENT__'] = is_object(
$object) ?
$object->deposit_percent :
'';
10938 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
10940 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
10944 $mysocuselocaltax1 =
false;
10945 $mysocuselocaltax2 =
false;
10947 $tmparray =
$mysoc->useLocalTax(-1);
10948 $mysocuselocaltax1 = $tmparray[1];
10949 $mysocuselocaltax2 = $tmparray[2];
10953 if ($onlykey != 2 || $mysocuselocaltax1) {
10954 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
10956 if ($onlykey != 2 || $mysocuselocaltax2) {
10957 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
10961 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10962 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10963 $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) :
'';
10964 $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)) :
'';
10965 if ($onlykey != 2 || $mysocuselocaltax1) {
10966 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10968 if ($onlykey != 2 || $mysocuselocaltax2) {
10969 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
10972 if ($onlykey != 2) {
10973 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
10974 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
10975 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
10976 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
10977 if ($mysocuselocaltax1) {
10978 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
10980 if (
$mysoc->useLocalTax2) {
10981 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
10985 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
10986 $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) :
'';
10987 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
10988 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
10989 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
10993 if ($onlykey != 2) {
10994 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
10995 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
10996 $substitutionarray[
'__TOTAL_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
11001 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
11002 include_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
11012 $daytext = $outputlangs->trans(
'Day' . $tmp[
'wday']);
11014 $substitutionarray = array_merge($substitutionarray, array(
11015 '__NOW_TMS__' => (
string) $now,
11016 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
11017 '__DAY__' => (
string) $tmp[
'mday'],
11018 '__DAY_TEXT__' => $daytext,
11019 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
11020 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
11021 '__MONTH__' => (
string) $tmp[
'mon'],
11022 '__MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp[
'mon'])),
11023 '__MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp[
'mon'])),
11024 '__MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp[
'mon'])),
11025 '__YEAR__' => (
string) $tmp[
'year'],
11026 '__YEAR_PREVIOUS_MONTH__' => (
string) $tmp3[
'year'],
11027 '__YEAR_NEXT_MONTH__' => (
string) $tmp5[
'year'],
11028 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
11029 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
11030 '__PREVIOUS_MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp3[
'month'])),
11031 '__PREVIOUS_MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp3[
'month'])),
11032 '__PREVIOUS_MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp3[
'month'])),
11033 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
11034 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
11035 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
11036 '__NEXT_MONTH_TEXT__' => $outputlangs->transnoentitiesnoconv(
'Month' . sprintf(
"%02d", $tmp5[
'month'])),
11037 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->transnoentitiesnoconv(
'MonthShort' . sprintf(
"%02d", $tmp5[
'month'])),
11038 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->transnoentitiesnoconv(
'MonthVeryShort' . sprintf(
"%02d", $tmp5[
'month'])),
11039 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
11044 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' =>
$conf->entity));
11046 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
11047 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
11048 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->transnoentitiesnoconv(
'TranslationOfKey');
11049 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->transnoentitiesnoconv(
'TranslationOfKey') .
' (load also language file before)';
11050 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->transnoentitiesnoconv(
'ValueOfConstantKey');
11055 return $substitutionarray;
11074function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
11076 global
$db, $langs;
11078 if (!is_array($substitutionarray)) {
11079 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
11082 if (empty($outputlangs)) {
11083 $outputlangs = $langs;
11093 if (is_object($outputlangs)) {
11095 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
11097 $tmp = explode(
'|', $reg[1]);
11098 if (!empty($tmp[1])) {
11099 $outputlangs->load($tmp[1]);
11102 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
11104 if (empty($converttextinhtmlifnecessary)) {
11106 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
11108 if (preg_match(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $text)) {
11109 if (! $msgishtml) {
11113 if ($valueishtml) {
11121 $text = preg_replace(
'/__\(' . preg_quote($reg[1],
'/') .
'\)__/', $value, $text);
11129 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
11130 $originalkeyfound = $reg[1];
11131 $keyfound = preg_replace(
'/\|urlencode$/',
'', $originalkeyfound);
11134 $value =
'*****forbidden*****';
11138 if (preg_match(
'/\|urlencode$/', $originalkeyfound)) {
11139 $value = urlencode($value);
11143 if (empty($converttextinhtmlifnecessary)) {
11145 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
11147 if (preg_match(
'/__\[' . preg_quote($reg[1],
'/') .
'\]__/', $text)) {
11148 if (! $msgishtml) {
11151 if ($valueishtml) {
11159 $text = preg_replace(
'/__\[' . preg_quote($originalkeyfound,
'/') .
'\]__/', $value, $text);
11164 foreach ($substitutionarray as $key => $value) {
11165 if (!isset($value)) {
11169 if (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN') && ($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__')) {
11172 if (empty($converttextinhtmlifnecessary)) {
11173 $text = str_replace((
string) $key, (
string) $value, $text);
11175 if (strpos($text, (
string) $key) !==
false) {
11176 if (! $msgishtml) {
11179 if ($valueishtml) {
11187 $text = str_replace((
string) $key, (
string) $value, $text);
11202 $memory_object_list = array();
11203 foreach ($substitutionarray as $key => $value) {
11204 $lazy_load_arr = array();
11205 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
11206 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
11207 $key_to_substitute = $lazy_load_arr[1];
11208 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
11209 $param_arr = explode(
':', (
string) $value);
11211 if (count($param_arr) >= 4) {
11212 $path = $param_arr[0];
11213 $class = $param_arr[1];
11214 $method = $param_arr[2];
11215 $id = (int) $param_arr[3];
11216 $keyinarrayresult = empty($param_arr[4]) ?
'' : $param_arr[4];
11219 if (!isset($memory_object_list[$class])) {
11221 require_once DOL_DOCUMENT_ROOT . $path;
11222 if (class_exists($class)) {
11223 $memory_object_list[$class] = array(
11231 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
11232 if (method_exists($class, $method)) {
11233 if (!isset($memory_object_list[$class][
'list'][
$id])) {
11234 $tmpobj =
new $class(
$db);
11236 $tmpvaluetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
11237 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
11240 $tmpobj = $memory_object_list[$class][
'list'][
$id];
11242 $tmpvaluetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
11245 if ($keyinarrayresult) {
11246 $valuetouseforsubstitution = (
string) $tmpvaluetouseforsubstitution[$keyinarrayresult];
11248 $valuetouseforsubstitution = (
string) $tmpvaluetouseforsubstitution;
11250 $text = str_replace((
string) $key_to_substitute, $valuetouseforsubstitution, $text);
11276 global
$conf, $user;
11278 require_once DOL_DOCUMENT_ROOT .
'/core/lib/files.lib.php';
11283 $dirsubstitutions = array_merge(array(), (array)
$conf->modules_parts[
'substitutions']);
11285 foreach ($dirsubstitutions as $reldir) {
11293 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
11294 foreach ($substitfiles as $substitfile) {
11296 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
11299 dol_syslog(
"Library " . $substitfile[
'name'] .
" found into " . $dir);
11301 require_once $dir . $substitfile[
'name'];
11303 $function_name = $module .
"_" . $callfunc;
11304 if (function_exists($function_name)) {
11305 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
11313 foreach ($substitutionarray as $key => $value) {
11314 $tags .=
'{' . $key .
'} => ' . $value .
"\n";
11316 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
11350 if (!is_object($outputlangs)) {
11351 $outputlangs = $langs;
11355 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date(
$date_start, $format, false, $outputlangs),
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11358 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date(
$date_start, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11361 $out .= ($withparenthesis ? ($withparenthesis == 1 ?
' ' :
'').
'(' :
'') . $outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format, false, $outputlangs)) . ($withparenthesis ?
')' :
'');
11379 if ($nameorder < 0) {
11382 if ($nameorder == 1) {
11383 $ret .= $firstname;
11384 if ($firstname && $lastname) {
11388 } elseif ($nameorder == 2 || $nameorder == 3) {
11389 $ret .= $firstname;
11390 if (empty($ret) && $nameorder == 3) {
11395 if (empty($ret) && $nameorder == 5) {
11396 $ret .= $firstname;
11398 if ($nameorder == 0) {
11399 if ($firstname && $lastname) {
11402 $ret .= $firstname;
11421function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
11424 if (!is_array($mesgs)) {
11425 $mesgs = trim((
string) $mesgs);
11428 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
11432 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11434 $_SESSION[
'dol_events'][$style][] = $mesgs;
11439 foreach ($mesgs as $mesg) {
11440 $mesg = trim((
string) $mesg);
11442 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
11446 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
11448 $_SESSION[
'dol_events'][$style][] = $mesg;
11468function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
11470 if (empty($mesg) && empty($mesgs)) {
11478 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE" . $messagekey])) {
11479 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
11480 dol_print_error(
null,
'Bad parameter style=' . $style .
' for setEventMessages');
11482 if (empty($mesgs)) {
11485 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
11506 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
11507 if (empty($disabledoutputofmessages)) {
11510 unset($_SESSION[
'dol_events'][
'mesgs']);
11513 if (isset($_SESSION[
'dol_events'][
'errors'])) {
11514 if (empty($disabledoutputofmessages)) {
11517 unset($_SESSION[
'dol_events'][
'errors']);
11521 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
11522 if (empty($disabledoutputofmessages)) {
11525 unset($_SESSION[
'dol_events'][
'warnings']);
11543function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
11545 global
$conf, $langs;
11550 $divstart = $divend =
'';
11553 if ((empty(
$conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || defined(
'DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
11554 $divstart =
'<div class="' . $style .
' clearboth">';
11555 $divend =
'</div>';
11558 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
11559 $langs->load(
"errors");
11561 if (is_array($mesgarray) && count($mesgarray)) {
11562 foreach ($mesgarray as $message) {
11564 $out .= $langs->trans($message);
11565 if ($ret < count($mesgarray)) {
11572 $out .= $langs->trans($mesgstring);
11578 if (!empty(
$conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && !defined(
'DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
11579 $return =
'<script nonce="' .
getNonce() .
'">
11580 $(document).ready(function() {
11581 /* jnotify(message, preset of message type, keepmessage) */
11582 $.jnotify("' .
dol_escape_js($out) .
'", "' . ($style ==
"ok" ? 3000 : $style) .
'", ' . ($style ==
"ok" ?
"false" :
"true") .
',{ remove: function (){} } );
11622function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
11624 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
11630 if (is_array($mesgarray)) {
11631 foreach ($mesgarray as $val) {
11632 if ($val && preg_match(
'/class="error"/i', $val)) {
11636 if ($val && preg_match(
'/class="warning"/i', $val)) {
11641 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
11643 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
11646 if ($style ==
'error' || $style ==
'errors') {
11649 if ($style ==
'warning' || $style ==
'warnings') {
11653 if ($iserror || $iswarning) {
11655 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
11656 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
11657 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
11659 if (is_array($mesgarray)) {
11660 $newmesgarray = array();
11661 foreach ($mesgarray as $val) {
11662 if (is_string($val)) {
11663 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
11664 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
11665 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
11666 $newmesgarray[] = $tmpmesgstring;
11668 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
11671 $mesgarray = $newmesgarray;
11673 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
11702function dolSort($arraytosort)
11704 sort($arraytosort);
11705 return $arraytosort;
11729function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
11732 $order = strtolower($order);
11734 if (is_array($array)) {
11735 $sizearray = count($array);
11736 if ($sizearray > 0) {
11739 foreach (array_keys($array) as $key) {
11740 $tmpmultikey = explode(
',', $index);
11741 $newindex = $tmpmultikey[0];
11742 if (is_object($array[$key])) {
11743 $temp[$key] = empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex;
11745 if (!empty($tmpmultikey[1])) {
11746 $newindex = $tmpmultikey[1];
11747 $temp[$key] .=
'__' . (empty($array[$key]->$newindex) ? 0 : $array[$key]->$newindex);
11751 $temp[$key] = empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex];
11753 if (!empty($tmpmultikey[1])) {
11754 $newindex = $tmpmultikey[1];
11756 $temp[$key] .=
'__' . (empty($array[$key][$newindex]) ? 0 : $array[$key][$newindex]);
11759 if ($natsort == -1) {
11760 $temp[$key] =
'___' . $temp[$key];
11763 if (empty($natsort) || $natsort == -1) {
11764 if ($order ==
'asc') {
11770 if ($case_sensitive) {
11773 natcasesort($temp);
11775 if ($order !=
'asc') {
11776 $temp = array_reverse($temp,
true);
11782 foreach (array_keys($temp) as $key) {
11783 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
11805 $strLength = strlen($str);
11806 for ($i = 0; $i < $strLength; $i++) {
11807 if (ord($str[$i]) < 0x80) {
11809 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
11811 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
11813 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
11815 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
11817 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
11822 for ($j = 0; $j < $n; $j++) {
11823 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
11844 return preg_match(
'//u', $str) ? true :
false;
11856 if (function_exists(
'mb_check_encoding')) {
11858 if (!mb_check_encoding($str,
'ASCII')) {
11862 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
11880 $tmp = ini_get(
"unicode.filesystem_encoding");
11881 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
11882 $tmp =
'iso-8859-1';
11891 if ($tmp ==
'iso-8859-1') {
11892 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
11913function dol_getIdFromCode(
$db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
11923 if ($useCache && isset(
$conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
11924 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
11927 dol_syslog(
'dol_getIdFromCode (value for field ' . $fieldid .
' from key ' . $key .
' not found into cache)', LOG_DEBUG);
11929 $sql =
"SELECT " .
$db->sanitize($fieldid) .
" as valuetoget";
11930 $sql .=
" FROM " . MAIN_DB_PREFIX .
$db->sanitize($tablename);
11931 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
11932 $sql .=
" WHERE " .
$db->sanitize($fieldkey) .
" = " . ((int) $key);
11934 $sql .=
" WHERE " .
$db->sanitize($fieldkey) .
" = '" .
$db->escape($key) .
"'";
11936 if (!empty($entityfilter)) {
11937 $sql .=
" AND entity IN (" .
getEntity($tablename) .
")";
11943 $resql =
$db->query($sql);
11945 $obj =
$db->fetch_object($resql);
11948 $valuetoget = $obj->valuetoget;
11949 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
11951 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
11955 return $valuetoget;
11975 $regextext = preg_replace(
'#^/\^?#',
'', (
string) $regextext);
11976 $regextext = preg_replace(
'#\$?/[imsxuADSUXJ]*$#',
'', $regextext);
11978 if ($matchrule == 1) {
11979 if ($var ==
'mainmenu') {
11981 return (preg_match(
'/^' . $regextext .
'/', $mainmenu));
11982 } elseif ($var ==
'leftmenu') {
11984 return (preg_match(
'/^' . $regextext .
'/', $leftmenu));
11986 return 'This variable is not accessible with dol_eval';
11989 return 'This value '.$matchrule.
' for param $matchrule is not yet implemented';
12003function verifCond($strToEvaluate, $onlysimplestring =
'1')
12007 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
12010 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
12014 $rights = (bool) $rep && (!is_string($rep) || (strpos($rep,
'Exception during') ===
false && strpos($rep,
'Bad call of') ===
false && strpos($rep,
'Bad string syntax to evaluate') ===
false));
12035function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
12037 if ($returnvalue != 1) {
12038 dol_syslog(
"Use of dol_eval with parameter returnvalue = 0 is now forbidden. Please fix this", LOG_ERR);
12041 global $dolibarr_main_use_dol_eval_new;
12042 if (!empty($dolibarr_main_use_dol_eval_new)) {
12063 $db, $langs, $user, $website, $websitepage,
12064 $action, $mainmenu, $leftmenu,
12076 defined(
'T_COALESCE_EQUAL') || define(
'T_COALESCE_EQUAL', PHP_INT_MAX);
12077 defined(
'T_FN') || define(
'T_FN', PHP_INT_MAX);
12080 defined(
'T_ATTRIBUTE') || define(
'T_ATTRIBUTE', PHP_INT_MAX);
12081 defined(
'T_MATCH') || define(
'T_MATCH', PHP_INT_MAX);
12082 defined(
'T_NAME_FULLY_QUALIFIED') || define(
'T_NAME_FULLY_QUALIFIED', PHP_INT_MAX);
12083 defined(
'T_NAME_QUALIFIED') || define(
'T_NAME_QUALIFIED', PHP_INT_MAX);
12084 defined(
'T_NAME_RELATIVE') || define(
'T_NAME_RELATIVE', PHP_INT_MAX);
12087 defined(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
12088 defined(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG') || define(
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG', PHP_INT_MAX);
12089 defined(
'T_ENUM') || define(
'T_ENUM', PHP_INT_MAX);
12090 defined(
'T_READONLY') || define(
'T_READONLY', PHP_INT_MAX);
12093 defined(
'T_PRIVATE_SET') || define(
'T_PRIVATE_SET', PHP_INT_MAX);
12094 defined(
'T_PROTECTED_SET') || define(
'T_PROTECTED_SET', PHP_INT_MAX);
12095 defined(
'T_PUBLIC_SET') || define(
'T_PUBLIC_SET', PHP_INT_MAX);
12097 $prohibited_token_ids = [
12104 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG',
12105 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG',
12155 'T_OPEN_TAG_WITH_ECHO',
12189 $prohibited_variables = [
12201 $forbiddenphpfunctions = array();
12202 $forbiddenphpmethods = array();
12205 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
12206 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
12207 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function"));
12209 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"GETPOST"));
12211 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
12214 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"call_user_func",
"call_user_func_array"));
12215 $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"));
12216 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort"));
12217 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
12218 $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"));
12219 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
12220 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
12221 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
12224 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
12225 $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"));
12226 $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", ));
12227 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"putenv",
"dl",
"apache_child_terminate",
"apache_setenv"));
12228 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"executeCLI",
"verifCond",
"dolEncrypt",
"dolDecrypt"));
12229 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
12232 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
12234 $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"));
12235 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"chdir",
"dir",
"fopen",
"file",
"file_exists",
"file_get_contents",
"file_put_contents",
"fget",
"fgetc",
"fgetcsv",
"flock",
"fputs",
"fputscsv",
"fpassthru",
"fscanf",
"fseek",
"fwrite",
"is_file",
"is_dir",
"is_link",
"mkdir",
"opendir",
"rmdir",
"scandir",
"symlink",
"touch",
"unlink",
"umask"));
12239 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64" .
"_" .
"decode",
"rawurl" .
"decode",
"url" .
"decode",
"str" .
"_rot13",
"hex" .
"2bin",
"printf",
"sprintf"));
12240 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concat",
"dol_concatdesc"));
12243 $forbiddenphpmethods = array_merge($forbiddenphpmethods, array(
'invoke',
'invokeArgs'));
12245 $prohibited_functions = array_merge($forbiddenphpfunctions, $forbiddenphpmethods);
12247 $prohibited_token_arrangements = [
12252 ' T_CONSTANT_ENCAPSED_STRING ( ',
12256 $tokens = token_get_all(
"<?php return {$s};", TOKEN_PARSE);
12258 $tokens_arrangement =
' ';
12260 for ($i = 2,
$c = count($tokens) - 1; $i <
$c; ++$i) {
12261 if (is_array($tokens[$i])) {
12262 $token_id = $tokens[$i][0];
12263 $token_value = $tokens[$i][1];
12264 $token_name = token_name($tokens[$i][0]);
12266 $token_id = $tokens[$i];
12267 $token_value = $tokens[$i];
12268 $token_name = $tokens[$i];
12272 if (T_WHITESPACE === $token_id) {
12277 $tokens_arrangement .=
"{$token_name} ";
12281 T_VARIABLE === $token_id
12282 && in_array($token_value, $prohibited_variables,
true)
12284 return "Bad string syntax to evaluate. « {$token_value} » is prohibited in « {$s} »";
12289 T_STRING === $token_id
12290 && in_array($token_value, $prohibited_functions,
true)
12292 return "Bad string syntax to evaluate. « {$token_value} » is prohibited in « {$s} »";
12297 $maxi = count($prohibited_token_ids);
12298 for ($i = 0; $i < $maxi; ++$i) {
12299 if (
false !== strpos($tokens_arrangement,
" {$prohibited_token_ids[$i]} ")) {
12300 return "Bad string syntax to evaluate. « {$prohibited_token_ids[$i]} » is prohibited in « {$s} »";
12305 $maxi = count($prohibited_token_arrangements);
12306 for ($i = 0; $i < $maxi; ++$i) {
12307 if (
false !== strpos($tokens_arrangement, $prohibited_token_arrangements[$i])) {
12308 return "Bad string syntax to evaluate. « {$prohibited_token_arrangements[$i]} » is prohibited in « {$s} »";
12314 return @eval(
"return {$s};") ??
'';
12315 }
catch (Throwable $ex) {
12316 return "Bad string syntax to evaluate. Exception during evaluation: " . $s .
" - " . $ex->getMessage();
12340 global
$db, $langs, $user, $website, $websitepage;
12341 global $action, $mainmenu, $leftmenu;
12343 global $objectoffield;
12351 $isObBufferActive =
false;
12352 if ($onlysimplestring ==
'0') {
12353 $onlysimplestring =
'1';
12355 if (!in_array($onlysimplestring, array(
'1',
'2'))) {
12356 return "Bad call of dol_eval. Parameter onlysimplestring must be '1' or '2'.";
12358 if (!is_scalar($s)) {
12359 return "Bad call of dol_eval. First parameter must be a string, found ".var_export($s,
true);
12363 global $dolibarr_main_restrict_eval_methods;
12366 if (!isset($dolibarr_main_restrict_eval_methods)) {
12367 $dolibarr_main_restrict_eval_methods =
'getDolGlobalString, getDolGlobalInt, getDolCurrency, getDolEntity, getDolDBType, fetchNoCompute, hasRight, isAdmin, isExternalUser, isModEnabled, isStringVarMatching, abs, min, max, round, dol_now, preg_match';
12370 $dolibarr_main_restrict_eval_methods_array = explode(
',', str_replace(
" ",
"", $dolibarr_main_restrict_eval_methods));
12378 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
12379 if ($onlysimplestring ==
'2') {
12380 $specialcharsallowed .=
'<[]';
12382 global $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12383 if (!empty($dolibarr_main_allow_unsecured_special_chars_in_dol_eval)) {
12384 $specialcharsallowed .= (
string) $dolibarr_main_allow_unsecured_special_chars_in_dol_eval;
12386 if (preg_match(
'/[^a-z0-9\s' . preg_quote($specialcharsallowed,
'/') .
']/i', $s)) {
12387 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): ' . $s;
12399 if (strpos($s,
'/*') !==
false || strpos($s,
'//') !==
false) {
12400 return 'Bad string syntax to evaluate (The comment string /* and // are not allowed): ' . $s;
12404 $tmps = str_replace(
' ? ',
'__XXX__', $s);
12405 if (strpos($tmps,
'?') !==
false) {
12406 return 'Bad string syntax to evaluate (The char ? can be used only with a space before and after): ' . $s;
12410 if (preg_match(
'/<=?[^\s]/', $s)) {
12411 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found a < or <= without space after): ' . $s;
12415 if (preg_match(
'/(include|include_once|require|require_once)/', $s)) {
12416 return 'Bad string syntax to evaluate (found not allowed key include|include_once|require|require_once): ' . $s;
12420 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
12421 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;
12424 if (empty($dolibarr_main_restrict_eval_methods)) {
12430 while ($scheck && $savescheck != $scheck) {
12431 $savescheck = $scheck;
12432 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12433 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
12434 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
12435 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
12436 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
12437 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12438 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
12439 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
12440 $scheck = preg_replace(
'/\s!\(/',
' __NOTANDPARENTHESIS__', $scheck);
12441 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
12446 if (strpos($scheck,
'(') !==
false) {
12447 return 'Bad string syntax to evaluate (mode ' . $onlysimplestring .
', found call of a function or method without using the direct name of the function): ' . $s;
12451 if (strpos($s,
'`') !==
false) {
12452 return 'Bad string syntax to evaluate (backtick char is forbidden): ' . $s;
12457 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
12458 return 'Bad string syntax to evaluate (dot char is forbidden if not strictly between 2 numbers): ' . $s;
12466 while ($scheck && $savescheck != $scheck) {
12467 $savescheck = $scheck;
12468 $scheck = preg_replace(
'/\$conf->[a-z\_]+->enabled/',
'__VARCONFENABLED__', $scheck);
12469 $scheck = preg_replace(
'/\$user->id/',
'__VARUSERID__', $scheck);
12470 $scheck = preg_replace(
'/\$user->hasRight/',
'__VARUSERHASRIGHT__', $scheck);
12471 $scheck = preg_replace(
'/\$user->rights/',
'__VARUSERHASRIGHT__', $scheck);
12472 $scheck = preg_replace(
'/\$user->isAdmin/',
'__VARUSERHASRIGHT__', $scheck);
12473 $scheck = preg_replace(
'/\$user->admin/',
'__VARUSERISADMIN__', $scheck);
12474 $scheck = preg_replace(
'/\$user->isExternalUser/',
'__VARUSERSOCID__', $scheck);
12475 $scheck = preg_replace(
'/\$user->socid/',
'__VARUSERSOCID__', $scheck);
12476 $scheck = preg_replace(
'/\(\$db\)/',
'__VARDB__', $scheck);
12477 $scheck = preg_replace(
'/\$langs/',
'__VARLANGSTRANS__', $scheck);
12478 $scheck = preg_replace(
'/\$mysoc/',
'__VARMYSOC__', $scheck);
12479 $scheck = preg_replace(
'/\$action/',
'__VARACTION__', $scheck);
12480 $scheck = preg_replace(
'/\$mainmenu/',
'__VARMAINMENU__', $scheck);
12481 $scheck = preg_replace(
'/\$leftmenu/',
'__VARLEFTMENU__', $scheck);
12482 $scheck = preg_replace(
'/\$websitepage/',
'__VARWEBSITEPAGE__', $scheck);
12483 $scheck = preg_replace(
'/\$website/',
'__VARWEBSITE__', $scheck);
12484 $scheck = preg_replace(
'/\$objectoffield/',
'__VAROBJECTOFFIELD__', $scheck);
12485 $scheck = preg_replace(
'/\$object/',
'__VAROBJECT__', $scheck);
12486 $scheck = preg_replace(
'/\$var/',
'__VARVAR__', $scheck);
12489 $scheck = preg_replace(
'/\$soc->canvas/',
'__VARSOCCANVAS__', $scheck);
12490 $scheck = preg_replace(
'/\$obj->canvas/',
'__VAROBJCANVAS__', $scheck);
12493 if (strpos($scheck,
'$') !==
false) {
12494 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);
12495 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;
12500 $forbiddenphpstrings = array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_GLOBAL',
'_POST',
'_REQUEST',
'ReflectionFunction',
'SplFileObject',
'SplTempFileObject');
12502 if (empty($dolibarr_main_restrict_eval_methods)) {
12506 $forbiddenphpfunctions = array();
12507 $forbiddenphpmethods = array();
12509 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
12510 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
12511 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function"));
12513 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"GETPOST"));
12515 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
12518 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"call_user_func",
"call_user_func_array"));
12519 $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"));
12520 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort"));
12521 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
12522 $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"));
12523 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
12524 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
12525 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
12528 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
12529 $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"));
12530 $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", ));
12531 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"putenv",
"dl",
"apache_child_terminate",
"apache_setenv"));
12532 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"dol_eval_new",
"dol_eval_standard",
"executeCLI",
"verifCond",
"dolEncrypt",
"dolDecrypt"));
12533 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
12536 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
12538 $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"));
12539 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"chdir",
"dir",
"fopen",
"file",
"file_exists",
"file_get_contents",
"file_put_contents",
"fget",
"fgetc",
"fgetcsv",
"flock",
"fputs",
"fputscsv",
"fpassthru",
"fscanf",
"fseek",
"fwrite",
"is_file",
"is_dir",
"is_link",
"mkdir",
"opendir",
"rmdir",
"scandir",
"symlink",
"touch",
"unlink",
"umask"));
12543 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64" .
"_" .
"decode",
"rawurl" .
"decode",
"url" .
"decode",
"str" .
"_rot13",
"hex" .
"2bin",
"printf",
"sprintf"));
12544 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_concat",
"dol_concatdesc"));
12553 $forbiddenphpmethods = array_merge($forbiddenphpmethods, array(
'invoke',
'invokeArgs'));
12561 $forbiddenphpregex =
'global\s*\$';
12562 $forbiddenphpregex .=
'|posix_[a-zA-Z0-9_]*|';
12563 $forbiddenphpregex .=
'\b(' . implode(
'|', $forbiddenphpfunctions) .
')\b';
12565 $forbiddenphpmethodsregex =
'->(' . implode(
'|', $forbiddenphpmethods) .
')';
12569 $oldstringtoclean = $s;
12570 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12571 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12572 $s = preg_replace(
'/' . $forbiddenphpmethodsregex .
'/i',
'__forbiddenstring__', $s);
12574 }
while ($oldstringtoclean != $s);
12576 if (strpos($s,
'__forbiddenstring__') !==
false) {
12577 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12578 return 'Bad string syntax to evaluate: ' . $s;
12582 if (!empty($dolibarr_main_restrict_eval_methods)) {
12585 $pattern =
'/([\s\w\'\]\"]+)\(/';
12587 $matches = array();
12588 preg_match_all($pattern, $s, $matches);
12590 if (count($matches)) {
12591 foreach ($matches[1] as $m) {
12597 if (!preg_match(
'/new ([A-Z][\w]+)/i', $m, $reg)) {
12598 if (!in_array($m, $dolibarr_main_restrict_eval_methods_array)) {
12599 if ($m !=
"'" && $m !=
'"') {
12600 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12601 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;
12605 if (!class_exists($reg[1])) {
12606 dol_syslog(
'Bad string syntax to evaluate: Class "'.$reg[1].
'" does not exist. ' . $s, LOG_WARNING);
12607 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" does not exist. ' . $s;
12609 $parents = class_parents($reg[1]);
12610 if (!in_array(
'CommonObject', $parents)) {
12611 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);
12612 return 'Bad string syntax to evaluate. Class "'.$reg[1].
'" is not allowed because only classes extended CommonObject can be used in dynamic evaluation. ' . $s;
12618 $forbiddenphpregex =
'global\s*\$';
12619 $forbiddenphpregex .=
'|';
12620 $forbiddenphpregex .=
'}\s*\[';
12621 $forbiddenphpregex .=
'|';
12622 $forbiddenphpregex .=
'\)\s*\(';
12626 $oldstringtoclean = $s;
12627 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
12628 $s = preg_replace(
'/' . $forbiddenphpregex .
'/i',
'__forbiddenstring__', $s);
12631 }
while ($oldstringtoclean != $s);
12633 if (strpos($s,
'__forbiddenstring__') !==
false) {
12634 dol_syslog(
'Bad string syntax to evaluate: ' . $s, LOG_WARNING);
12635 return 'Bad string syntax to evaluate: ' . $s;
12641 $isObBufferActive =
true;
12642 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
12643 $tmpo = ob_get_clean();
12644 $isObBufferActive =
false;
12646 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
12650 if ($isObBufferActive) {
12652 $tmpo = ob_get_clean();
12653 $isObBufferActive =
false;
12655 $error =
'dol_eval try/catch error for string: ' . $s .
' - Error: ';
12656 $error .= $e->getMessage();
12658 return 'Exception during evaluation: ' . $s;
12659 }
catch (Error $e) {
12660 if ($isObBufferActive) {
12662 $tmpo = ob_get_clean();
12663 $isObBufferActive =
false;
12665 $error =
'dol_eval try/catch error for string: ' . $s .
' - Error: ';
12666 $error .= $e->getMessage();
12668 return 'Exception during evaluation: ' . $s;
12681 return (trim($element) !=
'');
12694 if (empty($codelang)) {
12698 if ($codelang ==
'auto') {
12699 return '<span class="fa fa-language"></span>';
12702 $langtocountryflag = array(
12704 'ca_ES' =>
'catalonia',
12708 'sw_SW' =>
'unknown',
12718 if (isset($langtocountryflag[$codelang])) {
12719 $flagImage = $langtocountryflag[$codelang];
12721 $tmparray = explode(
'_', $codelang);
12722 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
12727 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
12728 $morecss = $reg[1];
12733 return '<span class="flag-sprite ' . strtolower($flagImage) . ($morecss ?
' ' . $morecss :
'') .
'"' . ($moreatt ?
' ' . $moreatt :
'') . (!$notitlealt ?
' title="' . $codelang .
'"' :
'') .
'></span>';
12747 if (empty($countrycode)) {
12751 if (strtoupper($countrycode) ==
'MQ') {
12754 if (strtoupper($countrycode) ==
'SE') {
12757 if (strtoupper($countrycode) ==
'CH') {
12758 if (
$mysoc->country_code ==
'FR') {
12761 if (
$mysoc->country_code ==
'DE') {
12764 if (
$mysoc->country_code ==
'IT') {
12946 $buildprimarykeytotest = strtolower($countrycode) .
'-' . strtoupper($countrycode);
12947 if (in_array($buildprimarykeytotest, $locales)) {
12948 return strtolower($countrycode) .
'_' . strtoupper($countrycode);
12951 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
12952 foreach ($locales as $locale) {
12953 $locale_language = locale_get_primary_language($locale);
12954 $locale_region = locale_get_region($locale);
12955 if (strtoupper($countrycode) == $locale_region) {
12957 return strtolower($locale_language) .
'_' . strtoupper($locale_region);
12961 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
12999 global $hookmanager,
$db;
13001 if (isset(
$conf->modules_parts[
'tabs'][$type]) && is_array(
$conf->modules_parts[
'tabs'][$type])) {
13002 foreach (
$conf->modules_parts[
'tabs'][$type] as $value) {
13003 $values = explode(
':', $value);
13006 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
13007 if (count($values) !== 6) {
13008 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);
13015 if ($values[0] != $type) {
13023 $posstart = strpos($str,
'(');
13024 if ($posstart > 0) {
13025 $posend = strpos($str,
')');
13026 if ($posstart > 0) {
13027 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
13028 if (is_numeric($res1)) {
13029 $postab = (int) $res1;
13030 $values[1] =
'+' . substr($str, $posend + 1);
13035 global $objectoffield;
13043 if ($filterorigmodule) {
13044 if (strpos($values[3],
'@')) {
13045 if ($filterorigmodule !=
'external') {
13049 if ($filterorigmodule !=
'core') {
13054 $langs->load($values[3]);
13057 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
13059 $substitutionarray = array();
13064 $labeltemp = explode(
',', $values[2]);
13065 $label = $langs->trans($labeltemp[0]);
13067 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
13069 $classtoload = $labeltemp[1];
13070 if (class_exists($classtoload)) {
13071 $obj =
new $classtoload(
$db);
13072 $function = $labeltemp[3];
13073 if ($obj && $function && method_exists($obj, $function)) {
13075 $nbrec = $obj->$function(
$object->id, $obj);
13076 if (!empty($nbrec)) {
13077 $label .=
'<span class="badge marginleftonlyshort">' . $nbrec .
'</span>';
13083 $url = preg_replace(
'/__ID__/i', ((is_object(
$object) && !empty(
$object->id)) ?
$object->id :
''), $values[5]);
13084 $link = parse_url($url);
13086 if (isset($link[
'query'])) {
13087 parse_str($link[
'query'], $query);
13090 $newtab[1] = $label;
13091 $newtab[2] = str_replace(
'+',
'', $values[1]);
13095 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
13096 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
13097 if ($values[0] != $type) {
13100 $tabname = str_replace(
'-',
'', $values[1]);
13101 foreach ($head as $key => $val) {
13102 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
13104 if ($head[$key][2] == $tabname && $condition) {
13105 unset($head[$key]);
13114 if (!empty($hookmanager)) {
13115 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule,
'type' => $type);
13117 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
13118 if ($reshook > 0) {
13119 $head = $hookmanager->resArray;
13121 $head = array_merge($head, $hookmanager->resArray);
13140 global
$conf, $hookmanager, $user, $langs;
13142 global $micro_start_time;
13144 if ($zone ==
'private') {
13145 print
"\n" .
'<!-- Common footer for private page -->' .
"\n";
13147 print
"\n" .
'<!-- Common footer for public page -->' .
"\n";
13151 print
"\n<!-- A div to store page_y POST parameter -->\n";
13152 print
'<div id="page_y" style="display: none;">' . (
GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'') .
'</div>' .
"\n";
13154 $parameters = array(
'zone' => $zone);
13157 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters, $tmpobject, $action);
13158 if (empty($reshook)) {
13164 if (!empty(
$conf->use_javascript_ajax)) {
13165 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
13166 print
'<script>' .
"\n";
13167 print
'jQuery(document).ready(function() {' .
"\n";
13169 if ($zone ==
'private' && empty(
$conf->dol_use_jmobile)) {
13171 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */' .
"\n";
13172 print
'jQuery("li.menuhider").click(function(event) {';
13173 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }' .
"\n";
13174 print
' console.log("We click on .menuhider");' .
"\n";
13175 print
' $("body").toggleClass("sidebar-collapse")' .
"\n";
13176 print
'});' .
"\n";
13180 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"])))) {
13181 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */' .
"\n";
13182 $relativepathstring = $_SERVER[
"PHP_SELF"];
13184 if (constant(
'DOL_URL_ROOT')) {
13185 $relativepathstring = preg_replace(
'/^' . preg_quote(constant(
'DOL_URL_ROOT'),
'/') .
'/',
'', $relativepathstring);
13187 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
13188 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
13191 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
13192 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
13194 if ($defkey !=
'_noquery_') {
13195 $tmpqueryarraytohave = explode(
'&', $defkey);
13197 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
13198 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
13200 if (!
GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
13204 if (!$foundintru) {
13213 print
'console.log("set the focus by executing jQuery(...).focus();")' .
"\n";
13214 foreach ($defval as $paramkey => $paramval) {
13216 print
'jQuery("input[name=\'' . $paramkey .
'\']
").focus();' . "\n
";
13217 print 'jQuery("textarea[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // TODO KO with ckeditor
13218 print 'jQuery("select[
name=\
'' . $paramkey .
'\']
").focus();' . "\n
"; // Not really useful, but we keep it in case of.
13223 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
13224 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
13226 if ($defkey != '_noquery_') {
13227 $tmpqueryarraytohave = explode('&', $defkey);
13229 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
13230 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
13231 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
13232 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
13236 if (!$foundintru) {
13239 //var_dump($defkey.'-'.$qualified);
13245 print 'console.log("set the js code to manage fields that are
set as mandatory
");' . "\n
";
13247 foreach ($defval as $paramkey => $paramval) {
13248 // Solution 1: Add handler on submit to check if mandatory fields are empty
13249 print 'var form = $(\'[name="'.dol_escape_js($paramkey).'"]\').closest("form
");'."\n
";
13250 print "form.on(
'submit',
function(event) {
13251 var submitter = \$(
this).find(
':submit:focus').get(0);
13252 var buttonName = submitter ? \$(submitter).attr(
'name') :
'save';
13254 if (buttonName ==
'cancel') {
13255 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
13259 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');
13261 var tmpvalue = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').val();
13262 let tmptypefield = jQuery(
'[name=\"".dol_escape_js($paramkey)."\"]').prop(
'nodeName').toLowerCase();
13264 if (tmptypefield ==
'textarea') {
13266 var tmpeditor = (typeof CKEDITOR !==
'undefined') ? CKEDITOR.instances[
'".dol_escape_js($paramkey)."'] : null;
13268 tmpvalue = tmpeditor.getData();
13269 console.log(
'For textarea tmpvalue is '+tmpvalue);
13273 let tmpvalueisempty =
false;
13274 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1 || tmpvalue ===
'-1') {
13275 tmpvalueisempty =
true;
13277 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
13278 tmpvalueisempty =
true;
13280 if (tmpvalueisempty && buttonName !==
'cancel') {
13281 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
13282 event.preventDefault();
13283 event.stopPropagation();
13285 alert(
'".dol_escape_js($langs->transnoentitiesnoconv("ErrorFieldRequired", $paramkey).' (
'.$langs->transnoentitiesnoconv("CustomMandatoryFieldRule").')
')."');
13289 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
13294 // Solution 2: Add property 'required' on input
13295 // so browser will check value and try to focus on it when submitting the form.
13296 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
13297 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13298 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
13299 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
13300 //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
";
13301 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
13307 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");' .
"\n";
13311 print
'jQuery("input[name=\'cancel\']").click(function() {
13312 console.log("We click on cancel button so removed all required attribute");
13313 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
13320 print
'});' .
"\n";
13323 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
13325 print
"/* JS CODE TO ENABLE to add memory info */\n";
13326 print
'window.console && console.log("';
13331 if (!empty($micro_start_time)) {
13332 $micro_end_time = microtime(
true);
13333 print
' - Build time: ' . ceil(1000 * ($micro_end_time - $micro_start_time)) .
' ms';
13336 if (function_exists(
"memory_get_usage")) {
13337 print
' - Mem: ' . memory_get_usage();
13339 if (function_exists(
"memory_get_peak_usage")) {
13340 print
' - Real mem peak: ' . memory_get_peak_usage(
true);
13342 if (function_exists(
"zend_loader_file_encoded")) {
13343 print
' - Zend encoded file: ' . (zend_loader_file_encoded() ?
'yes' :
'no');
13345 print
'");' .
"\n";
13348 print
"\n" .
'</script>' .
"\n";
13354 foreach ($tmptagarray as $tmptag) {
13356 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
13358 <!-- Global site tag (gtag.js) - Google Analytics -->
13359 <script nonce="' .
getNonce() .
'" async src="https://www.googletagmanager.com/gtag/js?id=' . trim($tmptag) .
'"></script>
13361 window.dataLayer = window.dataLayer || [];
13362 function gtag(){dataLayer.push(arguments);}
13363 gtag(\'js\', new Date());
13365 gtag(\'config\', \'' . trim($tmptag) .
'\');
13372 // Add Xdebug coverage of code
13373 if (defined('XDEBUGCOVERAGE
')) {
13374 print_r(xdebug_get_code_coverage());
13377 // Output string from hooks
13378 if (!empty($hookmanager->resPrint)) {
13379 print $hookmanager->resPrint;
13382 // Add DebugBar data
13383 if ($user->hasRight('debugbar
', 'read
')) {
13385 if ($debugbar instanceof DebugBar\DebugBar) {
13386 if (isset($debugbar['time
'])) {
13387 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
13388 $debugbar['time
']->stopMeasure('pageaftermaster
');
13390 print '<!-- Output debugbar data -->
' . "\n";
13391 $renderer = $debugbar->getJavascriptRenderer();
13392 print $renderer->render();
13394 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
13396 print "<!-- Start of log output\n";
13397 //print '<div
class=
"hidden">
'."\n";
13398 foreach ($conf->logbuffer as $logline) {
13399 print $logline . "<br>\n";
13401 //print '</div>
'."\n";
13402 print "End of log output -->\n";
13416function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
13418 if (is_null($string)) {
13422 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
13423 // This is a regex string
13424 $newdelimiter = $delimiter;
13426 // This is a simple string
13427 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
13428 $newdelimiter = preg_quote($delimiter, '/
');
13431 if ($a = preg_split('/
' . $newdelimiter . '/
', $string)) {
13433 foreach ($a as $s) { // each part
13435 if ($pos = strpos($s, $kv)) { // key/value delimiter
13436 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
13437 } else { // key delimiter not found
13455function dolExplodeKeepIfQuotes($input)
13457 // Use regexp to capture words and section in quotes
13458 $matches = array();
13459 preg_match_all('/
"([^"]*)
"|\'([^\']*)\'|(\S+)/', $input, $matches);
13461 // Merge result and delete empty values
13463 $result = array_map(
13470 static function ($a, $b, $c) {
13486 return array_values(array_filter(
13494 static function ($val) {
13495 return $val !== '';
13507function dol_set_focus($selector)
13509 print "\n
" . '<!-- Set focus onto a specific field -->' . "\n
";
13510 print '<script nonce="' . getNonce() . '">jQuery(document).ready(function() { console.log("Force focus by
dol_set_focus"); jQuery("' . dol_escape_js($selector) . '").focus(); });</script>' . "\n
";
13521function dol_getmypid()
13523 if (!function_exists('getmypid')) {
13524 return mt_rand(99900000, 99965535);
13526 return getmypid(); // May be a number on 64 bits (depending on OS)
13552function natural_search($fields, $value, $mode = 0, $nofirstand = 0, $sqltoadd = '')
13554 global $db, $langs;
13556 $value = trim($value);
13559 $value = preg_replace('/\*/', '%', $value); // Replace * with %
13562 $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
13565 $value = preg_replace('/\s*\|\s*/', '|', $value);
13567 // Split criteria on ' ' but not if we are inside quotes.
13568 // For mode 3, the split is done later on the , only and not on the ' '.
13569 if ($mode != -3 && $mode != 3) {
13570 $crits = dolExplodeKeepIfQuotes($value);
13572 $crits = array($value);
13576 if (!is_array($fields)) {
13577 $fields = array($fields);
13579 $i1 = 0; // count the nb of "and
" criteria added (all fields / criteria)
13580 foreach ($crits as $crit) { // Loop on each AND criteria
13581 $crit = trim($crit);
13582 $i2 = 0; // count the nb of valid criteria added for this this first criteria
13585 foreach ($fields as $field) {
13587 $tmpcrits = explode('|', $crit);
13588 $i3 = 0; // count the nb of valid criteria added for this current field
13589 foreach ($tmpcrits as $tmpcrit) {
13590 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13593 $tmpcrit = trim($tmpcrit);
13595 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13598 $newcrit = preg_replace('/([!<>=]+)/', '', $tmpcrit);
13601 preg_match('/([!<>=]+)/', $tmpcrit, $reg);
13602 if (!empty($reg[1])) {
13603 $operator = $reg[1];
13605 if ($newcrit != '') {
13606 $numnewcrit = price2num($newcrit);
13607 if (is_numeric($numnewcrit)) {
13608 $newres .= $db->sanitize($field) . ' ' . $operator . ' ' . ((float) $numnewcrit); // should be a numeric
13610 $newres .= '1 = 2'; // force false, we received a corrupted data
13612 $i3++; // a criteria was added to string
13615 $i2++; // a criteria for 1 more field was added to string
13616 } elseif ($mode == 2 || $mode == -2) {
13617 $crit = preg_replace('/[^\-0-9,]/', '', $crit); // ID are always integer
13618 $newres .= ($i2 > 0 ? ' OR ' : '') . $db->sanitize($field) . " " . ($mode == -2 ? 'NOT ' : '');
13619 $newres .= $crit ? "IN (
" . $db->sanitize($db->escape($crit)) . ")
" : "IN (0)
";
13621 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13623 $i2++; // a criteria for 1 more field was added to string
13624 } elseif ($mode == 3 || $mode == -3) {
13625 $tmparray = explode(',', $crit);
13626 if (count($tmparray)) {
13628 $listofcodesnot = '';
13629 foreach ($tmparray as $val) {
13632 if (preg_match('/^!/', $val)) {
13633 $listofcodesnot .= ($listofcodesnot ? ',' : '');
13634 $listofcodesnot .= "'" . $db->escape(preg_replace('/^!=?/
', '', $val)) . "'";
13636 $listofcodes .= ($listofcodes ? ',' : '');
13637 $listofcodes .= "'" . $db->escape($val) . "'";
13641 $newres .= ($i2 > 0 ? ' OR ' : '');
13642 if ($listofcodes && $listofcodesnot) {
13645 if ($listofcodes) {
13646 $newres .= $db->sanitize($field) . " " . ($mode == -3 ? 'NOT IN' : 'IN') . " (
" . $db->sanitize($listofcodes, 1, 0, 1) . ")
";
13648 if ($listofcodes && $listofcodesnot) {
13649 $newres .= ' AND ';
13651 if ($listofcodesnot) {
13652 $newres .= $db->sanitize($field) . " " . ($mode == -3 ? 'IN ' : 'NOT IN') . " (
" . $db->sanitize($listofcodesnot, 1, 0, 1) . ")
";
13654 if ($listofcodes && $listofcodesnot) {
13657 $i2++; // a criteria for 1 more field was added to string
13660 $newres .= ' OR ' . $db->sanitize($field) . ' IS NULL';
13662 } elseif ($mode == 4) {
13663 $tmparray = explode(',', $crit);
13664 if (count($tmparray)) {
13666 foreach ($tmparray as $val) {
13669 $newres .= ($i2 > 0 ? " OR (
" : "(
") . $db->sanitize($field) . " LIKE
'" . $db->escape($val) . ",%'";
13670 $newres .= ' OR ' . $db->sanitize($field) . " =
'" . $db->escape($val) . "'";
13671 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . "'";
13672 $newres .= ' OR ' . $db->sanitize($field) . " LIKE
'%," . $db->escape($val) . ",%'";
13674 $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)
13678 } else { // $mode=0
13679 $tmpcrits = explode('|', $crit);
13680 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
13681 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
13682 if ($tmpcrit !== '0' && empty($tmpcrit)) {
13685 $tmpcrit = trim($tmpcrit);
13687 if ($tmpcrit == '^$' || strpos($crit, '!') === 0) { // If we search empty, we must combined different OR fields with AND
13688 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND ' : '');
13690 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR ' : '');
13693 $isSellist = false;
13694 $table = $label = $key = null;
13696 if (strpos($field, 'ef.') === 0) {
13697 $extrafieldName = substr($field, 3);
13698 $extrafields = new ExtraFields($db);
13699 $extrafields->fetch_name_optionals_label('product');
13701 if (isset($extrafields->attributes['product']['type'][$extrafieldName]) && $extrafields->attributes['product']['type'][$extrafieldName] === 'sellist') {
13703 $paramArray = $extrafields->attributes['product']['param'][$extrafieldName]['options'] ?? [];
13704 $param = array_key_first($paramArray);
13705 list($table, $label, $key) = explode(':', $param);
13709 if (preg_match('/\.(id|rowid)$/', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
13710 $newres .= $db->sanitize($field) . " =
" . (is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0');
13712 $tmpcrit2 = $tmpcrit;
13717 if ($isSellist && $key && $table && $label) {
13718 $newres .= $field . " IN (SELECT t.
" . $db->sanitize((string) $key) . " FROM
" . $db->prefix() . $db->sanitize((string) $table) . " AS t WHERE t.
" . $db->sanitize((string) $label) . " LIKE
'%" . $db->escape($tmpcrit2) . "%')
";
13720 if (preg_match('/^!/', $tmpcrit)) {
13721 $tmps .= $db->sanitize($field) . " NOT LIKE
"; // ! as exclude character
13722 $tmpcrit2 = preg_replace('/^!/', '', $tmpcrit2);
13724 $tmps .= $db->sanitize($field) . " LIKE
";
13728 if (preg_match('/^[\^\$]/
', $tmpcrit)) {
13730 $tmpcrit2 = preg_replace('/^[\^\$]/
', '', $tmpcrit2);
13732 if (preg_match('/[\^\$]$/
', $tmpcrit)) {
13734 $tmpcrit2 = preg_replace('/[\^\$]$/
', '', $tmpcrit2);
13737 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
13738 $tmps = "(" . $tmps;
13741 $newres .= $tmpbefore;
13742 $newres .= $db->escape($tmpcrit2);
13743 $newres .= $tmpafter;
13745 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
13746 $newres .= " OR
" . $db->sanitize($field) . " IS NULL)
";
13754 $i2++; // a criteria for 1 more field was added to string
13759 $newres .= ($newres ? '' : ' OR ').str_replace('__KEYTOSEARCH__', $db->escape($crit), $sqltoadd);
13763 $res = $res . ($res ? ' AND ' : '') . ($i2 > 1 ? '(' : '') . $newres . ($i2 > 1 ? ')' : '');
13767 $res = ($nofirstand ? "" : " AND
") . "(
" . $res . ")
";
13779function showSimpleHTMLTable($outputlangs, $object)
13783 $discountIsAvailable = false;
13784 $orderPositionHasNoPrice = false;
13786 if (!property_exists($object->lines[0], "remise_percent
") ||
13787 !property_exists($object->lines[0], "fk_unit
") ||
13788 !property_exists($object->lines[0], "multicurrency_total_ttc
") ||
13789 !property_exists($object->lines[0], "description") ||
13790 !property_exists($object->lines[0], "qty
")) {
13794 foreach ($object->lines as $order_position) {
13795 if (!property_exists($order_position, "price")) {
13796 $orderPositionHasNoPrice = true;
13800 if (!empty($order_position->remise_percent)) {
13801 $discountIsAvailable = true;
13806 if ($orderPositionHasNoPrice) {
13810 $discountHeader = $discountIsAvailable ? '<th style="width:120px
">'.$outputlangs->trans("Discount
").'</th>' : '';
13812 $table = '<table border="0
" cellpadding="1
" cellspacing="1
">';
13816 <th style="width:50px; text-align:left
">#</th>
13817 <th style="text-align:left
">'.$outputlangs->trans("Description
").'</th>
13818 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Price
").'</th>
13819 <th style="width:100px; text-align:right;
">'.$outputlangs->trans("Quantity
").'</th>
13820 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Unit
").'</th>'.
13822 <th style="width:120px; text-align:right;
">'.$outputlangs->trans("Sum
").'</th>
13827 foreach ($object->lines as $index => $order_position) {
13828 $position = $index + 1;
13829 $price = price($order_position->price, 0, $outputlangs, 0, -1, -1, $conf->currency);
13830 $unit = measuringUnitString($order_position->fk_unit, '', null, 1);
13831 $total = price($order_position->multicurrency_total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency);
13832 $discount = $discountIsAvailable ? '<td style="text-align:center
">'.$order_position->remise_percent.'%</td>' : "";
13836 <td>'.$position.'</td>
13837 <td>'.$order_position->description.'</td>
13838 <td style="text-align:right
">'.$price.'</td>
13839 <td style="text-align:right
">'.$order_position->qty.'</td>
13840 <td style="text-align:right
">'.$unit.'</td>'.
13842 <td style="text-align:right
">'.$total.'</td>
13845 $table .= '</tbody></table>';
13856function showDirectDownloadLink($object)
13861 $url = $object->getLastMainDocLink($object->element);
13863 $out .= img_picto($langs->trans("PublicDownloadLinkDesc
"), 'globe') . ' <span class="opacitymedium
">' . $langs->trans("DirectDownloadLink
") . '</span><br>';
13865 $out .= '<div class="urllink
"><input type="text
" id="directdownloadlink
" class="quatrevingtpercent
" value="' . $url . '"></div>';
13866 $out .= ajax_autoselect("directdownloadlink
", '');
13868 $out .= '<div class="urllink
">' . $langs->trans("FileNotShared
") . '</div>';
13882function getImageFileNameForSize($file, $extName, $extImgTarget = '')
13884 $dirName = dirname($file);
13885 if ($dirName == '.') {
13889 if (!in_array($extName, array('', '_small', '_mini'))) {
13890 return 'Bad parameter extName';
13893 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp|\.avif)$/i', '', $file); // We remove image extension, whatever is its case
13894 $fileName = basename($fileName);
13896 if (empty($extImgTarget)) {
13897 $extImgTarget = (preg_match('/\.jpg$/i', $file) ? '.jpg' : '');
13899 if (empty($extImgTarget)) {
13900 $extImgTarget = (preg_match('/\.jpeg$/i', $file) ? '.jpeg' : '');
13902 if (empty($extImgTarget)) {
13903 $extImgTarget = (preg_match('/\.gif$/i', $file) ? '.gif' : '');
13905 if (empty($extImgTarget)) {
13906 $extImgTarget = (preg_match('/\.png$/i', $file) ? '.png' : '');
13908 if (empty($extImgTarget)) {
13909 $extImgTarget = (preg_match('/\.bmp$/i', $file) ? '.bmp' : '');
13911 if (empty($extImgTarget)) {
13912 $extImgTarget = (preg_match('/\.webp$/i', $file) ? '.webp' : '');
13914 if (empty($extImgTarget)) {
13915 $extImgTarget = (preg_match('/\.avif$/i', $file) ? '.avif' : '');
13918 if (!$extImgTarget) {
13924 $subdir = 'thumbs/';
13927 return ($dirName ? $dirName . '/' : '') . $subdir . $fileName . $extName . $extImgTarget; // New filename for thumb
13940function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '')
13942 global $conf, $langs;
13944 if (empty($conf->use_javascript_ajax)) {
13948 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
13950 if ($alldata == 1) {
13951 if ($isAllowedForPreview) {
13952 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));
13958 // old behavior, return a string
13959 if ($isAllowedForPreview) {
13960 $tmpurl = DOL_URL_ROOT . '/document.php?modulepart=' . urlencode($modulepart) . '&attachment=0&file=' . urlencode($relativepath) . ($param ? '&' . $param : '');
13961 $title = $langs->transnoentities("Preview
");
13962 //$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().
13963 //$tmpurl = 'file='.urlencode("'-alert(document.domain)-'_small.jpg
"); // An example of tmpurl that should be blocked by the dol_escape_uri()
13965 // 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,
13966 // 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.
13967 // Using the dol_escape_uri guarantee that we encode for URI so decode retrieve original expected value.
13968 return 'javascript:' . dol_escape_uri('document_preview(\'' . dol_escape_js($tmpurl) . '\', \'' . dol_escape_js(dol_mimetype($relativepath)) . '\', \'' . dol_escape_js($title) . '\')');
13980function getLabelSpecialCode($idcode)
13984 $arrayspecialines = array(1 => 'Transport', 2 => 'EcoTax', 3 => 'Option');
13985 if ($idcode > 10) {
13986 return 'Module ID ' . $idcode;
13988 if (!empty($arrayspecialines[$idcode])) {
13989 return $langs->trans($arrayspecialines[$idcode]);
14003function ajax_autoselect($htmlname, $addlink = '', $textonlink = 'Link')
14006 $out = '<script nonce="
' . getNonce() . '">
14007 jQuery(document).ready(function () {
14008 jQuery("' . ((strpos($htmlname, '.
') === 0 ? '' : '#
') . $htmlname) . '").click(function() { jQuery(this).select(); } );
14012 if ($textonlink === 'image') {
14013 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . img_picto('', 'globe') . '</a>';
14015 $out .= ' <a href="' . $addlink . '" target="_blank
" rel="noopener noreferrer
">' . $langs->trans("Link") . '</a>';
14028function dolIsAllowedForPreview($file)
14030 // Check .noexe extension in filename
14031 if (preg_match('/\.noexe$/i', $file)) {
14035 // Check mime types
14036 $mime_preview = array('avif', 'bmp', 'jpeg', 'png', 'gif', 'tiff', 'pdf', 'plain', 'css', 'webp', 'webm', 'mp4');
14037 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES')) {
14038 $mime_preview[] = 'svg+xml';
14040 if (getDolGlobalString('MAIN_ALLOW_XML_FILES_AS_PREVIEW')) {
14041 $mime_preview[] = 'xml';
14044 //$mime_preview[]='vnd.oasis.opendocument.presentation';
14045 //$mime_preview[]='archive';
14046 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
14047 if ($num_mime !== false) {
14051 // By default, not allowed for preview
14065function dol_mimetype($file, $default = 'application/octet-stream', $mode = 0)
14068 $imgmime = 'other.png';
14069 $famime = 'file-o';
14072 $tmpfile = preg_replace('/\.noexe$/', '', $file);
14074 // Plain text files
14075 if (preg_match('/\.txt$/i', $tmpfile)) {
14076 $mime = 'text/plain';
14077 $imgmime = 'text.png';
14078 $famime = 'file-alt';
14079 } elseif (preg_match('/\.rtx$/i', $tmpfile)) {
14080 $mime = 'text/richtext';
14081 $imgmime = 'text.png';
14082 $famime = 'file-alt';
14083 } elseif (preg_match('/\.csv$/i', $tmpfile)) {
14084 $mime = 'text/csv';
14085 $imgmime = 'text.png';
14086 $famime = 'file-csv';
14087 } elseif (preg_match('/\.tsv$/i', $tmpfile)) {
14088 $mime = 'text/tab-separated-values';
14089 $imgmime = 'text.png';
14090 $famime = 'file-alt';
14091 } elseif (preg_match('/\.(cf|conf|log)$/i', $tmpfile)) {
14092 $mime = 'text/plain';
14093 $imgmime = 'text.png';
14094 $famime = 'file-alt';
14095 } elseif (preg_match('/\.ini$/i', $tmpfile)) {
14096 $mime = 'text/plain';
14097 $imgmime = 'text.png';
14099 $famime = 'file-alt';
14100 } elseif (preg_match('/\.md$/i', $tmpfile)) {
14101 $mime = 'text/plain';
14102 $imgmime = 'text.png';
14104 $famime = 'file-alt';
14105 } elseif (preg_match('/\.css$/i', $tmpfile)) {
14106 $mime = 'text/css';
14107 $imgmime = 'css.png';
14109 $famime = 'file-alt';
14110 } elseif (preg_match('/\.lang$/i', $tmpfile)) {
14111 $mime = 'text/plain';
14112 $imgmime = 'text.png';
14114 $famime = 'file-alt';
14115 } elseif (preg_match('/\.(crt|cer|key|pub)$/i', $tmpfile)) { // Certificate files
14116 $mime = 'text/plain';
14117 $imgmime = 'text.png';
14118 $famime = 'file-alt';
14119 } elseif (preg_match('/\.(html|htm|shtml)$/i', $tmpfile)) { // XML based (HTML/XML/XAML)
14120 $mime = 'text/html';
14121 $imgmime = 'html.png';
14123 $famime = 'file-alt';
14124 } elseif (preg_match('/\.(xml|xhtml)$/i', $tmpfile)) {
14125 $mime = 'text/xml';
14126 $imgmime = 'other.png';
14128 $famime = 'file-alt';
14129 } elseif (preg_match('/\.xaml$/i', $tmpfile)) {
14130 $mime = 'text/xml';
14131 $imgmime = 'other.png';
14133 $famime = 'file-alt';
14134 } elseif (preg_match('/\.bas$/i', $tmpfile)) { // Languages
14135 $mime = 'text/plain';
14136 $imgmime = 'text.png';
14138 $famime = 'file-code';
14139 } elseif (preg_match('/\.(c)$/i', $tmpfile)) {
14140 $mime = 'text/plain';
14141 $imgmime = 'text.png';
14143 $famime = 'file-code';
14144 } elseif (preg_match('/\.(cpp)$/i', $tmpfile)) {
14145 $mime = 'text/plain';
14146 $imgmime = 'text.png';
14148 $famime = 'file-code';
14149 } elseif (preg_match('/\.cs$/i', $tmpfile)) {
14150 $mime = 'text/plain';
14151 $imgmime = 'text.png';
14153 $famime = 'file-code';
14154 } elseif (preg_match('/\.(h)$/i', $tmpfile)) {
14155 $mime = 'text/plain';
14156 $imgmime = 'text.png';
14158 $famime = 'file-code';
14159 } elseif (preg_match('/\.(java|jsp)$/i', $tmpfile)) {
14160 $mime = 'text/plain';
14161 $imgmime = 'text.png';
14163 $famime = 'file-code';
14164 } elseif (preg_match('/\.php([0-9]{1})?$/i', $tmpfile)) {
14165 $mime = 'text/plain';
14166 $imgmime = 'php.png';
14168 $famime = 'file-code';
14169 } elseif (preg_match('/\.phtml$/i', $tmpfile)) {
14170 $mime = 'text/plain';
14171 $imgmime = 'php.png';
14173 $famime = 'file-code';
14174 } elseif (preg_match('/\.(pl|pm)$/i', $tmpfile)) {
14175 $mime = 'text/plain';
14176 $imgmime = 'pl.png';
14178 $famime = 'file-code';
14179 } elseif (preg_match('/\.sql$/i', $tmpfile)) {
14180 $mime = 'text/plain';
14181 $imgmime = 'text.png';
14183 $famime = 'file-code';
14184 } elseif (preg_match('/\.js$/i', $tmpfile)) {
14185 $mime = 'text/x-javascript';
14186 $imgmime = 'jscript.png';
14188 $famime = 'file-code';
14189 } elseif (preg_match('/\.odp$/i', $tmpfile)) { // Open office
14190 $mime = 'application/vnd.oasis.opendocument.presentation';
14191 $imgmime = 'ooffice.png';
14192 $famime = 'file-powerpoint';
14193 } elseif (preg_match('/\.ods$/i', $tmpfile)) {
14194 $mime = 'application/vnd.oasis.opendocument.spreadsheet';
14195 $imgmime = 'ooffice.png';
14196 $famime = 'file-excel';
14197 } elseif (preg_match('/\.odt$/i', $tmpfile)) {
14198 $mime = 'application/vnd.oasis.opendocument.text';
14199 $imgmime = 'ooffice.png';
14200 $famime = 'file-word';
14201 } elseif (preg_match('/\.mdb$/i', $tmpfile)) { // MS Office
14202 $mime = 'application/msaccess';
14203 $imgmime = 'mdb.png';
14205 } elseif (preg_match('/\.doc[xm]?$/i', $tmpfile)) {
14206 $mime = 'application/msword';
14207 $imgmime = 'doc.png';
14208 $famime = 'file-word';
14209 } elseif (preg_match('/\.dot[xm]?$/i', $tmpfile)) {
14210 $mime = 'application/msword';
14211 $imgmime = 'doc.png';
14212 $famime = 'file-word';
14213 } elseif (preg_match('/\.xlt(x)?$/i', $tmpfile)) {
14214 $mime = 'application/vnd.ms-excel';
14215 $imgmime = 'xls.png';
14216 $famime = 'file-excel';
14217 } elseif (preg_match('/\.xla(m)?$/i', $tmpfile)) {
14218 $mime = 'application/vnd.ms-excel';
14219 $imgmime = 'xls.png';
14220 $famime = 'file-excel';
14221 } elseif (preg_match('/\.xls$/i', $tmpfile)) {
14222 $mime = 'application/vnd.ms-excel';
14223 $imgmime = 'xls.png';
14224 $famime = 'file-excel';
14225 } elseif (preg_match('/\.xls[bmx]$/i', $tmpfile)) {
14226 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
14227 $imgmime = 'xls.png';
14228 $famime = 'file-excel';
14229 } elseif (preg_match('/\.pps[mx]?$/i', $tmpfile)) {
14230 $mime = 'application/vnd.ms-powerpoint';
14231 $imgmime = 'ppt.png';
14232 $famime = 'file-powerpoint';
14233 } elseif (preg_match('/\.ppt[mx]?$/i', $tmpfile)) {
14234 $mime = 'application/x-mspowerpoint';
14235 $imgmime = 'ppt.png';
14236 $famime = 'file-powerpoint';
14237 } elseif (preg_match('/\.pdf$/i', $tmpfile)) { // Other
14238 $mime = 'application/pdf';
14239 $imgmime = 'pdf.png';
14240 $famime = 'file-pdf';
14241 } elseif (preg_match('/\.bat$/i', $tmpfile)) { // Scripts
14242 $mime = 'text/x-bat';
14243 $imgmime = 'script.png';
14245 $famime = 'file-code';
14246 } elseif (preg_match('/\.sh$/i', $tmpfile)) {
14247 $mime = 'text/x-sh';
14248 $imgmime = 'script.png';
14250 $famime = 'file-code';
14251 } elseif (preg_match('/\.ksh$/i', $tmpfile)) {
14252 $mime = 'text/x-ksh';
14253 $imgmime = 'script.png';
14255 $famime = 'file-code';
14256 } elseif (preg_match('/\.bash$/i', $tmpfile)) {
14257 $mime = 'text/x-bash';
14258 $imgmime = 'script.png';
14260 $famime = 'file-code';
14261 } elseif (preg_match('/\.ico$/i', $tmpfile)) { // Images
14262 $mime = 'image/x-icon';
14263 $imgmime = 'image.png';
14264 $famime = 'file-image';
14265 } elseif (preg_match('/\.(jpg|jpeg)$/i', $tmpfile)) {
14266 $mime = 'image/jpeg';
14267 $imgmime = 'image.png';
14268 $famime = 'file-image';
14269 } elseif (preg_match('/\.png$/i', $tmpfile)) {
14270 $mime = 'image/png';
14271 $imgmime = 'image.png';
14272 $famime = 'file-image';
14273 } elseif (preg_match('/\.gif$/i', $tmpfile)) {
14274 $mime = 'image/gif';
14275 $imgmime = 'image.png';
14276 $famime = 'file-image';
14277 } elseif (preg_match('/\.bmp$/i', $tmpfile)) {
14278 $mime = 'image/bmp';
14279 $imgmime = 'image.png';
14280 $famime = 'file-image';
14281 } elseif (preg_match('/\.(tif|tiff)$/i', $tmpfile)) {
14282 $mime = 'image/tiff';
14283 $imgmime = 'image.png';
14284 $famime = 'file-image';
14285 } elseif (preg_match('/\.svg$/i', $tmpfile)) {
14286 $mime = 'image/svg+xml';
14287 $imgmime = 'image.png';
14288 $famime = 'file-image';
14289 } elseif (preg_match('/\.webp$/i', $tmpfile)) {
14290 $mime = 'image/webp';
14291 $imgmime = 'image.png';
14292 $famime = 'file-image';
14293 } elseif (preg_match('/\.vcs$/i', $tmpfile)) { // Calendar
14294 $mime = 'text/calendar';
14295 $imgmime = 'other.png';
14296 $famime = 'file-alt';
14297 } elseif (preg_match('/\.ics$/i', $tmpfile)) {
14298 $mime = 'text/calendar';
14299 $imgmime = 'other.png';
14300 $famime = 'file-alt';
14301 } elseif (preg_match('/\.torrent$/i', $tmpfile)) { // Other
14302 $mime = 'application/x-bittorrent';
14303 $imgmime = 'other.png';
14304 $famime = 'file-o';
14305 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) { // Audio
14307 $imgmime = 'audio.png';
14308 $famime = 'file-audio';
14309 } elseif (preg_match('/\.mp4$/i', $tmpfile)) { // Video
14310 $mime = 'video/mp4';
14311 $imgmime = 'video.png';
14312 $famime = 'file-video';
14313 } elseif (preg_match('/\.ogv$/i', $tmpfile)) {
14314 $mime = 'video/ogg';
14315 $imgmime = 'video.png';
14316 $famime = 'file-video';
14317 } elseif (preg_match('/\.webm$/i', $tmpfile)) {
14318 $mime = 'video/webm';
14319 $imgmime = 'video.png';
14320 $famime = 'file-video';
14321 } elseif (preg_match('/\.avif$/i', $tmpfile)) {
14322 $mime = 'image/avif';
14323 $imgmime = 'image.png';
14324 $famime = 'file-image';
14325 } elseif (preg_match('/\.avi$/i', $tmpfile)) {
14326 $mime = 'video/x-msvideo';
14327 $imgmime = 'video.png';
14328 $famime = 'file-video';
14329 } elseif (preg_match('/\.divx$/i', $tmpfile)) {
14330 $mime = 'video/divx';
14331 $imgmime = 'video.png';
14332 $famime = 'file-video';
14333 } elseif (preg_match('/\.xvid$/i', $tmpfile)) {
14334 $mime = 'video/xvid';
14335 $imgmime = 'video.png';
14336 $famime = 'file-video';
14337 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
14339 $imgmime = 'video.png';
14340 $famime = 'file-video';
14341 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) { // Archive
14342 // application/xxx where zzz is zip, ...
14344 $imgmime = 'archive.png';
14345 $famime = 'file-archive';
14346 } elseif (preg_match('/\.(exe|com)$/i', $tmpfile)) { // Exe
14347 $mime = 'application/octet-stream';
14348 $imgmime = 'other.png';
14349 $famime = 'file-o';
14350 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i', $tmpfile)) { // Lib
14352 $imgmime = 'library.png';
14353 $famime = 'file-o';
14354 } elseif (preg_match('/\.err$/i', $tmpfile)) { // phpcs:ignore
14356 $imgmime = 'error.png';
14357 $famime = 'file-alt';
14360 if ($famime == 'file-o') {
14361 // file-o seems to not work in fontawesome 5
14365 // Return mimetype string
14366 switch ((int) $mode) {
14368 $tmp = explode('/', $mime);
14369 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
14391function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid')
14395 $tablename = preg_replace('/^' . preg_quote(MAIN_DB_PREFIX, '/') . '/', '', $tablename); // Clean name of table for backward compatibility.
14397 $dictvalues = (isset($conf->cache['dictvalues_' . $tablename]) ? $conf->cache['dictvalues_' . $tablename] : null);
14399 if (is_null($dictvalues)) {
14400 $dictvalues = array();
14402 $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
14403 if ($checkentity) {
14404 $sql .= ' AND entity IN (0,' . getEntity($tablename) . ')';
14407 $resql = $db->query($sql);
14409 while ($obj = $db->fetch_object($resql)) {
14410 $dictvalues[$obj->$rowidfield] = $obj; // $obj is stdClass
14413 dol_print_error($db);
14416 $conf->cache['dictvalues_' . $tablename] = $dictvalues;
14419 if (!empty($dictvalues[$id])) {
14421 $tmp = $dictvalues[$id];
14422 return (property_exists($tmp, $field) ? $tmp->$field : '');
14435function colorIsLight($stringcolor)
14437 $stringcolor = str_replace('#', '', $stringcolor);
14439 if (!empty($stringcolor)) {
14441 $tmp = explode(',', $stringcolor);
14442 if (count($tmp) > 1) { // This is a comma RGB ('255','255','255')
14447 $hexr = $stringcolor[0] . $stringcolor[1];
14448 $hexg = $stringcolor[2] . $stringcolor[3];
14449 $hexb = $stringcolor[4] . $stringcolor[5];
14450 $r = hexdec($hexr);
14451 $g = hexdec($hexg);
14452 $b = hexdec($hexb);
14454 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0; // HSL algorithm
14455 if ($bright > 0.6) {
14470function isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
14472 //print 'type_user='.$type_user.' module='.$menuentry['module'].' enabled='.$menuentry['enabled'].' perms='.$menuentry['perms'];
14473 //print 'ok='.in_array($menuentry['module'], $listofmodulesforexternal);
14474 if (empty($menuentry['enabled'])) {
14475 return 0; // Entry disabled by condition
14477 if ($type_user && array_key_exists('module', $menuentry) && $menuentry['module']) {
14478 $tmploops = explode('|', $menuentry['module']);
14480 foreach ($tmploops as $tmploop) {
14481 if (in_array($tmploop, $listofmodulesforexternal)) {
14487 return 0; // Entry is for menus all excluded to external users
14490 if (!$menuentry['perms'] && $type_user) {
14491 return 0; // No permissions and user is external
14493 if (!$menuentry['perms'] && getDolGlobalString('MAIN_MENU_HIDE_UNAUTHORIZED')) {
14494 return 0; // No permissions and option to hide when not allowed, even for internal user, is on
14496 if (!$menuentry['perms']) {
14497 return 2; // No permissions and user is external
14509function roundUpToNextMultiple($n, $x = 5)
14511 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
14512 return (int) $result;
14526function dolGetBadge($label, $html = '', $type = 'primary', $mode = '', $url = '', $params = array())
14528 $csstouse = 'badge';
14529 $csstouse .= (!empty($mode) ? ' badge-' . $mode : '');
14530 $csstouse .= (!empty($type) ? ' badge-' . $type : '');
14531 $csstouse .= (empty($params['css']) ? '' : ' ' . $params['css']);
14534 'class' => $csstouse
14537 if (empty($html)) {
14541 if (!empty($url)) {
14542 $attr['href'] = $url;
14545 if ($mode === 'dot') {
14546 $attr['class'] .= ' classfortooltip';
14547 $attr['title'] = $html;
14548 $attr['aria-label'] = $label;
14553 if (!empty($params['attr']) && is_array($params['attr'])) {
14554 foreach ($params['attr'] as $key => $value) {
14555 if ($key == 'class') {
14556 $attr['class'] .= ' ' . $value;
14557 } elseif ($key == 'classOverride') {
14558 $attr['class'] = $value;
14560 $attr[$key] = $value;
14567 // escape all attribute
14568 $attr = array_map('dolPrintHTMLForAttribute', $attr);
14570 $TCompiledAttr = array();
14571 foreach ($attr as $key => $value) {
14572 $TCompiledAttr[] = $key . '="
' . $value . '"';
14575 $compiledAttributes = !empty($TCompiledAttr) ? implode(' ', $TCompiledAttr) : '';
14577 $tag = !empty($url) ? 'a' : 'span';
14579 return '<' . $tag . ' ' . $compiledAttributes . '>' . $html . '</' . $tag . '>';
14595function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $statusType = 'status0', $displayMode = 0, $url = '', $params = array())
14600 $dolGetBadgeParams = array();
14602 if (!empty($params['badgeParams'])) {
14603 $dolGetBadgeParams = $params['badgeParams'];
14606 // TODO : add a hook
14607 if ($displayMode == 0) {
14608 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
14609 } elseif ($displayMode == 1) {
14610 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14611 } elseif (getDolGlobalString('MAIN_STATUS_USES_IMAGES')) {
14612 // Use status with images (for backward compatibility)
14614 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ? '<span class="hideonsmartphone
">' : '') . (!empty($html) ? $html : $statusLabel) . (in_array($displayMode, array(1, 2, 5)) ? '</span>' : '');
14615 $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>' : '');
14617 // For small screen, we always use the short label instead of long label.
14618 if (!empty($conf->dol_optimize_smallscreen)) {
14619 if ($displayMode == 0) {
14621 } elseif ($displayMode == 4) {
14623 } elseif ($displayMode == 6) {
14628 // For backward compatibility. Image's filename are still in French, so we use this array to convert
14629 $statusImg = array(
14630 'status0' => 'statut0',
14631 'status1' => 'statut1',
14632 'status2' => 'statut2',
14633 'status3' => 'statut3',
14634 'status4' => 'statut4',
14635 'status5' => 'statut5',
14636 'status6' => 'statut6',
14637 'status7' => 'statut7',
14638 'status8' => 'statut8',
14639 'status9' => 'statut9'
14642 if (!empty($statusImg[$statusType])) {
14643 $htmlImg = img_picto($statusLabel, $statusImg[$statusType]);
14645 $htmlImg = img_picto($statusLabel, $statusType);
14648 if ($displayMode === 2) {
14649 $return = $htmlImg . ' ' . $htmlLabelShort;
14650 } elseif ($displayMode === 3) {
14651 $return = $htmlImg;
14652 } elseif ($displayMode === 4) {
14653 $return = $htmlImg . ' ' . $htmlLabel;
14654 } elseif ($displayMode === 5) {
14655 $return = $htmlLabelShort . ' ' . $htmlImg;
14656 } else { // $displayMode >= 6
14657 $return = $htmlLabel . ' ' . $htmlImg;
14659 } elseif (!getDolGlobalString('MAIN_STATUS_USES_IMAGES') && !empty($displayMode)) {
14661 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
14663 $dolGetBadgeParams['attr']['class'] = 'badge-status';
14664 if (empty($dolGetBadgeParams['attr']['title'])) {
14665 $dolGetBadgeParams['attr']['title'] = empty($params['tooltip']) ? $statusLabel : ($params['tooltip'] != 'no' ? $params['tooltip'] : '');
14666 } else { // If a title was forced from $params['badgeParams']['attr']['title'], we set the class to get it as a tooltip.
14667 $dolGetBadgeParams['attr']['class'] .= ' classfortooltip';
14668 // And if we use tooltip, we can output title in HTML @phan-suppress-next-line PhanTypeInvalidDimOffset
14669 $dolGetBadgeParams['attr']['title'] = dol_htmlentitiesbr((string) $dolGetBadgeParams['attr']['title'], 1);
14672 if ($displayMode == 3) {
14673 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), '', $statusType, 'dot', $url, $dolGetBadgeParams);
14674 } elseif ($displayMode === 5) {
14675 $return = dolGetBadge($statusLabelShort, $html, $statusType, '', $url, $dolGetBadgeParams);
14677 $return = dolGetBadge(((empty($conf->dol_optimize_smallscreen) && $displayMode != 2) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType, '', $url, $dolGetBadgeParams);
14720function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = '', $id = '', $userRight = 1, $params = array())
14722 global $hookmanager, $action, $object, $langs;
14724 // If $url is an array, we must build a dropdown button or recursively iterate over each value
14725 if (is_array($url)) {
14726 // Loop on $url array to remove entries of disabled modules
14727 foreach ($url as $key => $subbutton) {
14728 if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
14735 if (array_key_exists('areDropdownButtons', $params) && $params["areDropdownButtons
"] === false) { // @phan-suppress-current-line PhanTypeInvalidDimOffset
14736 foreach ($url as $button) {
14737 if (!empty($button['lang'])) {
14738 $langs->load($button['lang']);
14740 $label = $langs->trans($button['label']);
14741 $text = $button['text'] ?? '';
14742 $actionType = $button['actionType'] ?? '';
14743 $tmpUrl = DOL_URL_ROOT . $button['url'] . (empty($params['backtopage']) ? '' : '&backtopage=' . urlencode($params['backtopage']));
14744 $id = $button['id'] ?? '';
14745 $userRight = $button['perm'] ?? 1;
14746 $button['params'] = $button['params'] ?? []; // @phan-suppress-current-line PhanPluginDuplicateExpressionAssignmentOperation
14748 $out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
14753 if (count($url) > 1 || !empty($params["forceDropdownButtons
"])) {
14754 $out .= '<div class="dropdown
inline-block dropdown-holder
">';
14755 $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>';
14756 $out .= '<div class="dropdown-content
">';
14757 foreach ($url as $subbutton) {
14758 if (!empty($subbutton['lang'])) {
14759 $langs->load($subbutton['lang']);
14762 if (!empty($subbutton['urlraw'])) {
14763 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14765 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14766 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14769 $subbuttonparam = array();
14770 if (!empty($subbutton['attr'])) {
14771 $subbuttonparam['attr'] = $subbutton['attr'];
14773 $subbuttonparam['isDropDown'] = (empty($params['isDropDown']) ? ($subbutton['isDropDown'] ?? false) : $params['isDropDown']);
14775 $out .= dolGetButtonAction($subbutton['text'] ?? '', $langs->trans($subbutton['label']), 'default', $tmpurl, $subbutton['id'] ?? '', $subbutton['perm'], $subbuttonparam);
14780 foreach ($url as $subbutton) { // Should loop on 1 record only
14781 if (!empty($subbutton['lang'])) {
14782 $langs->load($subbutton['lang']);
14785 if (!empty($subbutton['urlraw'])) {
14786 $tmpurl = $subbutton['urlraw']; // Use raw url, no url completion, use only what developer send
14788 $tmpurl = !empty($subbutton['urlroot']) ? $subbutton['urlroot'] : $subbutton['url'];
14789 $tmpurl = dolCompletUrlForDropdownButton($tmpurl, $params, empty($subbutton['urlroot']));
14792 $label = $langs->trans($subbutton['label']);
14793 $text = $subbutton['text'] ?? '';
14794 if (empty($text)) {
14799 $out .= dolGetButtonAction($label, $text, 'default', $tmpurl, '', $subbutton['perm'], $params);
14806 // Here, $url is a simple link
14807 if (!empty($params['isDropdown']) || !empty($params['isDropDown'])) { // Use the dropdown-item style (not for action button)
14808 $class = "dropdown-item
";
14810 $class = 'butAction';
14811 if ($actionType == 'edit') {
14812 $class = 'butAction butActionEdit';
14813 } elseif ($actionType == 'email') {
14814 $class = 'butAction butActionEmail';
14815 } elseif ($actionType == 'clone') {
14816 $class = 'butAction butActionClone';
14817 } elseif ($actionType == 'cancel') {
14818 $class = 'butAction butActionDelete';
14819 } elseif ($actionType == 'danger' || $actionType == 'delete') {
14820 $class = 'butAction butActionDelete';
14821 if (!empty($url) && strpos($url, 'token=') === false) {
14822 $url .= '&token=' . newToken();
14828 'href' => empty($url) ? '' : $url,
14832 if (empty($text)) {
14834 $attr['title'] = ''; // if html not set, using label on title is redundant
14836 $attr['title'] = $label;
14837 $attr['aria-label'] = $label;
14840 if (empty($userRight) || $userRight < 0) {
14841 $attr['class'] = 'butActionRefused';
14842 $attr['href'] = '';
14843 $attr['title'] = (($label && $text && $label != $text) ? $label : '');
14844 $attr['title'] = ($attr['title'] ? $attr['title'] . (empty($userRight) ? '<br>' : '') : '');
14845 $attr['title'] .= ((empty($userRight) && empty($label)) ? $langs->trans('NotEnoughPermissions') : '');
14853 if (!empty($params['attr']) && is_array($params['attr'])) {
14854 foreach ($params['attr'] as $key => $value) {
14855 if ($key == 'class') {
14856 $attr['class'] .= ' ' . $value;
14857 } elseif ($key == 'classOverride') {
14858 $attr['class'] = $value;
14860 $attr[$key] = $value;
14865 // automatic add tooltip when title is detected
14866 if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
14867 $attr['class'] .= ' classfortooltip';
14870 // Js Confirm button
14871 if ($userRight && !empty($params['confirm'])) {
14872 if (!is_array($params['confirm'])) {
14873 $params['confirm'] = array();
14876 if (empty($params['confirm']['url'])) {
14877 $params['confirm']['url'] = $url . (strpos($url, '?') > 0 ? '&' : '?') . 'confirm=yes';
14880 // for js disabled compatibility set $url as call to confirm action and $params['confirm']['url'] to confirmed action
14881 $attr['data-confirm-url'] = $params['confirm']['url'];
14882 $attr['data-confirm-title'] = !empty($params['confirm']['title']) ? $params['confirm']['title'] : $langs->trans('ConfirmBtnCommonTitle', $label);
14883 $attr['data-confirm-content'] = !empty($params['confirm']['content']) ? $params['confirm']['content'] : $langs->trans('ConfirmBtnCommonContent', $label);
14884 $attr['data-confirm-content'] = preg_replace("/\r|\n/
", "", $attr['data-confirm-content']);
14885 $attr['data-confirm-action-btn-label'] = !empty($params['confirm']['action-btn-label']) ? $params['confirm']['action-btn-label'] : $langs->trans('Confirm');
14886 $attr['data-confirm-cancel-btn-label'] = !empty($params['confirm']['cancel-btn-label']) ? $params['confirm']['cancel-btn-label'] : $langs->trans('CloseDialog');
14887 $attr['data-confirm-modal'] = !empty($params['confirm']['modal']) ? $params['confirm']['modal'] : true;
14889 $attr['class'] .= ' butActionConfirm';
14892 if (isset($attr['href']) && empty($attr['href'])) {
14893 unset($attr['href']);
14896 // TODO replace this $TCompiledAttr generation block by commonHtmlAttributeBuilder like line below
14897 // $TCompiledAttr = commonHtmlAttributeBuilder($attr, $params['use_unsecured_unescapedattr'] ?? []);
14898 $TCompiledAttr = array();
14899 foreach ($attr as $key => $value) {
14900 if (!empty($params['use_unsecured_unescapedattr']) && is_array($params['use_unsecured_unescapedattr']) && in_array($key, $params['use_unsecured_unescapedattr'])) {
14901 // Deprecated, forbidden.
14902 $value = dol_htmlentities($value, ENT_QUOTES | ENT_SUBSTITUTE);
14903 } elseif (in_array($key, ['href', 'data-confirm-url'])) {
14904 $value = dolPrintHTMLForAttributeUrl($value);
14906 $value = dolPrintHTMLForAttribute($value);
14909 $TCompiledAttr[] = $key . '="' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
14911 $compiledAttributes = empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr);
14913 $tag = !empty($attr['href']) ? 'a' : 'span';
14915 $parameters = array(
14916 'TCompiledAttr' => $TCompiledAttr, // array
14917 'compiledAttributes' => $compiledAttributes, // string
14922 'actionType' => $actionType,
14925 'userRight' => $userRight,
14926 'params' => $params
14929 $reshook = $hookmanager->executeHooks('dolGetButtonAction', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
14930 if ($reshook < 0) {
14931 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
14934 if (empty($reshook)) {
14935 if (dol_textishtml($text)) { // If content already HTML encoded
14936 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . $text . '</span></' . $tag . '>';
14938 return '<' . $tag . ' ' . $compiledAttributes . '><span class="textbutton
">' . dol_escape_htmltag($text) . '</span></' . $tag . '>';
14941 return $hookmanager->resPrint;
14975function commonHtmlAttributeBuilder($attr, array $unescapedAttr = [])
14977 $TCompiledAttr = array();
14978 if (empty($attr)) {
14982 foreach ($attr as $key => $value) {
14983 // special boolean attributes case
14984 if (in_array($key, getListOfHtmlBooleanAttributes())) {
14986 $TCompiledAttr[$key] = $key;
14991 if (!empty($unescapedAttr) && in_array($key, $unescapedAttr)) {
14993 $value = dol_htmlentities((string) $value, ENT_QUOTES | ENT_SUBSTITUTE);
14994 } elseif ($key == 'href') {
14995 $value = dolPrintHTMLForAttributeUrl((string) $value);
14997 $value = dolPrintHTMLForAttribute((string) $value);
15000 $TCompiledAttr[$key] = $key . '="
' . $value . '"'; // $value has been escaped by the dolPrintHTMLForAttribute... just before
15003 return $TCompiledAttr;
15020function getListOfHtmlBooleanAttributes(): array
15069function dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot = true)
15075 $parsedUrl = parse_url($url);
15076 if ((isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], ['javascript', 'mailto', 'tel'])) || strpos($url, '#') === 0) {
15080 if (!empty($parsedUrl['query'])) {
15081 // Use parse_str() function to parse the string passed via URL
15083 parse_str($parsedUrl['query'], $urlQuery);
15084 if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
15085 $url .= '&backtopage=' . urlencode($params['backtopage']);
15089 if (!isset($parsedUrl['scheme']) && $addDolUrlRoot) {
15090 $url = DOL_URL_ROOT . $url;
15103function dolGetButtonTitleSeparator($moreClass = "
")
15105 return '<span class="button-title-separator
' . $moreClass . '" ></span>';
15114function getFieldErrorIcon($fieldValidationErrorMsg)
15117 if (!empty($fieldValidationErrorMsg)) {
15118 $out .= '<span class="field-error-icon classfortooltip
" title="' . dol_escape_htmltag($fieldValidationErrorMsg, 1) . '" role="alert
" >'; // role alert is used for accessibility
15119 $out .= '<span class="fa fa-exclamation-circle
" aria-hidden="true" ></span>'; // For accessibility icon is separated and aria-hidden
15138function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $url = '', $id = '', $status = 1, $params = array())
15140 global $langs, $user;
15142 // Actually this conf is used in css too for external module compatibility and smooth transition to this function
15143 if (getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
15146 // Fix old picto fa-th-list to use fa-grid-vertical instead
15147 if ($iconClass == 'fa fa-th-list imgforviewmode') {
15148 $iconClass = ' fa fa-grip-horizontal imgforviewmode';
15151 $class = 'btnTitle';
15152 if (in_array($iconClass, array('fa fa-plus-circle', 'fa fa-plus-circle size15x', 'fa fa-comment-dots', 'fa fa-paper-plane'))) {
15153 $class .= ' btnTitlePlus';
15155 $useclassfortooltip = 1;
15157 if (!empty($params['morecss'])) {
15158 $class .= ' ' . $params['morecss'];
15163 'href' => empty($url) ? '' : $url
15166 if (!empty($helpText)) {
15167 $attr['title'] = $helpText;
15168 } elseif ($label) { // empty($attr['title']) &&
15169 $attr['title'] = $label;
15170 $useclassfortooltip = 0;
15173 if ($status == 2) {
15174 $attr['class'] .= ' btnTitleSelected';
15175 } elseif ($status <= 0) {
15176 $attr['class'] .= ' refused';
15178 $attr['href'] = '';
15180 if ($status == -1) { // disable
15181 $attr['title'] = $langs->transnoentitiesnoconv("FeatureDisabled
");
15182 } elseif ($status == 0) { // Not enough permissions
15183 $attr['title'] = $langs->transnoentitiesnoconv("NotEnoughPermissions
");
15187 if (!empty($attr['title']) && $useclassfortooltip) {
15188 $attr['class'] .= ' classfortooltip';
15196 if (!empty($params['attr']) && is_array($params['attr'])) {
15197 foreach ($params['attr'] as $key => $value) {
15198 if ($key == 'class') {
15199 $attr['class'] .= ' ' . $value;
15200 } elseif ($key == 'classOverride') {
15201 $attr['class'] = $value;
15203 $attr[$key] = $value;
15208 if (isset($attr['href']) && empty($attr['href'])) {
15209 unset($attr['href']);
15212 // TODO : add a hook
15214 // Generate attributes with escapement
15215 $TCompiledAttr = array();
15216 foreach ($attr as $key => $value) {
15217 $TCompiledAttr[] = $key . '="' . dol_escape_htmltag($value) . '"'; // Do not use dolPrintHTMLForAttribute() here, we must accept "javascript:
string"
15220 $compiledAttributes = (empty($TCompiledAttr) ? '' : implode(' ', $TCompiledAttr));
15222 $tag = (empty($attr['href']) ? 'span' : 'a');
15224 $button = '<' . $tag . ' ' . $compiledAttributes . '>';
15225 $button .= '<span class="' . $iconClass . ' valignmiddle btnTitle-icon
"></span>';
15226 if (!empty($params['forcenohideoftext'])) {
15227 $button .= '<span class="valignmiddle text-plus-circle btnTitle-label
' . (empty($params['forcenohideoftext
']) ? ' hideonsmartphone
' : '') . '">' . $label . '</span>';
15229 $button .= '</' . $tag . '>';
15244function getElementProperties($elementType)
15246 global $conf, $db, $hookmanager;
15250 //$element_type='facture';
15252 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element = '';
15254 // Parse element/subelement
15255 $module = $elementType;
15256 $element = $elementType;
15257 $subelement = $elementType;
15258 $table_element = $elementType;
15260 // If we ask a resource form external module (instead of default path)
15261 if (preg_match('/^([^@]+)@([^@]+)$/i', $elementType, $regs)) { // 'myobject@mymodule'
15262 $element = $subelement = $regs[1];
15263 $module = $regs[2];
15266 // If we ask a resource for a string with an element and a subelement
15267 // Example 'project_task'
15268 if (preg_match('/^([^_]+)_([^_]+)/i', $element, $regs)) { // 'myobject_mysubobject' with myobject=mymodule
15269 $module = $element = $regs[1];
15270 $subelement = $regs[2];
15273 // Object lines will use parent classpath and module ref
15274 if (substr($elementType, -3) == 'det') {
15275 $module = preg_replace('/det$/', '', $element);
15276 $subelement = preg_replace('/det$/', '', $subelement);
15277 $classpath = $module . '/class';
15278 $classfile = $module;
15279 $classname = preg_replace('/det$/', 'Line', $element);
15280 if (in_array($module, array('expedition', 'propale', 'facture', 'contrat', 'fichinter', 'supplier_order', 'commandefournisseur'))) {
15281 $classname = preg_replace('/det$/', 'Ligne', $element);
15284 // For compatibility and to work with non standard path
15285 if ($elementType == "action
" || $elementType == "actioncomm
") {
15286 $classpath = 'comm/action/class';
15287 $subelement = 'Actioncomm';
15288 $module = 'agenda';
15289 $table_element = 'actioncomm';
15290 } elseif ($elementType == 'cronjob') {
15291 $classpath = 'cron/class';
15293 $table_element = 'cron';
15294 } elseif ($elementType == 'adherent_type') {
15295 $classpath = 'adherents/class';
15296 $classfile = 'adherent_type';
15297 $module = 'adherent';
15298 $subelement = 'adherent_type';
15299 $classname = 'AdherentType';
15300 $table_element = 'adherent_type';
15301 } elseif ($elementType == 'bank_account') {
15302 $classpath = 'compta/bank/class';
15303 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
15304 $classfile = 'account';
15305 $classname = 'Account';
15306 } elseif ($elementType == 'bank_line') {
15307 $classpath = 'compta/bank/class';
15308 $module = 'bank'; // We need $conf->bank->dir_output and not $conf->banque->dir_output
15309 $classfile = 'account';
15310 $classname = 'AccountLine';
15311 } elseif ($elementType == 'category') {
15312 $classpath = 'categories/class';
15313 $module = 'categorie';
15314 $subelement = 'categorie';
15315 $table_element = 'categorie';
15316 } elseif ($elementType == 'contact') {
15317 $classpath = 'contact/class';
15318 $classfile = 'contact';
15319 $module = 'societe';
15320 $subelement = 'contact';
15321 $table_element = 'socpeople';
15322 } elseif ($elementType == 'inventory') {
15323 $module = 'product';
15324 $classpath = 'product/inventory/class';
15325 } elseif ($elementType == 'inventoryline') {
15326 $module = 'product';
15327 $classpath = 'product/inventory/class';
15328 $table_element = 'inventorydet';
15329 $parent_element = 'inventory';
15330 } elseif ($elementType == 'stock' || $elementType == 'entrepot' || $elementType == 'warehouse') {
15332 $classpath = 'product/stock/class';
15333 $classfile = 'entrepot';
15334 $classname = 'Entrepot';
15335 $table_element = 'entrepot';
15336 } elseif ($elementType == 'project') {
15337 $classpath = 'projet/class';
15338 $module = 'projet';
15339 $table_element = 'projet';
15340 } elseif ($elementType == 'project_task') {
15341 $classpath = 'projet/class';
15342 $module = 'projet';
15343 $subelement = 'task';
15344 $table_element = 'projet_task';
15345 } elseif ($elementType == 'mo') {
15346 $classpath = 'mrp/class';
15350 $table_element = 'mrp_mo';
15351 } elseif ($elementType == 'facture' || $elementType == 'invoice') {
15352 $classpath = 'compta/facture/class';
15353 $module = 'facture';
15354 $subelement = 'facture';
15355 $table_element = 'facture';
15356 } elseif ($elementType == 'facturedet') {
15357 $classpath = 'compta/facture/class';
15358 $classfile = 'facture';
15359 $classname = 'FactureLigne';
15360 $module = 'facture';
15361 $table_element = 'facturedet';
15362 $parent_element = 'facture';
15363 } elseif ($elementType == 'facturerec' || $elementType == 'facture_rec') {
15364 $classpath = 'compta/facture/class';
15365 $classfile = 'facture-rec';
15366 $module = 'facture';
15367 $classname = 'FactureRec';
15368 } elseif ($elementType == 'commande' || $elementType == 'order') {
15369 $classpath = 'commande/class';
15370 $module = 'commande';
15371 $subelement = 'commande';
15372 $table_element = 'commande';
15373 } elseif ($elementType == 'commandedet') {
15374 $classpath = 'commande/class';
15375 $classfile = 'commande';
15376 $classname = 'OrderLine';
15377 $module = 'commande';
15378 $table_element = 'commandedet';
15379 $parent_element = 'commande';
15380 } elseif ($elementType == 'propal') {
15381 $classpath = 'comm/propal/class';
15382 $table_element = 'propal';
15383 } elseif ($elementType == 'propaldet') {
15384 $classpath = 'comm/propal/class';
15385 $classfile = 'propal';
15386 $subelement = 'propaleligne';
15387 $module = 'propal';
15388 $table_element = 'propaldet';
15389 $parent_element = 'propal';
15390 } elseif ($elementType == 'shipping' || $elementType == 'shipment') {
15391 $classpath = 'expedition/class';
15392 $classfile = 'expedition';
15393 $classname = 'Expedition';
15394 $module = 'expedition';
15395 $table_element = 'expedition';
15396 } elseif ($elementType == 'expeditiondet' || $elementType == 'shippingdet') {
15397 $classpath = 'expedition/class';
15398 $classfile = 'expedition';
15399 $classname = 'ExpeditionLigne';
15400 $module = 'expedition';
15401 $table_element = 'expeditiondet';
15402 $parent_element = 'expedition';
15403 } elseif ($elementType == 'delivery_note') {
15404 $classpath = 'delivery/class';
15405 $subelement = 'delivery';
15406 $module = 'expedition';
15407 } elseif ($elementType == 'delivery') {
15408 $classpath = 'delivery/class';
15409 $subelement = 'delivery';
15410 $module = 'expedition';
15411 } elseif ($elementType == 'deliverydet') {
15413 } elseif ($elementType == 'supplier_proposal') {
15414 $classpath = 'supplier_proposal/class';
15415 $module = 'supplier_proposal';
15416 $element = 'supplierproposal';
15417 $classfile = 'supplier_proposal';
15418 $subelement = 'supplierproposal';
15419 } elseif ($elementType == 'supplier_proposaldet') {
15420 $classpath = 'supplier_proposal/class';
15421 $module = 'supplier_proposal';
15422 $classfile = 'supplier_proposal';
15423 $classname = 'SupplierProposalLine';
15424 $table_element = 'supplier_proposaldet';
15425 $parent_element = 'supplier_proposal';
15426 } elseif ($elementType == 'contract') {
15427 $classpath = 'contrat/class';
15428 $module = 'contrat';
15429 $subelement = 'contrat';
15430 $table_element = 'contract';
15431 } elseif ($elementType == 'contratdet') {
15432 $classpath = 'contrat/class';
15433 $module = 'contrat';
15434 $table_element = 'contratdet';
15435 $parent_element = 'contrat';
15436 } elseif ($elementType == 'mailing') {
15437 $classpath = 'comm/mailing/class';
15438 $module = 'mailing';
15439 $classfile = 'mailing';
15440 $classname = 'Mailing';
15442 } elseif ($elementType == 'member' || $elementType == 'adherent') {
15443 $classpath = 'adherents/class';
15444 $module = 'adherent';
15445 $subelement = 'adherent';
15446 $table_element = 'adherent';
15447 } elseif ($elementType == 'subscription') {
15448 $classpath = 'adherents/class';
15449 $classfile = 'subscription';
15450 $module = 'adherent';
15451 $subelement = 'subscription';
15452 $classname = 'Subscription';
15453 $table_element = 'subscription';
15454 } elseif ($elementType == 'usergroup') {
15455 $classpath = 'user/class';
15457 } elseif ($elementType == 'mo' || $elementType == 'mrp') {
15458 $classpath = 'mrp/class';
15463 $table_element = 'mrp_mo';
15464 } elseif ($elementType == 'mrp_production') {
15465 $classpath = 'mrp/class';
15467 $classname = 'MoLine';
15470 $table_element = 'mrp_production';
15471 $parent_element = 'mo';
15472 } elseif ($elementType == 'cabinetmed_cons') {
15473 $classpath = 'cabinetmed/class';
15474 $module = 'cabinetmed';
15475 $subelement = 'cabinetmedcons';
15476 $table_element = 'cabinetmedcons';
15477 } elseif ($elementType == 'fichinter') {
15478 $classpath = 'fichinter/class';
15479 $module = 'ficheinter';
15480 $subelement = 'fichinter';
15481 $table_element = 'fichinter';
15482 } elseif ($elementType == 'dolresource' || $elementType == 'resource') {
15483 $classpath = 'resource/class';
15484 $module = 'resource';
15485 $subelement = 'dolresource';
15486 $table_element = 'resource';
15487 } elseif ($elementType == 'opensurvey_sondage') {
15488 $classpath = 'opensurvey/class';
15489 $module = 'opensurvey';
15490 $subelement = 'opensurveysondage';
15491 } elseif ($elementType == 'order_supplier' || $elementType == 'supplier_order' || $elementType == 'commande_fournisseur' || $elementType == 'commandefournisseur') {
15492 $classpath = 'fourn/class';
15493 $module = 'fournisseur';
15494 $classfile = 'fournisseur.commande';
15495 $element = 'order_supplier';
15497 $classname = 'CommandeFournisseur';
15498 $table_element = 'commande_fournisseur';
15499 } elseif ($elementType == 'commande_fournisseurdet') {
15500 $classpath = 'fourn/class';
15501 $module = 'fournisseur';
15502 $classfile = 'fournisseur.commande';
15503 $element = 'commande_fournisseurdet';
15505 $classname = 'CommandeFournisseurLigne';
15506 $table_element = 'commande_fournisseurdet';
15507 $parent_element = 'commande_fournisseur';
15508 } elseif ($elementType == 'invoice_supplier' || $elementType == 'supplier_invoice' || $elementType == 'facture_fourn') {
15509 $classpath = 'fourn/class';
15510 $module = 'fournisseur';
15511 $classfile = 'fournisseur.facture';
15512 $element = 'invoice_supplier';
15514 $classname = 'FactureFournisseur';
15515 $table_element = 'facture_fourn';
15516 } elseif ($elementType == 'facture_fourn_det') {
15517 $classpath = 'fourn/class';
15518 $module = 'fournisseur';
15519 $classfile = 'fournisseur.facture';
15520 $element = 'facture_fourn_det';
15522 $classname = 'SupplierInvoiceLine';
15523 $table_element = 'facture_fourn_det';
15524 $parent_element = 'invoice_supplier';
15525 } elseif ($elementType == "service
") {
15526 $classpath = 'product/class';
15527 $subelement = 'product';
15528 $table_element = 'product';
15529 } elseif ($elementType == 'product_attribute') {
15530 $module = 'variants';
15531 $element = 'product_attribute';
15532 $subelement = 'product_attribute';
15533 $classpath = 'variants/class';
15534 $classfile = 'ProductAttribute';
15535 $classname = 'ProductAttribute';
15536 $table_element = 'product_attribute';
15537 } elseif ($elementType == 'product_attribute_value') {
15538 $module = 'variants';
15539 $element = 'product_attribute_value';
15540 $subelement = 'product_attribute_value';
15541 $classpath = 'variants/class';
15542 $classfile = 'ProductAttributeValue';
15543 $classname = 'ProductAttributeValue';
15544 $table_element = 'product_attribute_value';
15545 $parent_element = 'product_attribute';
15546 } elseif ($elementType == 'salary') {
15547 $classpath = 'salaries/class';
15548 $module = 'salaries';
15549 } elseif ($elementType == 'payment_salary') {
15550 $classpath = 'salaries/class';
15551 $classfile = 'paymentsalary';
15552 $classname = 'PaymentSalary';
15553 $module = 'salaries';
15554 } elseif ($elementType == 'productlot') {
15555 $module = 'productbatch';
15556 $classpath = 'product/stock/class';
15557 $classfile = 'productlot';
15558 $classname = 'Productlot';
15559 $element = 'productlot';
15561 $table_element = 'product_lot';
15562 } elseif ($elementType == 'societeaccount') {
15563 $classpath = 'societe/class';
15564 $classfile = 'societeaccount';
15565 $classname = 'SocieteAccount';
15566 $module = 'societe';
15567 } elseif ($elementType == 'websitepage' || $elementType == 'website_page') {
15568 $classpath = 'website/class';
15569 $classfile = 'websitepage';
15570 $classname = 'Websitepage';
15571 $module = 'website';
15572 $subelement = 'websitepage';
15573 $table_element = 'website_page';
15574 } elseif ($elementType == 'fiscalyear') {
15575 $classpath = 'core/class';
15576 $module = 'accounting';
15577 $subelement = 'fiscalyear';
15578 } elseif ($elementType == 'chargesociales') {
15579 $classpath = 'compta/sociales/class';
15581 $table_element = 'chargesociales';
15582 } elseif ($elementType == 'tva') {
15583 $classpath = 'compta/tva/class';
15586 $table_element = 'tva';
15587 } elseif ($elementType == 'emailsenderprofile') {
15589 $classpath = 'core/class';
15590 $classfile = 'emailsenderprofile';
15591 $classname = 'EmailSenderProfile';
15592 $table_element = 'c_email_senderprofile';
15594 } elseif ($elementType == 'conferenceorboothattendee') {
15595 $classpath = 'eventorganization/class';
15596 $classfile = 'conferenceorboothattendee';
15597 $classname = 'ConferenceOrBoothAttendee';
15598 $module = 'eventorganization';
15599 } elseif ($elementType == 'conferenceorbooth') {
15600 $classpath = 'eventorganization/class';
15601 $classfile = 'conferenceorbooth';
15602 $classname = 'ConferenceOrBooth';
15603 $module = 'eventorganization';
15604 } elseif ($elementType == 'ccountry') {
15606 $classpath = 'core/class';
15607 $classfile = 'ccountry';
15608 $classname = 'Ccountry';
15609 $table_element = 'c_country';
15611 } elseif ($elementType == 'ecmfiles') {
15613 $classpath = 'ecm/class';
15614 $classfile = 'ecmfiles';
15615 $classname = 'Ecmfiles';
15616 $table_element = 'ecmfiles';
15618 } elseif ($elementType == 'knowledgerecord' || $elementType == 'knowledgemanagement') {
15619 $module = 'knowledgemanagement';
15620 $classpath = 'knowledgemanagement/class';
15621 $classfile = 'knowledgerecord';
15622 $classname = 'KnowledgeRecord';
15623 $table_element = 'knowledgemanagement_knowledgerecord';
15625 } elseif ($elementType == 'customer') {
15626 $module = 'societe';
15627 $classpath = 'societe/class';
15628 $classfile = 'client';
15629 $classname = 'Client';
15630 $table_element = 'societe';
15632 } elseif ($elementType == 'fournisseur' || $elementType == 'supplier') {
15633 $module = 'societe';
15634 $classpath = 'fourn/class';
15635 $classfile = 'fournisseur';
15636 $classname = 'Fournisseur';
15637 $table_element = 'societe';
15639 } elseif ($elementType == 'recruitmentcandidature') {
15640 $module = 'recruitment';
15641 $classfile = 'recruitmentcandidature';
15642 $classpath = 'recruitment/class';
15643 $classname = 'RecruitmentCandidature';
15644 $subelement = 'recruitmentcandidature';
15645 $subdir = '/recruitmentcandidature';
15646 } elseif ($elementType == 'recruitmentjobposition') {
15647 $module = 'recruitment';
15648 $classfile = 'recruitmentjobposition';
15649 $classpath = 'recruitment/class';
15650 $classname = 'RecruitmentJobPosition';
15651 $subelement = 'recruitmentjobposition';
15652 $subdir = '/recruitmentjobposition';
15656 if (empty($classfile)) {
15657 $classfile = strtolower($subelement);
15659 if (empty($classname)) {
15660 $classname = ucfirst($subelement);
15662 if (empty($classpath)) {
15663 $classpath = $module . '/class';
15666 //print 'getElementProperties subdir='.$subdir;
15669 if ($module && isset($conf->$module)) { // The generic case
15670 if (!empty($conf->$module->multidir_output[$conf->entity])) {
15671 $dir_output = $conf->$module->multidir_output[$conf->entity];
15672 } elseif (!empty($conf->$module->output[$conf->entity])) {
15673 $dir_output = $conf->$module->output[$conf->entity];
15674 } elseif (!empty($conf->$module->dir_output)) {
15675 $dir_output = $conf->$module->dir_output;
15677 if (!empty($conf->$module->multidir_temp[$conf->entity])) {
15678 $dir_temp = $conf->$module->multidir_temp[$conf->entity];
15679 } elseif (!empty($conf->$module->temp[$conf->entity])) {
15680 $dir_temp = $conf->$module->temp[$conf->entity];
15681 } elseif (!empty($conf->$module->dir_temp)) {
15682 $dir_temp = $conf->$module->dir_temp;
15686 // Overwrite value for special cases
15687 if ($element == 'order_supplier' && isModEnabled('fournisseur')) {
15688 $dir_output = $conf->fournisseur->commande->dir_output;
15689 $dir_temp = $conf->fournisseur->commande->dir_temp;
15690 } elseif ($element == 'invoice_supplier' && isModEnabled('fournisseur')) {
15691 $dir_output = $conf->fournisseur->facture->dir_output;
15692 $dir_temp = $conf->fournisseur->facture->dir_temp;
15694 $dir_output .= $subdir;
15695 $dir_temp .= $subdir;
15697 $elementProperties = array(
15698 'module' => $module,
15699 'element' => $element,
15700 'table_element' => $table_element,
15701 'subelement' => $subelement,
15702 'classpath' => $classpath,
15703 'classfile' => $classfile,
15704 'classname' => $classname,
15705 'dir_output' => $dir_output,
15706 'dir_temp' => $dir_temp,
15707 'parent_element' => $parent_element,
15712 if (!is_object($hookmanager)) {
15713 include_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
15714 $hookmanager = new HookManager($db);
15716 $hookmanager->initHooks(array('elementproperties'));
15720 $parameters = array(
15721 'elementType' => $elementType,
15722 'elementProperties' => $elementProperties
15725 $reshook = $hookmanager->executeHooks('getElementProperties', $parameters);
15728 $elementProperties = $hookmanager->resArray;
15729 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) { // resArray is always an array but for security against misconfigured external modules
15730 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
15733 // context of elementproperties doesn't need to exist out of this function so delete it to avoid elementproperties context is equal to all
15734 if (($key = array_search('elementproperties', $hookmanager->contextarray)) !== false) {
15735 unset($hookmanager->contextarray[$key]);
15738 return $elementProperties;
15754function fetchObjectByElement($element_id, $element_type, $element_ref = '', $useCache = 0, $maxCacheByType = 10)
15760 $element_prop = getElementProperties($element_type);
15761 //var_dump($element_prop); exit;
15763 if ($element_prop['module'] == 'product' || $element_prop['module'] == 'service') {
15764 // For example, for an extrafield 'product' (shared for both product and service) that is a link to an object,
15765 // this is called with $element_type = 'product' when we need element properties of a service, we must return a product. If we create the
15766 // extrafield for a service, it is not supported and not found when editing the product/service card. So we must keep 'product' for extrafields
15767 // of service and we will return properties of a product.
15768 $ismodenabled = (isModEnabled('product') || isModEnabled('service'));
15769 } elseif ($element_prop['module'] == 'societeaccount') {
15770 $ismodenabled = isModEnabled('website') || isModEnabled('webportal');
15772 $ismodenabled = isModEnabled($element_prop['module']);
15774 //var_dump('element_type='.$element_type);
15775 //var_dump($element_prop);
15776 //var_dump($element_prop['module'].' '.$ismodenabled);
15777 if (is_array($element_prop) && (empty($element_prop['module']) || $ismodenabled)) {
15778 if ($useCache === 1 && $element_id > 0
15779 && !empty($conf->cache['fetchObjectByElement'][$element_type])
15780 && !empty($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15781 && is_object($conf->cache['fetchObjectByElement'][$element_type][$element_id])
15783 return $conf->cache['fetchObjectByElement'][$element_type][$element_id];
15786 dol_include_once('/' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15788 if (class_exists($element_prop['classname'])) {
15789 $className = $element_prop['classname'];
15790 $objecttmp = new $className($db);
15791 '@phan-var-force CommonObject $objecttmp';
15794 if ($element_id > 0 || !empty($element_ref)) {
15795 $ret = $objecttmp->fetch($element_id, $element_ref);
15797 if (empty($objecttmp->module)) {
15798 $objecttmp->module = $element_prop['module'];
15801 if ($useCache > 0) {
15802 if (!isset($conf->cache['fetchObjectByElement'][$element_type])) {
15803 $conf->cache['fetchObjectByElement'][$element_type] = [];
15806 // Manage cache limit
15807 if (! empty($conf->cache['fetchObjectByElement'][$element_type]) && is_array($conf->cache['fetchObjectByElement'][$element_type]) && count($conf->cache['fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
15808 array_shift($conf->cache['fetchObjectByElement'][$element_type]);
15811 $conf->cache['fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
15817 return $objecttmp; // returned an object without fetch
15820 dol_syslog($element_prop['classname'] . ' doesn\'t exists in /' . $element_prop['classpath'] . '/' . $element_prop['classfile'] . '.class.php');
15833function getExecutableContent()
15835 $arrayofregexextension = array(
15862 return $arrayofregexextension;
15871function isAFileWithExecutableContent($filename)
15873 $arrayofregexextension = getExecutableContent();
15875 foreach ($arrayofregexextension as $fileextension) {
15876 if (preg_match('/\.' . preg_quote($fileextension, '/') . '$/i', $filename)) {
15893 return empty($_SESSION['newtoken']) ? '' : $_SESSION['newtoken'];
15903function currentToken()
15905 return isset($_SESSION['token']) ? $_SESSION['token'] : '';
15917 if (empty($conf->cache['nonce'])) {
15918 include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php';
15919 $conf->cache['nonce'] = dolGetRandomBytes(8);
15922 return $conf->cache['nonce'];
15939function startSimpleTable($header, $link = "
", $arguments = "", $emptyColumns = 0, $number = -1, $pictofulllist = '')
15943 print '<div class="div-
table-responsive-no-min
">';
15944 print '<table class="noborder centpercent
">';
15945 print '<tr class="liste_titre
">';
15947 print ($emptyColumns < 1) ? '<th>' : '<th colspan="' . ($emptyColumns + 1) . '">';
15949 print '<span class="valignmiddle
">' . $langs->trans($header) . '</span>';
15951 if (!empty($link)) {
15952 if (!empty($arguments)) {
15953 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '?
' . $arguments . '">';
15955 print '<a href="' . DOL_URL_ROOT . '/
' . $link . '">';
15959 if ($number > -1) {
15960 print '<span class="badge marginleftonlyshort
">' . $number . '</span>';
15961 } elseif (!empty($link)) {
15962 print '<span class="badge marginleftonlyshort
">...</span>';
15965 if (!empty($link)) {
15971 if ($number < 0 && !empty($link)) {
15972 print '<th class="right
">';
15987function finishSimpleTable($addLineBreak = false)
15992 if ($addLineBreak) {
16008function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord = "None
", $extraRightColumn = false)
16013 print '<tr class="oddeven
">';
16014 print '<td colspan="' . $tableColumnCount . '"><span class="opacitymedium
">' . $langs->trans($noneWord) . '</span></td>';
16019 if ($nbofloop === 0) {
16020 // don't show a summary line
16024 /* Case already handled above, commented to satisfy phpstan.
16026 $colspan = $tableColumnCount;
16029 if ($num > $nbofloop) {
16030 $colspan = $tableColumnCount;
16032 $colspan = $tableColumnCount - 1;
16035 if ($extraRightColumn) {
16039 print '<tr class="liste_total
">';
16041 if ($nbofloop > 0 && $num > $nbofloop) {
16042 print '<td colspan="' . $colspan . '" class="right
">' . $langs->trans("XMoreLines
", ($num - $nbofloop)) . '</td>';
16044 print '<td colspan="' . $colspan . '" class="right
"> ' . $langs->trans("Total
") . '</td>';
16045 print '<td class="right centpercent
">' . price($total) . '</td>';
16048 if ($extraRightColumn) {
16063function readfileLowMemory($fullpath_original_file_osencoded, $method = -1)
16065 if ($method == -1) {
16067 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_FREAD')) {
16070 if (getDolGlobalString('MAIN_FORCE_READFILE_WITH_STREAM_COPY')) {
16075 // Be sure we don't have output buffering enabled to have readfile working correctly
16076 $level = ob_get_level();
16078 while (ob_get_level() > $level) {
16083 if ($method == 0) {
16084 readfile($fullpath_original_file_osencoded);
16085 } elseif ($method == 1) {
16087 $handle = fopen($fullpath_original_file_osencoded, "rb
");
16088 while (!feof($handle)) {
16089 print fread($handle, 8192);
16092 } elseif ($method == 2) {
16094 $handle1 = fopen($fullpath_original_file_osencoded, "rb
");
16095 $handle2 = fopen("php:
16096 stream_copy_to_stream($handle1, $handle2);
16117 $result =
'<span class="clipboardCP' . ($showonlyonhover ?
' clipboardCPShowOnHover valignmiddle' :
'') .
'">';
16118 if ($texttoshow ===
'none') {
16119 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16120 $result .=
'<span class="clipboardCPValueToPrint"></span>';
16121 } elseif ($texttoshow) {
16122 $result .=
'<' . $tag .
' class="clipboardCPValue hidewithsize">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16123 $result .=
'<span class="clipboardCPValueToPrint">' .
dol_escape_htmltag($texttoshow, 1, 1) .
'</span>';
16125 $result .=
'<' . $tag .
' class="clipboardCPValue">' .
dol_escape_htmltag($valuetocopy, 1, 1) .
'</' . $tag .
'>';
16127 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="' .
dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")) .
'"></span>';
16128 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
16129 $result .=
'<span class="clipboardCPText"></span>';
16130 $result .=
'</span>';
16145 $result = json_decode($stringtodecode, $assoc);
16146 if ($result ===
null) {
16147 $result = unserialize($stringtodecode, [
'allowed_classes' =>
false]);
16175 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
16178 if (!preg_match(
'/^\(.*\)$/', $filter)) {
16179 $filter =
'(' . $filter .
')';
16182 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
16183 $firstandlastparenthesis = 0;
16185 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
16189 return 'Filter syntax error - ' . $errorstr;
16194 $t = preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeDummyCriteriaCallback', $filter);
16195 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
16198 if (preg_match(
'/[^\(\)]/', $t)) {
16199 $tmperrorstr =
'Bad syntax of the search string';
16200 $errorstr =
'Bad syntax of the search string: ' . $filter;
16204 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - " . $errorstr, LOG_WARNING);
16205 return 'Filter error - ' . $tmperrorstr;
16209 global $globalforbiddenfields;
16210 $globalforbiddenfields = $forbiddenfields;
16212 $ret = ($noand ?
"" :
" AND ") . ($nopar ?
"" :
'(');
16213 $ret .= preg_replace_callback(
'/' . $regexstring .
'/i',
'dolForgeSQLCriteriaCallback', $filter);
16214 $ret .= ($nopar ?
"" :
')');
16216 if (is_object(
$db)) {
16217 $ret = str_replace(
'__NOW__',
"'" .
$db->idate(
dol_now()) .
"'", $ret);
16219 if (is_object($user)) {
16220 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
16235 $arrayofandtags = array();
16239 $parenthesislevel = 0;
16244 if ($parenthesislevel >= 1) {
16245 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
16250 $countparenthesis = 0;
16251 while ($i < $nbofchars) {
16254 if ($char ==
'(') {
16255 $countparenthesis++;
16256 } elseif ($char ==
')') {
16257 $countparenthesis--;
16260 if ($countparenthesis == 0) {
16261 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
16262 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
16263 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
16266 if (!preg_match(
'/^\(.*\)$/', $s)) {
16267 $s =
'(' . $s .
')';
16269 $arrayofandtags[] = $s;
16282 if (!preg_match(
'/^\(.*\)$/', $s)) {
16283 $s =
'(' . $s .
')';
16285 $arrayofandtags[] = $s;
16288 return $arrayofandtags;
16300function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
16304 $tmp = $sqlfilters;
16308 $parenthesislevel = 0;
16316 if ($char ==
'(') {
16317 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
16319 $parenthesislevel++;
16322 } elseif ($char ==
')') {
16323 $nbcharremaining = ($nb - $i - 1);
16324 if ($nbcharremaining >= $counter) {
16325 $parenthesislevel = min($parenthesislevel, $counter - 1);
16327 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
16328 $parenthesislevel = $counter;
16333 if ($counter < 0) {
16334 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
16335 $parenthesislevel = 0;
16343 if ($counter > 0) {
16344 $error =
"Wrong balance of parenthesis in sqlfilters=" . $sqlfilters;
16345 $parenthesislevel = 0;
16363 if (empty($matches[1])) {
16366 $tmp = explode(
':', $matches[1]);
16367 if (count($tmp) < 3) {
16386 global $globalforbiddenfields;
16389 if (empty($matches[1])) {
16392 $tmp = explode(
':', $matches[1], 3);
16393 if (count($tmp) < 3) {
16399 $newforbiddenfields = $globalforbiddenfields;
16400 if (!is_array($newforbiddenfields)) {
16401 $newforbiddenfields = array();
16404 $newforbiddenfields[] =
'pass';
16405 $newforbiddenfields[] =
'pass_crypted';
16406 $newforbiddenfields[] =
'api_key';
16408 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
16411 if (!empty($newforbiddenfields)) {
16412 $operandwithoutprefix = preg_replace(
'/^[a-z0-9_]+\./i',
'', $operand);
16413 if (in_array(strtolower($operandwithoutprefix), $newforbiddenfields)) {
16418 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
16421 'NOTLIKE' =>
'NOT LIKE',
16422 'ISNOT' =>
'IS NOT',
16423 'NOTIN' =>
'NOT IN',
16427 if (array_key_exists($operator, $realOperator)) {
16428 $operator = $realOperator[$operator];
16431 $tmpescaped = $tmp[2];
16437 if ($operator ==
'IN' || $operator ==
'NOT IN') {
16438 global $dolibarr_allow_unsecured_select_in_extrafields_filter;
16441 $tmpescaped2 =
'(';
16443 $tmpelemarray = explode(
',', $tmpescaped);
16444 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
16446 $tmpelem = trim($tmpelem);
16447 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
16448 $tmpelemarray[$tmpkey] =
"'" .
$db->escape(
$db->sanitize($reg[1], 2, 1, 1, 1)) .
"'";
16449 $tmpelemarray[$tmpkey] =
"'".$db->escape(
$db->sanitize($reg[1], 2, 1, 1, 1)).
"'";
16450 } elseif (preg_match(
'/^[0-9]+$/', (
string) $tmpelem)) {
16451 $tmpelemarray[$tmpkey] = (int) $tmpelem;
16452 } elseif (is_numeric((
string) $tmpelem)) {
16453 $tmpelemarray[$tmpkey] = (float) $tmpelem;
16454 } elseif (!empty($dolibarr_allow_unsecured_select_in_extrafields_filter)) {
16455 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_<>=!\s]/i',
'', $tmpelem);
16457 $tmpelemarray[$tmpkey] = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpelem);
16460 $tmpescaped2 .= implode(
',', $tmpelemarray);
16461 $tmpescaped2 .=
')';
16463 $tmpescaped = $tmpescaped2;
16464 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
16465 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
16466 $tmpescaped = $regbis[1];
16469 $tmpescaped =
"'" .
$db->escape($tmpescaped) .
"'";
16470 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
16473 $tmpescaped =
"'" .
$db->escape($regbis[1]) .
"'";
16475 if (strtoupper($tmpescaped) ==
'NULL') {
16476 $tmpescaped =
'NULL';
16477 } elseif (preg_match(
'/^[0-9]+$/', (
string) $tmpescaped)) {
16478 $tmpescaped = (int) $tmpescaped;
16479 } elseif (is_numeric((
string) $tmpescaped)) {
16480 $tmpescaped = (float) $tmpescaped;
16482 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
16486 return '(' .
$db->escape($operand) .
' ' . strtoupper($operator) .
' ' . $tmpescaped .
')';
16501 dol_syslog(
'getTimelineIcon::begin', LOG_DEBUG);
16504 $out =
'<!-- timeline icon -->' .
"\n";
16505 $iconClass =
'fa fa-comments';
16510 if ($histo[$key][
'percent'] == -1) {
16511 $colorClass =
'timeline-icon-not-applicble';
16512 $pictoTitle = $langs->trans(
'StatusNotApplicable');
16513 } elseif ($histo[$key][
'percent'] == 0) {
16514 $colorClass =
'timeline-icon-todo';
16515 $pictoTitle = $langs->trans(
'StatusActionToDo') .
' (0%)';
16516 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
16517 $colorClass =
'timeline-icon-in-progress';
16518 $pictoTitle = $langs->trans(
'StatusActionInProcess') .
' (' . $histo[$key][
'percent'] .
'%)';
16519 } elseif ($histo[$key][
'percent'] >= 100) {
16520 $colorClass =
'timeline-icon-done';
16521 $pictoTitle = $langs->trans(
'StatusActionDone') .
' (100%)';
16524 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
16525 $iconClass =
'fa fa-ticket';
16526 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
16527 $iconClass =
'fa fa-pencilxxx';
16528 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
16529 $iconClass =
'fa fa-comments';
16530 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
16531 $iconClass =
'fa fa-mask';
16533 if ($actionstatic->type_picto) {
16534 $img_picto =
img_picto(
'', $actionstatic->type_picto);
16536 if ($actionstatic->type_code ==
'AC_RDV') {
16537 $iconClass =
'fa fa-handshake';
16538 } elseif ($actionstatic->type_code ==
'AC_TEL') {
16539 $iconClass =
'fa fa-phone';
16540 } elseif ($actionstatic->type_code ==
'AC_FAX') {
16541 $iconClass =
'fa fa-fax';
16542 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
16543 $iconClass =
'fa fa-envelope';
16544 } elseif ($actionstatic->type_code ==
'AC_INT') {
16545 $iconClass =
'fa fa-shipping-fast';
16546 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
16547 $iconClass =
'fa fa-robot';
16548 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
16549 $iconClass =
'fa fa-robot';
16554 $out .=
'<i class="' . $iconClass .
' ' . $colorClass .
'" title="' . $pictoTitle .
'">' . $img_picto .
'</i>' .
"\n";
16568 $documents = array();
16570 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename, ecm.agenda_id';
16571 $sql .=
' FROM ' . MAIN_DB_PREFIX .
'ecm_files ecm';
16572 $sql .=
" WHERE ecm.filepath = 'agenda/" . ((int)
$object->id) .
"'";
16574 $sql .=
' OR ecm.agenda_id = ' . (int)
$object->id;
16575 $sql .=
' ORDER BY ecm.position ASC';
16577 $resql =
$db->query($sql);
16579 if (
$db->num_rows($resql)) {
16580 while ($obj =
$db->fetch_object($resql)) {
16581 $documents[$obj->id] = $obj;
16607function show_actions_messaging(
$conf, $langs,
$db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
16609 dol_syslog(
'show_actions_messaging::begin', LOG_DEBUG);
16610 global $user,
$conf;
16613 global $param, $massactionbutton;
16615 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16618 if (!is_object($filterobj) && !is_object($objcon)) {
16623 '@phan-var-force array<int,array{type:string,tododone:string,id:string,datestart:int|string,dateend:int|string,fulldayevent:int,note:string,message:string,percent:string,userid:string,login:string,userfirstname:string,userlastname:string,userphoto:string,msg_from?:string,contact_id?:string,socpeopleassigned?:int[],lastname?:string,firstname?:string,fk_element?:int,elementtype?:string,acode:string,alabel?:string,libelle?:string,apicto?:string}> $histo';
16628 $sortfield_list = explode(
',', $sortfield);
16629 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
16630 $sanitized_sortfield_new_list = array();
16631 foreach ($sortfield_list as $sortfield_value) {
16632 $sanitized_sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
16634 $sanitized_sortfield_new = implode(
',', $sanitized_sortfield_new_list);
16641 if (is_object($objcon) && $objcon->id > 0) {
16642 $sql =
"SELECT DISTINCT a.id, a.label as label,";
16644 $sql =
"SELECT a.id, a.label as label,";
16646 $sql .=
" a.datep as dp,";
16647 $sql .=
" a.note as message,";
16648 $sql .=
" a.datep2 as dp2,";
16649 $sql .=
" a.percent as percent, 'action' as type,";
16650 $sql .=
" a.fk_element, a.elementtype,";
16651 $sql .=
" a.fk_contact, a.fulldayevent,";
16652 $sql .=
" a.email_from as msg_from,";
16653 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
16654 $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";
16655 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16656 $sql .=
", sp.lastname, sp.firstname";
16657 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16658 $sql .=
", m.lastname, m.firstname";
16659 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur',
'Propal',
'Expedition'))) {
16662 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16666 $sql .=
" FROM " . MAIN_DB_PREFIX .
"actioncomm as a";
16667 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"user as u on u.rowid = a.fk_user_action";
16668 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"c_actioncomm as c ON a.fk_action = c.id";
16670 $force_filter_contact = $filterobj instanceof
User;
16672 if (is_object($objcon) && $objcon->id > 0) {
16673 $force_filter_contact =
true;
16674 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
16675 $sql .=
" AND r.element_type = '" .
$db->escape($objcon->table_element) .
"' AND r.fk_element = " . ((int) $objcon->id);
16678 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
16679 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"socpeople as sp ON a.fk_contact = sp.rowid";
16680 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
16681 $sql .=
" INNER JOIN " . MAIN_DB_PREFIX .
"element_resources as er";
16682 $sql .=
" ON er.resource_type = 'dolresource'";
16683 $sql .=
" AND er.element_id = a.id";
16684 $sql .=
" AND er.resource_id = " . ((int) $filterobj->id);
16685 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16686 $sql .=
", " . MAIN_DB_PREFIX .
"adherent as m";
16687 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16688 $sql .=
", " . MAIN_DB_PREFIX .
"commande_fournisseur as o";
16689 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16690 $sql .=
", " . MAIN_DB_PREFIX .
"product as o";
16691 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16692 $sql .=
", " . MAIN_DB_PREFIX .
"ticket as o";
16693 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16694 $sql .=
", " . MAIN_DB_PREFIX .
"bom_bom as o";
16695 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16696 $sql .=
", " . MAIN_DB_PREFIX .
"contrat as o";
16697 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16698 $sql .=
", " . MAIN_DB_PREFIX .
"facture as o";
16699 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16700 $sql .=
", " . MAIN_DB_PREFIX .
"facture_fourn as o";
16701 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16702 $sql .=
", " . MAIN_DB_PREFIX .
"commande as o";
16703 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16704 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as o";
16705 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16706 $sql .=
", " . MAIN_DB_PREFIX .
"propal as o";
16708 if (is_object($filterobj) && !empty($filterobj->table_element) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16709 $sql .=
", " . MAIN_DB_PREFIX . $filterobj->table_element .
" as o";
16712 $sql .=
" WHERE a.entity IN (" .
getEntity(
'agenda') .
")";
16713 if (!$force_filter_contact) {
16714 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
16715 $sql .=
" AND a.fk_soc = " . ((int) $filterobj->id);
16716 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
16717 $sql .=
" AND a.fk_project = o.rowid AND a.fk_project = " . ((int) $filterobj->id);
16718 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16719 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
16720 if ($filterobj->id) {
16721 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16723 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
16724 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
16725 if ($filterobj->id) {
16726 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16728 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Expedition') {
16729 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'shipping'";
16730 if ($filterobj->id) {
16731 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16733 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Propal') {
16734 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'propal'";
16735 if ($filterobj->id) {
16736 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16738 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16739 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
16740 if ($filterobj->id) {
16741 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16743 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16744 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
16745 if ($filterobj->id) {
16746 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16748 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16749 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
16750 if ($filterobj->id) {
16751 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16753 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
16754 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
16755 if ($filterobj->id) {
16756 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16758 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
16759 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
16760 if ($filterobj->id) {
16761 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16763 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
16764 $sql .=
" AND a.fk_contact = sp.rowid";
16765 if ($filterobj->id) {
16766 $sql .=
" AND a.fk_contact = " . ((int) $filterobj->id);
16768 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
16769 $sql .=
" AND a.fk_element = o.rowid";
16770 if ($filterobj->id) {
16771 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice'";
16773 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
16774 $sql .=
" AND a.fk_element = o.rowid";
16775 if ($filterobj->id) {
16776 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id) .
" AND a.elementtype = 'invoice_supplier'";
16779 if (is_object($filterobj) && !empty($filterobj->element) && !empty($filterobj->id) && array_key_exists(
'ref', $filterobj->fields)) {
16780 $sql .=
" AND a.fk_element = o.rowid";
16781 $sql .=
" AND a.elementtype = '" .
$db->escape($filterobj->element) .
"'";
16782 if ($filterobj->id) {
16783 $sql .=
" AND a.fk_element = " . ((int) $filterobj->id);
16788 $sql .=
" AND u.rowid = " . ((int) $filterobj->id);
16792 if (!empty($actioncode) && $actioncode !=
'-1') {
16794 if ($actioncode ==
'AC_NON_AUTO') {
16795 $sql .=
" AND c.type != 'systemauto'";
16796 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16797 $sql .=
" AND c.type = 'systemauto'";
16799 if ($actioncode ==
'AC_OTH') {
16800 $sql .=
" AND c.type != 'systemauto'";
16801 } elseif ($actioncode ==
'AC_OTH_AUTO') {
16802 $sql .=
" AND c.type = 'systemauto'";
16806 if ($actioncode ==
'AC_NON_AUTO') {
16807 $sql .=
" AND c.type != 'systemauto'";
16808 } elseif ($actioncode ==
'AC_ALL_AUTO') {
16809 $sql .=
" AND c.type = 'systemauto'";
16811 $sql .=
" AND c.code = '" .
$db->escape($actioncode) .
"'";
16815 if ($donetodo ==
'todo') {
16816 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '" .
$db->idate($now) .
"'))";
16817 } elseif ($donetodo ==
'done') {
16818 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '" .
$db->idate($now) .
"'))";
16820 if (is_array($filters) && $filters[
'search_agenda_label']) {
16821 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
16828 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')
16830 $langs->load(
"mails");
16832 $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";
16833 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
16834 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
16835 $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";
16836 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
16837 $sql2 .=
", '' as lastname, '' as firstname";
16838 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
16839 $sql2 .=
", '' as lastname, '' as firstname";
16840 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
16841 $sql2 .=
", '' as ref";
16842 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
16843 $sql2 .=
", '' as ref";
16844 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
16845 $sql2 .=
", '' as ref";
16847 $sql2 .=
" FROM " . MAIN_DB_PREFIX .
"mailing as m, " . MAIN_DB_PREFIX .
"mailing_cibles as mc, " . MAIN_DB_PREFIX .
"user as u";
16848 $sql2 .=
" WHERE mc.email = '" .
$db->escape($objcon->email) .
"'";
16849 $sql2 .=
" AND mc.statut = 1";
16850 $sql2 .=
" AND u.rowid = m.fk_user_valid";
16851 $sql2 .=
" AND mc.fk_mailing=m.rowid";
16855 $MAXWITHOUTPAGINATION =
getDolGlobalInt(
'AGENDA_MAX_EVENTS_ON_PAGE_WITHOUT_PAGINATION', 100);
16857 if ($sql || $sql2) {
16858 if (!empty($sql) && !empty($sql2)) {
16859 $sql = $sql .
" UNION " . $sql2;
16860 } elseif (empty($sql) && !empty($sql2)) {
16866 $limit = $MAXWITHOUTPAGINATION;
16869 $sql .=
$db->order($sanitized_sortfield_new, $sortorder);
16871 $sql .=
$db->plimit($limit + 1, $offset);
16874 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
16876 $resql =
$db->query($sql);
16879 $num =
$db->num_rows($resql);
16881 $imaxinloop = ($limit ? min($num, $limit) : $num);
16882 while ($i < $imaxinloop) {
16883 $obj =
$db->fetch_object($resql);
16885 if ($obj->type ==
'action') {
16887 $contactaction->id = $obj->id;
16888 $result = $contactaction->fetchResources();
16891 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
16897 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
16898 $tododone =
'todo';
16901 $histo[$numaction] = array(
16902 'type' => $obj->type,
16903 'tododone' => $tododone,
16905 'datestart' =>
$db->jdate($obj->dp),
16906 'dateend' =>
$db->jdate($obj->dp2),
16907 'fulldayevent' => (
int) $obj->fulldayevent,
16908 'note' => $obj->label,
16909 'message' => $obj->message,
16910 'percent' => $obj->percent,
16912 'userid' => $obj->user_id,
16913 'login' => $obj->user_login,
16914 'userfirstname' => $obj->user_firstname,
16915 'userlastname' => $obj->user_lastname,
16916 'userphoto' => $obj->user_photo,
16917 'msg_from' => $obj->msg_from,
16919 'contact_id' => $obj->fk_contact,
16920 'socpeopleassigned' => $contactaction->socpeopleassigned,
16921 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
16922 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
16923 'fk_element' => $obj->fk_element,
16924 'elementtype' => $obj->elementtype,
16926 'acode' => $obj->acode,
16927 'alabel' => $obj->alabel,
16928 'libelle' => $obj->alabel,
16929 'apicto' => $obj->apicto
16932 $histo[$numaction] = array(
16933 'type' => $obj->type,
16934 'tododone' =>
'done',
16936 'datestart' =>
$db->jdate($obj->dp),
16937 'dateend' =>
$db->jdate($obj->dp2),
16938 'fulldayevent' => (
int) $obj->fulldayevent,
16939 'note' => $obj->label,
16940 'message' => $obj->message,
16941 'percent' => $obj->percent,
16942 'acode' => $obj->acode,
16944 'userid' => $obj->user_id,
16945 'login' => $obj->user_login,
16946 'userfirstname' => $obj->user_firstname,
16947 'userlastname' => $obj->user_lastname,
16948 'userphoto' => $obj->user_photo
16964 $langs->loadLangs(array(
"admin",
"errors"));
16965 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
16969 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
16971 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
16972 include_once DOL_DOCUMENT_ROOT .
'/core/lib/functions2.lib.php';
16973 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
16974 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
16981 $userGetNomUrlCache = array();
16982 $contactGetNomUrlCache = array();
16984 $out .=
'<div class="filters-container" >';
16985 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
16986 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
16989 $objcon && get_class($objcon) ==
'Contact' &&
16990 (is_null($filterobj) || get_class($filterobj) ==
'Societe')
16992 $out .=
'<input type="hidden" name="id" value="' . $objcon->id .
'" />';
16994 $out .=
'<input type="hidden" name="id" value="' . $filterobj->id .
'" />';
16996 if (($filterobj && get_class($filterobj) ==
'Societe')) {
16997 $out .=
'<input type="hidden" name="socid" value="' . $filterobj->id .
'" />';
16999 $out .=
'<input type="hidden" name="userid" value="' . $filterobj->id .
'" />';
17004 $out .=
'<div class="div-table-responsive-no-min">';
17005 $out .=
'<table class="noborder borderbottom centpercent">';
17007 $out .=
'<tr class="liste_titre">';
17010 if (
$conf->main_checkbox_left_column) {
17011 $out .=
'<th class="liste_titre width50 middle">';
17012 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
17013 $out .= $searchpicto;
17018 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ') .
"\n";
17020 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">' . $langs->trans(
"Search") .
' : </strong></th>';
17022 $out .=
'<th class="liste_titre"></th>';
17025 $out .=
'<th class="liste_titre">';
17026 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="' . $langs->trans(
"ActionType") .
'"></span>';
17027 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
17030 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
17031 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="' . $filters[
'search_agenda_label'] .
'" placeholder="' . $langs->trans(
"Label") .
'">';
17035 if (!
$conf->main_checkbox_left_column) {
17036 $out .=
'<th class="liste_titre width50 middle">';
17037 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
17038 $out .= $searchpicto;
17044 $out .=
'</table>';
17051 $out .=
'<ul class="timeline">';
17055 if ($filterobj instanceof
Societe) {
17056 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
17058 if ($filterobj instanceof
User) {
17059 $tmp .=
'<a href="' . DOL_URL_ROOT .
'/comm/action/list.php?mode=show_list&socid=' . $filterobj->id .
'&status=done">';
17061 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
17062 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
17063 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
17065 if ($filterobj instanceof
Societe) {
17068 if ($filterobj instanceof
User) {
17074 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/cactioncomm.class.php';
17076 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
17078 $actualCycleDate =
false;
17081 foreach ($histo as $key => $value) {
17082 $actionstatic->fetch($histo[$key][
'id']);
17084 $actionstatic->type_picto = $histo[$key][
'apicto'];
17085 $actionstatic->type_code = $histo[$key][
'acode'];
17087 $labeltype = $actionstatic->type_code;
17088 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
17089 $labeltype =
'AC_OTH';
17091 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
17092 $labeltype = $langs->trans(
"Message");
17094 if (!empty($arraylist[$labeltype])) {
17095 $labeltype = $arraylist[$labeltype];
17097 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
17098 $labeltype .=
' - ' . $arraylist[$actionstatic->code];
17102 $url = DOL_URL_ROOT .
'/comm/action/card.php?id=' . $histo[$key][
'id'];
17104 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
17106 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'] .
'-' . $tmpa[
'yday']) {
17107 $actualCycleDate = $tmpa[
'year'] .
'-' . $tmpa[
'yday'];
17108 $out .=
'<!-- timeline time label -->';
17109 $out .=
'<li class="time-label">';
17110 $out .=
'<span class="timeline-badge-date">';
17111 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
17114 $out .=
'<!-- /.timeline-label -->';
17118 $out .=
'<!-- timeline item -->' .
"\n";
17119 $out .=
'<li class="timeline-code-' . (!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none") .
'">';
17122 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
17127 $out .=
'<div class="timeline-item">' .
"\n";
17129 $out .=
'<span class="time timeline-header-action2">';
17131 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
17132 $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") .
' ';
17133 $out .= $histo[$key][
'id'];
17136 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle') .
' ';
17140 $user->hasRight(
'agenda',
'allactions',
'create') ||
17141 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))
17143 $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) .
'">';
17145 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
17152 $out .=
'<span class="time"><i class="fa fa-clock valignmiddle"></i> ';
17153 $out .=
'<span class="valignmiddle marginrightonly">';
17154 $out .=
dol_print_date($histo[$key][
'datestart'],
'day',
'tzuserrel');
17157 $out .=
' '.dol_print_date($histo[$key][
'datestart'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
17159 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
17160 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
17161 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
17162 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
17163 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false, 1);
17165 $out .=
' - ' .
dol_print_date($histo[$key][
'dateend'],
'day',
'tzuserrel');
17167 $out .=
' '.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel',
null,
false,
'opacitymedium');
17172 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17175 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17178 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
17181 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
17185 $out .=
img_warning($langs->trans(
"Late")) .
' ';
17187 $out .=
"</span></span>\n";
17189 $out .=
'<span class="time">';
17190 $out .= $actionstatic->getLibStatut(2);
17194 $out .=
'<h3 class="timeline-header">';
17197 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
17198 if ($histo[$key][
'userid'] > 0) {
17199 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
17200 $userstatic->fetch($histo[$key][
'userid']);
17201 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
17203 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
17204 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
17205 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
17206 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
17207 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
17209 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
17212 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
17214 $out .=
'<img class="photomemberphoto userphoto" alt="" src="/public/theme/common/user_anonymous.png">'.$langs->trans(
"Anonymous");
17219 $out .=
' <div class="messaging-title inline-block">';
17221 if (empty(
$conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
17222 $out .= $labeltype .
' - ';
17227 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
17228 $out .= $langs->trans(
'TicketNewMessage').
' - <em>'.
img_picto($langs->trans(
'Private'),
'lock',
'class="valignmiddle"').
' '.$langs->trans(
'Private').
'</em>';
17229 $summary = preg_replace(
'/\[[^\]]*\]\s*/',
'', $actionstatic->label);
17231 $out .=
' - '.dolPrintHTML($summary);
17233 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
17234 $out .= $langs->trans(
'TicketNewMessage');
17235 } elseif (isset($histo[$key][
'type'])) {
17236 if ($histo[$key][
'type'] ==
'action') {
17237 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
17238 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
17239 $libelle = $histo[$key][
'note'];
17240 $actionstatic->id = $histo[$key][
'id'];
17241 if ($libelle != $labeltype) {
17244 } elseif ($histo[$key][
'type'] ==
'mailing') {
17245 $out .=
'<a href="' . DOL_URL_ROOT .
'/comm/mailing/card.php?id=' . $histo[$key][
'id'] .
'">' .
img_object($langs->trans(
"ShowEMailing"),
"email") .
' ';
17246 $transcode = $langs->transnoentitiesnoconv(
"Action" . $histo[$key][
'acode']);
17247 $libelle = ($transcode !=
"Action" . $histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
17250 $libelle .= $histo[$key][
'note'];
17254 $out = preg_replace(
'/ - $/',
'', $out);
17256 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
17257 if (isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
17258 $link =
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
17260 if (!isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
17261 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
17263 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
17264 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
17269 if (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
17270 if ($histo[$key][
'elementtype'] ==
'ticket') {
17275 if ($link && $showlink) {
17276 $out .=
' - ' . $link;
17285 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
17286 $newmess = $filterobj->message;
17288 $newmess = $histo[$key][
'message'];
17291 !empty($newmess && $newmess != $libelle)
17292 && $actionstatic->code !=
'AC_TICKET_MODIFY'
17294 $out .=
'<div class="timeline-body wordbreak small">';
17295 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
17301 if ($truncateLines > 0 && strlen($newmess) > strlen($truncatedText)) {
17302 $out .=
'<div class="readmore-block --closed" >';
17303 $out .=
' <div class="readmore-block__excerpt">';
17304 $out .=
dolPrintHTML($truncatedText, 0, array(
'pre',
'code'));
17305 $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>';
17307 $out .=
' <div class="readmore-block__full-text" >';
17309 $out .=
dolPrintHTML($newmess, 0, array(
'pre',
'code'));
17311 $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>';
17315 $out .=
dolPrintHTML($newmess, 0, array(
'pre',
'code'));
17324 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
17326 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
17327 if (empty(
$conf->cache[
'contact'][$cid])) {
17329 $contact->fetch($cid);
17330 $conf->cache[
'contact'][$cid] = $contact;
17332 $contact =
$conf->cache[
'contact'][$cid];
17336 $contactList .= !empty($contactList) ?
', ' :
'';
17337 $contactList .= $contact->getNomUrl(1);
17338 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
17339 if (!empty($contact->phone_pro)) {
17346 $footer .= $langs->trans(
'ActionOnContact') .
' : ' . $contactList;
17347 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
17348 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
17350 $result = $contact->fetch($histo[$key][
'contact_id']);
17351 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
17353 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
17354 $result = ($contact instanceof
Contact) ? $contact->id : 0;
17358 $footer .= $contact->getNomUrl(1);
17359 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
17360 if (!empty($contact->phone_pro)) {
17368 if (!empty($documents)) {
17369 $footer .=
'<div class="timeline-documents-container">';
17370 foreach ($documents as $doc) {
17371 $footer .=
'<span id="document_' . $doc->id .
'" class="timeline-documents" ';
17372 $footer .=
' data-id="' . $doc->id .
'" ';
17373 $footer .=
' data-path="' . $doc->filepath .
'"';
17377 $filePath = DOL_DATA_ROOT .
'/' . $doc->filepath .
'/' . $doc->filename;
17379 if (empty($doc->agenda_id)) {
17380 $dir_ref = $actionstatic->id;
17381 $modulepart =
'actions';
17383 $split_dir = explode(
'/', $doc->filepath);
17384 $modulepart = array_shift($split_dir);
17385 $dir_ref = implode(
'/', $split_dir);
17388 $file = $dir_ref .
'/' . $doc->filename;
17389 $thumb = $dir_ref .
'/thumbs/' . substr($doc->filename, 0, strrpos($doc->filename,
'.')) .
'_mini' . substr($doc->filename, strrpos($doc->filename,
'.'));
17390 $doclink =
dol_buildpath(
'document.php', 1) .
'?modulepart=' . $modulepart .
'&attachment=0&file=' . urlencode($file) .
'&entity=' .
$conf->entity;
17391 $viewlink =
dol_buildpath(
'viewimage.php', 1) .
'?modulepart=' . $modulepart .
'&file=' . urlencode($thumb) .
'&entity=' .
$conf->entity;
17395 $mimeAttr =
' mime="' . $mime .
'" ';
17397 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
17398 $class .=
' documentpreview';
17401 $footer .=
'<a href="' . $doclink .
'" class="btn-link ' . $class .
'" target="_blank" rel="noopener noreferrer" ' . $mimeAttr .
' >';
17402 $footer .=
img_mime($filePath) .
' ' . $doc->filename;
17405 $footer .=
'</span>';
17407 $footer .=
'</div>';
17410 if (!empty($footer)) {
17411 $out .=
'<div class="timeline-footer">' . $footer .
'</div>';
17414 $out .=
'</div>' .
"\n";
17417 $out .=
'<!-- END timeline item -->';
17424 jQuery(document).ready(function () {
17425 $(document).on("click", "[data-read-more-action]", function(e){
17426 console.log("We click on data-read-more-action");
17427 let readMoreBloc = $(this).closest(".readmore-block");
17428 if(readMoreBloc.length > 0){
17429 e.preventDefault();
17430 if($(this).attr("data-read-more-action") == "close"){
17431 readMoreBloc.addClass("--closed").removeClass("--open");
17432 $("html, body").animate({
17433 scrollTop: readMoreBloc.offset().top - 200
17436 readMoreBloc.addClass("--open").removeClass("--closed");
17444 if (empty($histo)) {
17445 $out .=
'<span class="opacitymedium">' . $langs->trans(
"NoRecordFound") .
'</span>';
17448 if ($num > $MAXWITHOUTPAGINATION) {
17449 $langs->load(
"errors");
17450 $out .=
'<center><span class="opacitymedium">...' . $langs->trans(
"WarningTooManyDataPleaseUseMoreFilters", $MAXWITHOUTPAGINATION) .
'...</span></center>';
17473function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
17475 if ($timestamp ===
null) {
17476 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
17483 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
17484 $TParam = array_merge($TParam, array(
17491 return '&' . http_build_query($TParam);
17512function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
17514 global
$conf,
$db, $langs, $hookmanager;
17517 if (!is_object($langs)) {
17518 include_once DOL_DOCUMENT_ROOT .
'/core/class/translate.class.php';
17520 $langs->setDefaultLang();
17523 $langs->load(
"errors");
17525 if ($printheader) {
17526 if (function_exists(
"llxHeader")) {
17528 } elseif (function_exists(
"llxHeaderVierge")) {
17533 print
'<div class="error">';
17534 if (empty($message)) {
17535 print $langs->trans(
"ErrorRecordNotFound");
17537 print $langs->trans($message);
17542 if (empty($showonlymessage)) {
17543 if (empty($hookmanager)) {
17544 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
17547 $hookmanager->initHooks(array(
'main'));
17550 $parameters = array(
'message' => $message,
'params' => $params);
17551 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
17552 print $hookmanager->resPrint;
17555 if ($printfooter && function_exists(
"llxFooter")) {
17557 if (is_object(
$db)) {
17598 foreach ($array2 as $key => $value) {
17599 if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
17602 $merged[$key] = $value;
17617 if (!empty($obj->socid)) {
17618 return (
int) $obj->socid;
17619 } elseif (!empty($obj->soc_id)) {
17620 return (
int) $obj->soc_id;
17621 } elseif (!empty($obj->societe_id)) {
17622 return (
int) $obj->societe_id;
17635 if (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 700) {
17637 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] < 950) {
17639 } elseif (!empty($_SESSION[
'dol_screenheight']) && $_SESSION[
'dol_screenheight'] > 1130) {
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
global $dolibarr_main_url_root
if(!defined( 'NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined( 'NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) if(!defined( 'NOLOGIN')) if(!defined('NOCSRFCHECK')) if(!defined( 'NOIPCHECK')) llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[], $ws='')
Header function.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='', $readonly=0)
On/off button to change a property status of an object This uses the ajax service objectonoff....
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage agenda events (actions)
Class to manage different types of events.
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
Class to manage GeoIP conversion Usage: $geoip=new GeoIP('country',$datfile); $geoip->getCountryCodeF...
Class to manage invoices.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
isACompany()
Check if third party is a company (Business) or an end user (Consumer)
Class to manage translations.
Class to manage Dolibarr users.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
dol_get_prev_month($month, $year)
Return previous month.
dol_get_next_day($day, $month, $year)
Return next day.
getServerTimeZoneInt($refgmtdate='now')
Return server timezone int.
dol_get_prev_day($day, $month, $year)
Return previous day.
dol_get_next_month($month, $year)
Return next month.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert a PDF file into another image format.
dragAndDropFileUpload($htmlname)
Function to manage the drag and drop of a file.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_is_dir($folder)
Test if filename is a directory.
$date_start
Variables from include:
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
isValidVATID($company)
Check if VAT numero is valid (check done on syntax only, no database or remote access)
dol_html_entity_decode($a, $b, $c='UTF-8', $keepsomeentities=0)
Replace html_entity_decode functions to manage errors.
dol_now($mode='gmt')
Return date for now.
dol_fiche_end($notab=0)
Show tab footer of a card.
dolSort($arraytosort)
Sort an array using a user defined function.
verifCond($strToEvaluate, $onlysimplestring='1')
Verify if condition in string is ok or not.
getDolGlobalLoginBadCharUnauthorized()
Return the list of unauthorized characters in user logins.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
getDolGlobalFloat($key, $default=0)
Return a Dolibarr global constant float value.
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formatted size.
isOnlyOneLocalTax($local)
Return true if LocalTax (1 or 2) is unique.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
img_weather($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $morecss='')
Show weather picto.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
dolCheckFilters($sqlfilters, &$error='', &$parenthesislevel=0)
Return if a $sqlfilters parameter has a valid balance of parenthesis.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
dol_getmypid()
Return getmypid() or random PID when function is disabled Some web hosts disable this php function fo...
getLanguageCodeFromCountryCode($countrycode)
Return default language from country code.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
setEntity($currentobject)
Set entity id to use when to create an object.
dolForgeExplodeAnd($sqlfilters)
Explode an universal search string with AND parts.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_credit_card($brand, $morecss='fa-2x inline-block valignmiddle')
Return image of a credit card according to its brand name.
GETPOSTDATE($prefix, $hourTime='', $gm='auto', $saverestore='')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
dol_print_ip($ip, $mode=0, $showname=0)
Return an IP formatted to be shown on screen.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
dol_ucfirst($string, $encoding="UTF-8")
Convert first character of the first word of a string to upper.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_right($titlealt='default', $selected=0, $moreatt='')
Show right arrow logo.
dol_print_phone($phone, $countrycode='', $contactid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
dol_strtolower($string, $encoding="UTF-8")
Convert a string to lower.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
dol_htmlentitiesbr_decode($stringtodecode, $pagecodeto='UTF-8')
This function is called to decode a HTML string (it decodes entities and br tags)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_left($titlealt='default', $selected=0, $moreatt='')
Show left arrow logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs=null, $mode=0, $extralangcode='')
Return a formatted address (part address/zip/town/state) according to country rules.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
getObjectSocId($obj)
Get the socid of an object, supporting legacy attribute names.
getListLimitFromScreenHeight()
Get the limit of list to show according to the screen height.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
isASecretKey($keyname)
Return if string has a name dedicated to store a secret.
dolPrintHTMLForTextArea($s, $allowiframe=0)
Return a string ready to be output on input textarea.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_eval_new($s)
Replace eval function to add more security.
getCallerInfoString()
Get caller info as a string that can be appended to a log message.
get_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Get formatted error messages to output (Used to show messages on html output).
dol_user_country()
Return country code for current user.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=null)
Clean a string from some undesirable HTML tags.
getMultidirTemp($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its temporary ...
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dolOutputDates($datep, $datef=null, $fullday=0, $addseconds=0, $pictotoadd='', $tzoutput='tzuserrel', $reduceformat=0)
Print decorated date-hour.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolEntity()
Return the current entity.
picto_required()
Return picto saying a field is required.
isDolTms($timestamp)
isDolTms check if a timestamp is valid.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
dol_sanitizePathName($str, $newstr='_', $unaccent=0, $allowdash=0)
Clean a string to use it as a path name.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
getTaxesFromId($vatrate, $buyer=null, $seller=null, $firstparamisid=1)
Get tax (VAT) main information from Id.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dolPrintText($s)
Return a string label (possible on several lines and that should not contains any HTML) ready to be o...
utf8_valid($str)
Check if a string is in UTF8.
getPictoForType($key, $morecss='')
Return the picto for a data type.
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
getDolOptimizeSmallScreen()
Return if render must be optimized for small screen.
img_allow($allow, $titlealt='default')
Show tick logo if allowed.
isValidMXRecord($domain)
Return if the domain name has a valid MX record.
dolButtonToOpenExportDialog($name, $label, $buttonstring, $exportSiteName, $overwriteGitUrl, $website)
Create a dialog with two buttons for export and overwrite of a website.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
jsonOrUnserialize($stringtodecode, $assoc=true)
Decode an encoded string.
dol_print_socialnetworks($value, $contactid, $socid, $type, $dictsocialnetworks=array())
Show social network link.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tab header of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
get_localtax_by_third($local)
Get values of localtaxes (1 or 2) for company country for the common vat with the highest value.
dol_escape_php($stringtoescape, $stringforquotes=2)
Returns text escaped for inclusion into a php string, build with double quotes " or '.
dolSetCookie(string $cookiename, string $cookievalue, int $expire=-1)
Set a cookie.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
img_view($titlealt='default', $float=0, $other='class="valignmiddle"')
Show logo view card.
dol_get_object_properties($obj, $properties=[])
Get value of properties for an object - including magic properties when requested.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_strftime($fmt, $ts=false, $is_gmt=false)
Format a string.
img_picto_common($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $notitle=0)
Show picto (generic function)
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
img_search($titlealt='default', $other='')
Show search logo.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_string_neverthesehtmltags($stringtoclean, $disallowed_tags=array('textarea'), $cleanalsosomestyles=0)
Clean a string from some undesirable HTML tags.
isValidPhone($phone)
Return true if phone number syntax is ok TODO Decide what to do with this.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
img_previous($titlealt='default', $moreatt='')
Show previous logo.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
fieldLabel($langkey, $fieldkey, $fieldrequired=0)
Show a string with the label tag dedicated to the HTML edit field.
getBrowserInfo($user_agent)
Return information about user browser.
dolGetFirstLetters($s, $nbofchar=1)
Return first letters of a strings.
dolPrintLabel($s, $escapeonlyhtmltags=0)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0, $forbiddenfields=array())
forgeSQLFromUniversalSearchCriteria
dol_clone_in_array($srcobject, $startlevel=0)
Create a clone of instance of object into a full array, using recursive call.
dol_strtoupper($string, $encoding="UTF-8")
Convert a string to upper.
getMultidirVersion($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its versioned ...
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
dol_sanitizeUrl($stringtoclean, $type=1)
Clean a string to use it as an URL (into a href or src attribute)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
img_printer($titlealt="default", $other='')
Show printer logo.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
ascii_check($str)
Check if a string is in ASCII.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
getImgPictoConv($mode='fa')
Get array to convert the Dolibarr picto keys into Font awesome keys.
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
getArrayOfSocialNetworks()
Get array of social network dictionary.
getDolDefaultContextPage($s)
Return the default context page string.
safeArrayMap($callback, array $array)
Add a function to replace array_map with allowed callback.
num2Alpha($n)
Return a numeric value into an Excel like column number.
dol_size($size, $type='')
Optimize a size for some browsers (phone, smarphone...)
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
dolGetCountryCodeFromIp($ip)
Return a country code from IP.
dol_textishtml($msg, $option=0)
Return if a text is a html content.
dolPrintPassword($s)
Return a string ready to be output on an HTML attribute (alt, title, ...)
dol_escape_all($stringtoescape)
Returns text escaped for all protocols (so only alpha chars and numbers)
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolForgeSQLCriteriaCallback($matches)
Function to forge a SQL criteria from a USF (Universal Filter Syntax) string.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_escape_uri($stringtoescape)
Returns text escaped by RFC 3986 for inclusion into a clickable link.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
if(!function_exists( 'utf8_encode')) if(!function_exists('utf8_decode')) if(!function_exists( 'str_starts_with')) if(!function_exists('str_ends_with')) if(!function_exists( 'str_contains')) formatLogObject($data)
Return a string serialized to be output on log with dol_syslog() An option allow to output log in one...
getDolDBType()
Return the current entity.
print_titre($title)
Show a title.
showSimpleHTMLTable($outputlangs, $object)
Returns simple order table template as string.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_string_nounprintableascii($str, $removetabcrlf=1)
Clean a string from all non printable ASCII chars (0x00-0x1F and 0x7F).
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
img_error($titlealt='default')
Show error logo.
getTimelineIcon($actionstatic, &$histo, $key)
Get timeline icon.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formatted messages to output (Used to show messages on html output).
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isStringVarMatching($var, $regextext, $matchrule=1)
Check if a variable with name $var start with $regextext.
dolSlugify($stringtoslugify)
Returns text slugified (lowercase and no special char, separator is "-").
dol_concat($text1, $text2)
Concat 2 strings.
complete_head_from_modules($conf, $langs, $object, &$head, &$h, $type, $mode='add', $filterorigmodule='')
Complete or removed entries into a head array (used to build tabs).
get_htmloutput_mesg($mesgstring='', $mesgarray=[], $style='ok', $keepembedded=0)
Get formatted messages to output (Used to show messages on html output).
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
print_fleche_navigation($page, $file, $options='', $nextpage=0, $betweenarrows='', $afterarrows='', $limit=-1, $totalnboflines=0, $selectlimitsuffix='', $beforearrows='', $hidenavigation=0)
Function to show navigation arrows into lists.
dol_nboflines($s, $maxchar=0)
Return nb of lines of a clear text.
dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox=0, $check='restricthtml')
Sanitize a HTML to remove js, dangerous content and external links.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
dol_escape_xml($stringtoescape)
Returns text escaped for inclusion into a XML string.
getActionCommEcmList($object)
getActionCommEcmList
dol_ucwords($string, $encoding="UTF-8")
Convert first character of all the words of a string to upper.
img_edit_add($titlealt='default', $other='')
Show logo "+".
print_fiche_titre($title, $mesg='', $picto='generic', $pictoisfullpath=0, $id='')
Show a title with picto.
dolForgeDummyCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0, $allowscript=0, $allowstyle=0, $allowphp=0)
Clean a string to keep only desirable HTML tags.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
sanitizeVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
dol_validElement($element)
Return if var element is ok.
dol_sanitizeKeyCode($str)
Clean a string to use it as a key or code.
isModEnabled($module)
Is Dolibarr module enabled.
array_merge_recursive_distinct(array $array1, array $array2)
Recursively merges two arrays while preserving keys and replacing existing values.
img_searchclear($titlealt='default', $other='')
Show search logo.
getWarningDelay($module, $parmlevel1, $parmlevel2='')
Return a warning delay You can use it like this: if (getWarningDelay('module', 'paramlevel1')) It rep...
utf8_check($str)
Check if a string is in UTF8.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_eval_standard($s, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
get_product_vat_for_country($idprod, $thirdpartytouseforcountry, $idprodfournprice=0)
Return vat rate of a product in a particular country, or default country vat if product is unknown.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dolPrintHTMLForAttributeUrl($s)
Return a string ready to be output on a href attribute (this one need a special because we need conte...
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
img_edit_remove($titlealt='default', $other='')
Show logo "-".
img_info($titlealt='default')
Show info logo.
getDoliDBInstance($type, $host, $user, $pass, $name, $port)
Return a DoliDB instance (database handler).
dol_sanitizeEmail($stringtoclean)
Clean a string to use it as an Email.
dol_nboflines_bis($text, $maxlinesize=0, $charset='UTF-8')
Return nb of lines of a formatted text with and (WARNING: string must not have mixed and br sep...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
const MODULE_MAPPING
This mapping defines the conversion to the current internal names from the alternative allowed names ...
dolBECalculateStructuredCommunication($invoice_number, $invoice_type)
Calculate Structured Communication / BE Bank payment reference number.
dol_convertToWord($num, $langs, $currency='', $centimes=false)
Function to return a number into a text.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
treeview li table
No Email.
div refaddress div address
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
dol_setcache($memoryid, $data, $expire=0, $filecache=0, $replace=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid, $filecache=0)
Read a memory area shared by all users, all sessions on server.
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
$conf db name
Only used if Module[ID]Name translation string is not found.
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
realCharForNumericEntities($matches)
Return the real char for a numeric entities.