53if (!function_exists(
'utf8_encode')) {
61 function utf8_encode($elements)
63 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
67if (!function_exists(
'utf8_decode')) {
75 function utf8_decode($elements)
77 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
80if (!function_exists(
'str_starts_with')) {
89 function str_starts_with($haystack, $needle)
91 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
94if (!function_exists(
'str_ends_with')) {
103 function str_ends_with($haystack, $needle)
105 return $needle !==
'' && substr($haystack, -strlen($needle)) === (string) $needle;
108if (!function_exists(
'str_contains')) {
117 function str_contains($haystack, $needle)
119 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
139 if (!is_object(
$object) && empty($module)) {
142 if (empty($module) && !empty(
$object->element)) {
147 if ($module ==
'fichinter') {
148 $module =
'ficheinter';
149 } elseif ($module ==
'invoice_supplier') {
150 $module =
'supplier_invoice';
151 } elseif ($module ==
'order_supplier') {
152 $module =
'supplier_order';
156 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
157 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_output')) {
159 if ($mode !=
'outputrel') {
162 if ($forobject &&
$object->id > 0) {
167 return 'error-diroutput-not-defined-for-this-object='.$module;
169 } elseif ($mode ==
'temp') {
170 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_temp')) {
173 return 'error-dirtemp-not-defined-for-this-object='.$module;
176 return 'error-bad-value-for-mode';
220 return (
string) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
235 return (
int) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
250 return (
float) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
264 return (
bool) (
$conf->global->$key ?? $default);
278 if (empty($tmpuser)) {
283 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
296 if (empty($tmpuser)) {
301 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
318 'adherent' =>
'member',
319 'member_type' =>
'adherent_type',
321 'contrat' =>
'contract',
322 'entrepot' =>
'stock',
323 'projet' =>
'project',
324 'categorie' =>
'category',
325 'commande' =>
'order',
326 'expedition' =>
'shipping',
327 'facture' =>
'invoice',
328 'fichinter' =>
'intervention',
329 'ficheinter' =>
'intervention',
330 'propale' =>
'propal',
331 'socpeople' =>
'contact',
332 'fournisseur' =>
'supplier',
334 'actioncomm' =>
'agenda',
335 'product_price' =>
'productprice',
336 'product_fournisseur_price' =>
'productsupplierprice',
346function isModEnabled($module)
356 $arrayconv[
'supplier_order'] =
'fournisseur';
357 $arrayconv[
'supplier_invoice'] =
'fournisseur';
362 if ($module ==
'delivery_note') {
366 $module =
'shipping';
370 $module_alt = $module;
371 if (!empty($arrayconv[$module])) {
372 $module_alt = $arrayconv[$module];
374 $module_bis = $module;
375 if (!empty($arrayconvbis[$module])) {
376 $module_bis = $arrayconvbis[$module];
379 return !empty(
$conf->modules[$module]) || !empty(
$conf->modules[$module_alt]) || !empty(
$conf->modules[$module_bis]);
391 if ($timestamp ===
'') {
392 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page '.$_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_NOTICE);
395 if (is_null($timestamp) || !is_numeric($timestamp)) {
415 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
417 $class =
'DoliDB'.ucfirst($type);
418 $db =
new $class($type, $host, $user, $pass, $name, $port);
439function getEntity($element, $shared = 1, $currentobject =
null)
443 if (!is_object($hookmanager)) {
444 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
451 $element =
'project';
454 $element =
'contract';
456 case 'order_supplier':
457 $element =
'supplier_order';
459 case 'invoice_supplier':
460 $element =
'supplier_invoice';
464 if (is_object($mc)) {
465 $out = $mc->getEntity($element, $shared, $currentobject);
468 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
470 $addzero[] =
'c_holiday_types';
472 if (in_array($element, $addzero)) {
475 $out .= ((int)
$conf->entity);
480 'element' => $element,
483 'currentobject' => $currentobject,
486 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
488 if (is_numeric($reshook)) {
489 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
490 $out .=
','.$hookmanager->resPrint;
491 } elseif ($reshook == 1) {
492 $out = $hookmanager->resPrint;
509 if (is_object($mc) && method_exists($mc,
'setEntity')) {
510 return $mc->setEntity($currentobject);
512 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity :
$conf->entity);
524 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
536 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
537 $r = chr($n % 26 + 0x41) . $r;
561 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
568 $user_agent = substr($user_agent, 0, 512);
570 $detectmobile =
new Mobile_Detect(
null, $user_agent);
571 $tablet = $detectmobile->isTablet();
573 if ($detectmobile->isMobile()) {
577 if ($detectmobile->is(
'AndroidOS')) {
578 $os = $phone =
'android';
579 } elseif ($detectmobile->is(
'BlackBerryOS')) {
580 $os = $phone =
'blackberry';
581 } elseif ($detectmobile->is(
'iOS')) {
584 } elseif ($detectmobile->is(
'PalmOS')) {
585 $os = $phone =
'palm';
586 } elseif ($detectmobile->is(
'SymbianOS')) {
588 } elseif ($detectmobile->is(
'webOS')) {
590 } elseif ($detectmobile->is(
'MaemoOS')) {
592 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
598 if (preg_match(
'/linux/i', $user_agent)) {
600 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
602 } elseif (preg_match(
'/windows/i', $user_agent)) {
608 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
610 $version = empty($reg[2]) ?
'' : $reg[2];
611 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
613 $version = empty($reg[2]) ?
'' : $reg[2];
614 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
616 $version = empty($reg[2]) ?
'' : $reg[2];
617 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
620 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
622 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
624 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
626 $version = empty($reg[2]) ?
'' : $reg[2];
627 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
630 $version = empty($reg[2]) ?
'' : $reg[2];
631 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
633 $version = end($reg);
634 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
637 $version = end($reg);
638 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
640 $name =
'textbrowser';
641 $version = empty($reg[3]) ?
'' : $reg[3];
642 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
644 $name =
'textbrowser';
645 $version = empty($reg[1]) ?
'' : $reg[1];
657 'browsername' => $name,
658 'browserversion' => $version,
660 'browserua' => $user_agent,
675 $disconnectdone =
false;
677 if (is_object($db) && !empty($db->connected)) {
678 $depth = $db->transaction_opened;
679 $disconnectdone = $db->close();
681 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));
693function GETPOSTISSET($paramname)
697 $relativepathstring = $_SERVER[
"PHP_SELF"];
699 if (constant(
'DOL_URL_ROOT')) {
700 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
702 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
703 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
709 if (!empty($_GET[
'restore_lastsearch_values'])) {
710 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
711 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
712 if (is_array($tmp)) {
713 foreach ($tmp as $key => $val) {
714 if ($key == $paramname) {
722 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
724 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
726 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
728 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
732 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
749 if (empty($method)) {
750 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
751 } elseif ($method == 1) {
752 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
753 } elseif ($method == 2) {
754 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
755 } elseif ($method == 3) {
756 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
758 $val =
'BadFirstParameterForGETPOST';
761 return is_array($val);
794function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
796 global $mysoc, $user,
$conf;
798 if (empty($paramname)) {
799 return 'BadFirstParameterForGETPOST';
802 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);
807 if (empty($method)) {
808 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
809 } elseif ($method == 1) {
810 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
811 } elseif ($method == 2) {
812 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
813 } elseif ($method == 3) {
814 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
816 return 'BadThirdParameterForGETPOST';
819 $relativepathstring =
'';
821 if (empty($method) || $method == 3 || $method == 4) {
822 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
824 if (constant(
'DOL_URL_ROOT')) {
825 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
827 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
828 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
834 if (!empty($_GET[
'restore_lastsearch_values'])) {
835 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
836 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
837 if (is_array($tmp)) {
838 foreach ($tmp as $key => $val) {
839 if ($key == $paramname) {
847 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
848 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
849 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
850 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
851 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
852 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
853 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
854 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
856 } elseif (!isset($_GET[
'sortfield'])) {
859 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
862 '@phan-var-force CommonObject $object';
863 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
865 $out =
$object->fields[$paramname][
'default'];
869 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
871 if (!empty($user->default_values)) {
872 if (isset($user->default_values[$relativepathstring][
'createform'])) {
873 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
875 if ($defkey !=
'_noquery_') {
876 $tmpqueryarraytohave = explode(
'&', $defkey);
879 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
880 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
893 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
894 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
901 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
903 if (!empty($user->default_values)) {
906 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
908 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
910 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
912 if ($defkey !=
'_noquery_') {
913 $tmpqueryarraytohave = explode(
'&', $defkey);
916 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
917 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
930 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
931 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
935 if ($paramname ==
'sortfield') {
938 if ($paramname ==
'sortorder') {
946 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
947 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
948 if (!empty($_GET[
'disabledefaultvalues'])) {
952 if ($defkey !=
'_noquery_') {
953 $tmpqueryarraytohave = explode(
'&', $defkey);
956 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
957 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
969 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
971 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
974 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
975 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
978 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
979 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
994 '@phan-var-force string $paramname';
995 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1000 while (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out, $reg) && ($loopnb < $maxloop)) {
1004 if ($reg[1] ==
'DAY') {
1006 $newout = $tmp[
'mday'];
1007 } elseif ($reg[1] ==
'MONTH') {
1009 $newout = $tmp[
'mon'];
1010 } elseif ($reg[1] ==
'YEAR') {
1012 $newout = $tmp[
'year'];
1013 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
1016 $newout = $tmp2[
'day'];
1017 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
1020 $newout = $tmp2[
'month'];
1021 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
1023 $newout = ($tmp[
'year'] - 1);
1024 } elseif ($reg[1] ==
'NEXT_DAY') {
1027 $newout = $tmp2[
'day'];
1028 } elseif ($reg[1] ==
'NEXT_MONTH') {
1031 $newout = $tmp2[
'month'];
1032 } elseif ($reg[1] ==
'NEXT_YEAR') {
1034 $newout = ($tmp[
'year'] + 1);
1035 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1036 $newout = $mysoc->country_id;
1037 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1038 $newout = $user->id;
1039 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1040 $newout = $user->fk_user;
1041 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1042 $newout =
$conf->entity;
1043 } elseif ($reg[1] ==
'ID') {
1049 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1054 if (preg_match(
'/^array/', $check)) {
1055 if (!is_array($out) || empty($out)) {
1058 $tmparray = explode(
':', $check);
1059 if (!empty($tmparray[1])) {
1060 $tmpcheck = $tmparray[1];
1062 $tmpcheck =
'alphanohtml';
1064 foreach ($out as $outkey => $outval) {
1065 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1071 if (strpos($paramname,
'search_') === 0) {
1072 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1076 $out =
sanitizeVal($out, $check, $filter, $options);
1083 if (preg_match(
'/^backto/i', $paramname)) {
1084 $out = str_replace(
'\\',
'/', $out);
1085 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1087 $oldstringtoclean = $out;
1088 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1089 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1090 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1091 }
while ($oldstringtoclean != $out);
1096 if (empty($method) || $method == 3 || $method == 4) {
1097 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1104 if ($out !=
'' && isset($user)) {
1105 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1124 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1154function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto')
1157 if ($hourTime ===
'getpost') {
1161 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
1162 $hour = intval($m[1]);
1163 $minute = intval($m[2]);
1164 $second = intval($m[3]);
1166 $hour = $minute = $second = 0;
1169 $hour = (int) min($hour, 23);
1170 $minute = (int) min($minute, 59);
1171 $second = (int) min($second, 59);
1187function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1189 return sanitizeVal($out, $check, $filter, $options);
1201function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1210 if (!is_numeric($out)) {
1215 if (is_array($out)) {
1216 $out = implode(
',', $out);
1218 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1223 $out = filter_var($out, FILTER_SANITIZE_STRING);
1226 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1229 if (!is_array($out)) {
1231 if (preg_match(
'/[^a-z]+/i', $out)) {
1237 if (!is_array($out)) {
1239 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1245 if (!is_array($out)) {
1247 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1253 if (!is_array($out)) {
1255 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1262 if (!is_array($out)) {
1265 $oldstringtoclean = $out;
1269 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1276 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1277 }
while ($oldstringtoclean != $out);
1281 case 'alphawithlgt':
1282 if (!is_array($out)) {
1285 $oldstringtoclean = $out;
1289 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1296 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1297 }
while ($oldstringtoclean != $out);
1303 case 'restricthtmlnolink':
1304 case 'restricthtml':
1305 case 'restricthtmlallowclass':
1306 case 'restricthtmlallowlinkscript':
1307 case 'restricthtmlallowunvalid':
1312 if (empty($filter)) {
1313 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1315 if (is_null($options)) {
1318 $out = filter_var($out, $filter, $options);
1322 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1323 $out =
GETPOST($out,
'alphanohtml');
1331if (!function_exists(
'dol_getprefix')) {
1342 function dol_getprefix($mode =
'')
1345 if ($mode ==
'email') {
1351 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1352 return $_SERVER[
"SERVER_NAME"];
1357 if (!empty(
$conf->file->instance_unique_id)) {
1358 return sha1(
'dolibarr'.
$conf->file->instance_unique_id);
1362 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1366 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1367 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1370 if (!empty($tmp_instance_unique_id)) {
1371 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1375 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1376 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1378 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1395 global
$conf, $langs, $user, $mysoc;
1399 if (!file_exists($fullpath)) {
1400 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1404 if (!empty($classname) && !class_exists($classname)) {
1405 return include $fullpath;
1407 return include_once $fullpath;
1425function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1429 $path = preg_replace(
'/^\//',
'', $path);
1432 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1433 if (is_array(
$conf->file->dol_document_root)) {
1434 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1435 if ($key ==
'main') {
1439 if (@file_exists($dirroot.
'/'.$path)) {
1440 $res = $dirroot.
'/'.$path;
1445 if ($returnemptyifnotfound) {
1447 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1459 $res = DOL_URL_ROOT.
'/'.$path;
1462 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1465 $res = DOL_URL_ROOT.
'/'.$path;
1468 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1469 if ($key ==
'main') {
1474 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1475 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1478 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1483 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1484 if (!empty($regs[1])) {
1487 if (@file_exists($dirroot.
'/'.$regs[1])) {
1489 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1490 } elseif ($type == 2) {
1491 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1492 } elseif ($type == 3) {
1496 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1497 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1500 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
$conf->file->dol_url_root[$key].
'/'.$path;
1524 if (empty($properties)) {
1525 return get_object_vars($obj);
1528 $existingProperties = [];
1529 $realProperties = get_object_vars($obj);
1532 foreach ($properties as $property) {
1533 if (array_key_exists($property, $realProperties)) {
1535 $existingProperties[$property] = $obj->{$property};
1536 } elseif (property_exists($obj, $property)) {
1538 $existingProperties[$property] = $obj->{$property};
1542 return $existingProperties;
1570 $myclone = unserialize(serialize(
$object));
1572 if (!empty($tmpsavdb)) {
1575 } elseif ($native == 2) {
1578 $tmparray = get_object_vars(
$object);
1580 if (is_array($tmparray)) {
1581 foreach ($tmparray as $propertykey => $propertyval) {
1582 if (is_scalar($propertyval) || is_array($propertyval)) {
1583 $myclone->$propertykey = $propertyval;
1603function dol_size($size, $type =
'')
1606 if (empty(
$conf->dol_optimize_smallscreen)) {
1609 if ($type ==
'width' && $size > 250) {
1634 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1636 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1637 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1638 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1639 $tmp = str_replace(
'..',
'', $tmp);
1660 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1662 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1663 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1664 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1665 $tmp = str_replace(
'..',
'', $tmp);
1680 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1682 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1684 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1688 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1692 $oldstringtoclean = $stringtoclean;
1695 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1696 }
while ($oldstringtoclean != $stringtoclean);
1700 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1703 return $stringtoclean;
1715 $oldstringtoclean = $stringtoclean;
1716 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1717 }
while ($oldstringtoclean != $stringtoclean);
1719 return $stringtoclean;
1732 return preg_replace(
'/[^\w]+/',
'', $str);
1746 if (is_null($str)) {
1751 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1752 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1753 return $transliterator->transliterate($str);
1756 $string = rawurlencode($str);
1757 $replacements = array(
1758 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1760 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1761 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1763 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1765 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1766 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1767 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1769 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1770 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1772 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1774 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1775 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1777 $string = strtr($string, $replacements);
1778 return rawurldecode($string);
1783 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1784 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1785 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1786 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1787 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1788 \xF9\xFA\xFB\xFC\xFD\xFF",
1796 $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"));
1814function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1816 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1817 if (empty($keepspaces)) {
1818 $forbidden_chars_to_replace[] =
" ";
1820 $forbidden_chars_to_remove = array();
1823 if (is_array($badcharstoreplace)) {
1824 $forbidden_chars_to_replace = $badcharstoreplace;
1826 if (is_array($badcharstoremove)) {
1827 $forbidden_chars_to_remove = $badcharstoremove;
1831 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1850 if ($removetabcrlf) {
1851 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1853 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1865function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
1867 if (is_null($stringtoescape)) {
1872 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
1874 if (empty($noescapebackslashn)) {
1875 $substitjs[
"\n"] =
'\\n';
1876 $substitjs[
'\\'] =
'\\\\';
1879 $substitjs[
"'"] =
"\\'";
1880 $substitjs[
'"'] =
"\\'";
1881 } elseif ($mode == 1) {
1882 $substitjs[
"'"] =
"\\'";
1883 } elseif ($mode == 2) {
1884 $substitjs[
'"'] =
'\\"';
1885 } elseif ($mode == 3) {
1886 $substitjs[
"'"] =
"\\'";
1887 $substitjs[
'"'] =
"\\\"";
1889 return strtr($stringtoescape, $substitjs);
1900 return str_replace(
'"',
'\"', $stringtoescape);
1912 if (is_null($stringtoescape)) {
1916 if ($stringforquotes == 2) {
1917 return str_replace(
'"',
"'", $stringtoescape);
1918 } elseif ($stringforquotes == 1) {
1924 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
1925 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1928 return 'Bad parameter for stringforquotes in dol_escape_php';
1939 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
1950 return $stringtoescape;
2002 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
2027 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
2047function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2049 if ($noescapetags ==
'common') {
2050 $noescapetags =
'html,body,a,b,em,hr,i,u,ul,li,br,div,img,font,p,span,strong,table,tr,td,th,tbody,h1,h2,h3,h4,h5,h6,h7,h8,h9';
2052 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2054 if ($cleanalsojavascript) {
2059 if ($escapeonlyhtmltags) {
2060 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2062 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
2063 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE', $tmp);
2066 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2069 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2070 } elseif ($keepn == -1) {
2071 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2074 if ($escapeonlyhtmltags) {
2075 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2078 $tmparrayoftags = array();
2079 if ($noescapetags) {
2080 $tmparrayoftags = explode(
',', $noescapetags);
2082 if (count($tmparrayoftags)) {
2084 $tmp = str_ireplace(
'__DOUBLEQUOTE',
'', $tmp);
2086 foreach ($tmparrayoftags as $tagtoreplace) {
2087 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2088 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2089 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2095 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)>/', $tmp, $reg)) {
2096 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
2097 $tmpattributes = str_ireplace(
'href="http:',
'__HREFHTTPA', $tmpattributes);
2098 $tmpattributes = str_ireplace(
'href="https:',
'__HREFHTTPSA', $tmpattributes);
2099 $tmpattributes = str_ireplace(
'src="http:',
'__SRCHTTPIMG', $tmpattributes);
2100 $tmpattributes = str_ireplace(
'src="https:',
'__SRCHTTPSIMG', $tmpattributes);
2101 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2102 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2104 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2106 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)\s+\/>/', $tmp, $reg)) {
2107 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
2108 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2109 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2111 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'\s+\/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2114 $diff = strcmp($tmpold, $tmp);
2119 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2123 if (count($tmparrayoftags)) {
2124 foreach ($tmparrayoftags as $tagtoreplace) {
2125 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2126 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2127 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2128 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2129 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2132 $result = str_ireplace(
'__HREFHTTPA',
'href="http:', $result);
2133 $result = str_ireplace(
'__HREFHTTPSA',
'href="https:', $result);
2134 $result = str_ireplace(
'__SRCHTTPIMG',
'src="http:', $result);
2135 $result = str_ireplace(
'__SRCHTTPSIMG',
'src="https:', $result);
2136 $result = str_ireplace(
'__DOUBLEQUOTE',
'"', $result);
2139 $result = str_ireplace(
'__SIMPLEQUOTE',
''', $result);
2156 if (function_exists(
'mb_strtolower')) {
2157 return mb_strtolower($string, $encoding);
2159 return strtolower($string);
2173 if (function_exists(
'mb_strtoupper')) {
2174 return mb_strtoupper($string, $encoding);
2176 return strtoupper($string);
2190 if (function_exists(
'mb_substr')) {
2191 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2193 return ucfirst($string);
2207 if (function_exists(
'mb_convert_case')) {
2208 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2210 return ucwords($string);
2222 $backtrace = debug_backtrace();
2224 if (count($backtrace) >= 2) {
2225 $trace = $backtrace[1];
2226 if (isset($trace[
'file'], $trace[
'line'])) {
2227 $msg =
" From {$trace['file']}:{$trace['line']}.";
2255function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2257 global
$conf, $user, $debugbar;
2260 if (!isModEnabled(
'syslog')) {
2265 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2266 global $website, $websitekey;
2267 if (is_object($website) && !empty($website->ref)) {
2268 $suffixinfilename .=
'_website_'.$website->ref;
2269 } elseif (!empty($websitekey)) {
2270 $suffixinfilename .=
'_website_'.$websitekey;
2275 if (defined(
'USESUFFIXINLOG')) {
2276 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2280 foreach (
$conf->loghandlers as $loghandlerinstance) {
2281 $loghandlerinstance->setIdent($ident);
2285 if (!empty($message)) {
2287 $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');
2288 if (!array_key_exists($level, $logLevels)) {
2289 throw new Exception(
'Incorrect log level');
2296 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2300 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2301 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2302 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2303 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2305 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2311 print
"\n\n<!-- Log start\n";
2313 print
"Log end -->\n";
2317 'message' => $message,
2318 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') : false),
2320 'user' => ((is_object($user) && $user->id) ? $user->login : false),
2322 'osuser' => function_exists(
'posix_getuid') ? posix_getuid() : false,
2323 'ospid' => getmypid()
2327 if (!empty($remoteip)) {
2328 $data[
'ip'] = $remoteip;
2330 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
2331 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
2332 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
2333 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
2335 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2337 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
2338 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2340 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'];
2342 $data[
'ip'] =
'???';
2345 if (!empty($_SERVER[
'USERNAME'])) {
2347 $data[
'osuser'] = $_SERVER[
'USERNAME'];
2348 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2350 $data[
'osuser'] = $_SERVER[
'LOGNAME'];
2354 foreach (
$conf->loghandlers as $loghandlerinstance) {
2355 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2358 $loghandlerinstance->export($data, $suffixinfilename);
2364 foreach (
$conf->loghandlers as $loghandlerinstance) {
2365 $loghandlerinstance->setIdent($ident);
2385 $form =
new Form($db);
2387 $templatenameforexport = $website->name_template;
2388 if (empty($templatenameforexport)) {
2389 $templatenameforexport =
'website_'.$website->ref;
2393 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2396 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2397 $out .=
'jQuery(document).ready(function () {';
2398 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2399 $out .=
' var dialogHtml = \'';
2401 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2402 $dialogcontent .=
' <div style="margin-top: 20px;">';
2403 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2404 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2405 $dialogcontent .=
' </div>';
2406 $dialogcontent .=
' <br>';
2407 $dialogcontent .=
' <div style="margin-top: 20px;">';
2408 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2409 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2410 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2411 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2412 $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>';
2413 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2414 $dialogcontent .=
' </form>';
2415 $dialogcontent .=
' </div>';
2416 $dialogcontent .=
' </div>';
2423 // Add the content of the dialog to the body of the page
2424 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2425 $out .= ' if ($dialog.length > 0) {
2428 jQuery(
"body").append(dialogHtml);
';
2430 // Configuration of popup
2431 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2432 $out .= ' autoOpen:
false,
';
2433 $out .= ' modal:
true,
';
2434 $out .= ' height: 290,
';
2435 $out .= ' width:
"40%",
';
2436 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2439 // Simulate a click on the original "submit" input to export the site.
2440 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2441 $out .= ' console.log(
"Clic on exportsite.");
';
2442 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2443 $out .= ' console.log(
"element founded:", target.length > 0);
';
2444 $out .= ' if (target.length > 0) { target.click(); }
';
2445 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2449 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2450 $out .= ' return false;
';
2453 $out .= '</script>
';
2475function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $backtopagejsfields = '', $accesskey = '')
2479 if (strpos($url, '?
') > 0) {
2480 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2482 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2487 $backtopagejsfieldsid = '';
2488 $backtopagejsfieldslabel = '';
2489 if ($backtopagejsfields) {
2490 $tmpbacktopagejsfields = explode(':
', $backtopagejsfields);
2491 if (empty($tmpbacktopagejsfields[1])) { // If the part 'keyforpopupid:
' is missing, we add $name for it.
2492 $backtopagejsfields = $name.":".$backtopagejsfields;
2493 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[0]);
2495 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[1]);
2497 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ? '' : $tmp2backtopagejsfields[0];
2498 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ? '' : $tmp2backtopagejsfields[1];
2499 $url .= '&backtopagejsfields=
'.urlencode($backtopagejsfields);
2502 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2503 $out .= '<!-- a link
for button to open url into a dialog popup with backtopagejsfields =
'.$backtopagejsfields.' -->
';
2504 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2505 if (empty($conf->use_javascript_ajax)) {
2506 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2507 } elseif ($jsonopen) {
2508 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2510 $out .= ' href=
"#"';
2512 $out .= '>
'.$buttonstring.'</a>
';
2514 if (!empty($conf->use_javascript_ajax)) {
2515 // Add code to open url using the popup. Add also hidden field to retrieve the returned variables
2516 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2517 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2518 $out .= '<div
id=
"varforreturndialogid'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned
id' : '').'</div>
';
2519 $out .= '<div
id=
"varforreturndialoglabel'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned label
' : '').'</div>
';
2521 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2522 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2523 jQuery(document).ready(
function () {
2524 jQuery(
".button_'.$name.'").click(
function () {
2525 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2526 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2527 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2531 height: (window.innerHeight - 150),
2534 open: function (event, ui) {
2535 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2537 close:
function (event, ui) {
2538 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2539 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2540 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2541 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2542 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2544 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2545 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2550 $tmpdialog.dialog(\
'open\');
2575function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2577 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2596function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2598 global
$conf, $langs, $hookmanager;
2602 if (!empty(
$conf->dol_optimize_smallscreen)) {
2606 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2608 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2609 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2613 if ($morehtmlright) {
2614 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2638 if (is_array($links) && !empty($links)) {
2639 $keys = array_keys($links);
2641 $maxkey = max($keys);
2647 if (empty($limittoshow)) {
2650 if (!empty(
$conf->dol_optimize_smallscreen)) {
2658 for ($i = 0; $i <= $maxkey; $i++) {
2659 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2661 if ($i >= $limittoshow) {
2667 for ($i = 0; $i <= $maxkey; $i++) {
2668 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2674 if ($i < $limittoshow || $isactive) {
2676 $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])).
' -->';
2678 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2679 if (!empty($links[$i][0])) {
2680 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2682 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2684 } elseif (!empty($links[$i][1])) {
2686 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2688 if (!empty($links[$i][0])) {
2689 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2690 $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).
'">';
2693 if ($displaytab == 0 && $picto) {
2694 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
2697 $out .= $links[$i][1];
2698 if (!empty($links[$i][0])) {
2699 $out .=
'</a>'.
"\n";
2701 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2710 $outmore .=
'<div class="popuptabset wordwrap">';
2712 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2713 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2714 if (!empty($links[$i][0])) {
2715 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2717 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2719 } elseif (!empty($links[$i][1])) {
2720 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2721 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2722 $outmore .=
'</a>'.
"\n";
2724 $outmore .=
'</div>';
2729 $displaytab = $i + 1;
2732 $outmore .=
'</div>';
2736 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2737 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2738 $widthofpopup = 200;
2740 $tabsname = $moretabssuffix;
2741 if (empty($tabsname)) {
2742 $tabsname = str_replace(
"@",
"", $picto);
2744 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2746 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2748 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2751 $out .=
'<div></div>';
2754 $out .=
'<script nonce="'.getNonce().
'">';
2755 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2756 var x = this.offsetLeft, y = this.offsetTop;
2757 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2758 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2759 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2761 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2764 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2765 $out .=
"</script>";
2768 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2772 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
2773 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'').($notab == -4 ?
'' :
' tabBarWithBottom'))));
2776 if (!empty($dragdropfile)) {
2777 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2780 $parameters = array(
'tabname' => $active,
'out' => $out);
2781 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2783 $out = $hookmanager->resPrint;
2809 if (!$notab || $notab == -1) {
2810 return "\n</div>\n";
2835function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2837 global
$conf, $form, $user, $langs, $hookmanager, $action;
2841 $maxvisiblephotos = 1;
2845 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
2846 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2849 $modulepart =
'unknown';
2851 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
2852 $modulepart =
$object->element;
2853 } elseif (
$object->element ==
'member') {
2854 $modulepart =
'memberphoto';
2855 } elseif (
$object->element ==
'user') {
2856 $modulepart =
'userphoto';
2859 if (class_exists(
"Imagick")) {
2860 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
2861 $modulepart =
$object->element;
2862 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
2863 $modulepart =
'ficheinter';
2864 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2865 $modulepart =
'contract';
2866 } elseif (
$object->element ==
'order_supplier') {
2867 $modulepart =
'supplier_order';
2868 } elseif (
$object->element ==
'invoice_supplier') {
2869 $modulepart =
'supplier_invoice';
2873 if (
$object->element ==
'product') {
2875 '@phan-var-force Product $object';
2877 $cssclass =
'photowithmargin photoref';
2878 $showimage =
$object->is_photo_available(
$conf->product->multidir_output[$entity]);
2880 if (
$conf->browser->layout ==
'phone') {
2881 $maxvisiblephotos = 1;
2884 $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>';
2888 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2890 $nophoto =
'/public/theme/common/nophoto.png';
2891 $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>';
2894 } elseif (
$object->element ==
'category') {
2896 '@phan-var-force Categorie $object';
2898 $cssclass =
'photowithmargin photoref';
2899 $showimage =
$object->isAnyPhotoAvailable(
$conf->categorie->multidir_output[$entity]);
2901 if (
$conf->browser->layout ==
'phone') {
2902 $maxvisiblephotos = 1;
2905 $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>';
2909 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2911 $nophoto =
'/public/theme/common/nophoto.png';
2912 $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>';
2915 } elseif (
$object->element ==
'bom') {
2917 '@phan-var-force Bom $object';
2919 $cssclass =
'photowithmargin photoref';
2920 $showimage =
$object->is_photo_available(
$conf->bom->multidir_output[$entity]);
2922 if (
$conf->browser->layout ==
'phone') {
2923 $maxvisiblephotos = 1;
2926 $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>';
2930 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2932 $nophoto =
'/public/theme/common/nophoto.png';
2933 $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>';
2936 } elseif (
$object->element ==
'ticket') {
2938 $cssclass =
'photoref';
2940 '@phan-var-force Ticket $object';
2941 $showimage =
$object->is_photo_available(
$conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
2943 if (
$conf->browser->layout ==
'phone') {
2944 $maxvisiblephotos = 1;
2948 $showphoto =
$object->show_photos(
'ticket',
$conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2950 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2958 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2960 $nophoto =
img_picto(
'No photo',
'object_ticket');
2961 $morehtmlleft .=
'<!-- No photo to show -->';
2962 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2963 $morehtmlleft .= $nophoto;
2964 $morehtmlleft .=
'</div></div>';
2969 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
2972 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2974 $dir_output = (empty(
$conf->$modulepart->multidir_output[$entity]) ?
$conf->$modulepart->dir_output :
$conf->$modulepart->multidir_output[$entity]).
"/";
2975 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2977 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2981 if (empty($subdir)) {
2982 $subdir =
'errorgettingsubdirofobject';
2985 $filepath = $dir_output.$subdir.
"/";
2987 $filepdf = $filepath.$objectref.
".pdf";
2988 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2991 $fileimage = $filepdf.
'_preview.png';
2992 $relativepathimage = $relativepath.
'_preview.png';
2994 $pdfexists = file_exists($filepdf);
2999 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3001 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3010 if ($pdfexists && !$error) {
3011 $heightforphotref = 80;
3012 if (!empty(
$conf->dol_optimize_smallscreen)) {
3013 $heightforphotref = 60;
3016 if (file_exists($fileimage)) {
3017 $phototoshow =
'<div class="photoref">';
3018 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
3019 $phototoshow .=
'</div>';
3022 } elseif (!$phototoshow) {
3023 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
3027 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3028 $morehtmlleft .= $phototoshow;
3029 $morehtmlleft .=
'</div>';
3033 if (empty($phototoshow)) {
3034 if (
$object->element ==
'action') {
3036 $cssclass =
'photorefcenter';
3037 $nophoto =
img_picto(
'No photo',
'title_agenda');
3040 $cssclass =
'photorefcenter';
3042 $prefix =
'object_';
3046 if (strpos($picto,
'fontawesome_') !==
false) {
3049 $nophoto =
img_picto(
'No photo', $prefix.$picto);
3051 $morehtmlleft .=
'<!-- No photo to show -->';
3052 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3053 $morehtmlleft .= $nophoto;
3054 $morehtmlleft .=
'</div></div>';
3061 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
3064 if (
$object->element ==
'societe') {
3065 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3068 $morehtmlstatus .=
$object->getLibStatut(6);
3070 } elseif (
$object->element ==
'product') {
3072 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3073 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3075 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
3077 $morehtmlstatus .=
' ';
3079 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3080 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3082 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
3084 } elseif (in_array(
$object->element, array(
'salary'))) {
3086 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3089 $morehtmlstatus .= $tmptxt;
3090 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3091 $totalallpayments =
$object->getSommePaiement(0);
3092 $totalallpayments +=
$object->getSumCreditNotesUsed(0);
3093 $totalallpayments +=
$object->getSumDepositsUsed(0);
3094 $tmptxt =
$object->getLibStatut(6, $totalallpayments);
3095 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3096 $tmptxt =
$object->getLibStatut(5, $totalallpayments);
3098 $morehtmlstatus .= $tmptxt;
3099 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3101 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3104 $morehtmlstatus .= $tmptxt;
3105 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3107 $morehtmlstatus .=
$object->getLibStatut(5);
3109 $morehtmlstatus .=
$object->getLibStatut(4);
3111 } elseif (
$object->element ==
'facturerec') {
3112 '@phan-var-force FactureRec $object';
3113 if (
$object->frequency == 0) {
3114 $morehtmlstatus .=
$object->getLibStatut(2);
3116 $morehtmlstatus .=
$object->getLibStatut(5);
3118 } elseif (
$object->element ==
'project_task') {
3125 if (
$object->progress >= 100) {
3129 $tmptxt =
$object->getLibStatut(5);
3130 $morehtmlstatus .= $tmptxt;
3131 } elseif (method_exists(
$object,
'getLibStatut')) {
3132 $tmptxt =
$object->getLibStatut(6);
3133 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3134 $tmptxt =
$object->getLibStatut(5);
3136 $morehtmlstatus .= $tmptxt;
3140 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3142 if (method_exists(
$object,
'getVentilExportCompta')) {
3143 $accounted =
$object->getVentilExportCompta();
3144 $langs->load(
"accountancy");
3145 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
3150 if (!empty(
$object->name_alias)) {
3151 '@phan-var-force Societe $object';
3152 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3156 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3158 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3162 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3165 $morehtmlref .=
'<div class="refidno refaddress">';
3166 $morehtmlref .= $moreaddress;
3167 $morehtmlref .=
'</div>';
3171 $morehtmlref .=
'<div style="clear: both;"></div>';
3172 $morehtmlref .=
'<div class="refidno opacitymedium">';
3173 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3174 $morehtmlref .=
'</div>';
3177 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3178 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3181 } elseif (empty($reshook)) {
3182 $morehtmlref .= $hookmanager->resPrint;
3183 } elseif ($reshook > 0) {
3184 $morehtmlref = $hookmanager->resPrint;
3192 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3193 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3195 print
'<div class="underrefbanner clearboth"></div>';
3207function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3211 if ($fieldrequired) {
3212 $ret .=
'<span class="fieldrequired">';
3214 $ret .=
'<label for="'.$fieldkey.
'">';
3215 $ret .= $langs->trans($langkey);
3217 if ($fieldrequired) {
3238 global $langs, $hookmanager;
3241 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3246 $ret .= ($extralangcode ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->address)));
3249 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3251 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3252 $ret .= (($ret && $town) ? $sep :
'').$town;
3255 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3258 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3260 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3262 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3263 $ret .= ($ret ? $sep :
'').$town;
3265 $ret .= ($ret ?
", " :
'').
$object->state;
3268 $ret .= ($ret ? $sep :
'').
$object->zip;
3270 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3272 $ret .= ($ret ? $sep :
'').
$object->zip;
3273 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3274 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3276 $ret .= $sep.$object->state;
3278 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3281 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3283 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3285 $ret .= ($ret ? $sep :
'').
$object->zip;
3286 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3287 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3288 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3291 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3292 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3293 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3294 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3295 $ret .= ($ret ?
", " :
'').
$object->state;
3299 if (!is_object($outputlangs)) {
3300 $outputlangs = $langs;
3303 $langs->load(
"dict");
3304 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3307 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3308 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3312 $ret .= $hookmanager->resPrint;
3329function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3331 if ((abs($ts) <= 0x7FFFFFFF)) {
3334 return 'Error date outside supported range';
3359function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3361 global
$conf, $langs;
3368 if ($tzoutput ===
'auto') {
3369 $tzoutput = (empty(
$conf) ?
'tzserver' : (isset(
$conf->tzuserinputkey) ?
$conf->tzuserinputkey :
'tzserver'));
3374 $offsettz = $offsetdst = 0;
3377 if (is_string($tzoutput)) {
3378 if ($tzoutput ==
'tzserver') {
3380 $offsettzstring = @date_default_timezone_get();
3385 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3387 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3389 if (class_exists(
'DateTimeZone')) {
3390 $user_date_tz =
new DateTimeZone($offsettzstring);
3391 $user_dt =
new DateTime();
3392 $user_dt->setTimezone($user_date_tz);
3393 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3394 $offsettz = $user_dt->getOffset();
3396 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3397 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3402 if (!is_object($outputlangs)) {
3403 $outputlangs = $langs;
3406 $format =
'daytextshort';
3411 $reduceformat = (!empty(
$conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3412 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3413 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3414 if ($formatwithoutreduce != $format) {
3415 $format = $formatwithoutreduce;
3421 if ($format ==
'day') {
3422 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") :
$conf->format_date_short);
3423 } elseif ($format ==
'hour') {
3424 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") :
$conf->format_hour_short);
3425 } elseif ($format ==
'hourduration') {
3426 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") :
$conf->format_hour_short_duration);
3427 } elseif ($format ==
'daytext') {
3428 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") :
$conf->format_date_text);
3429 } elseif ($format ==
'daytextshort') {
3430 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") :
$conf->format_date_text_short);
3431 } elseif ($format ==
'dayhour') {
3432 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") :
$conf->format_date_hour_short);
3433 } elseif ($format ==
'dayhoursec') {
3434 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") :
$conf->format_date_hour_sec_short);
3435 } elseif ($format ==
'dayhourtext') {
3436 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") :
$conf->format_date_hour_text);
3437 } elseif ($format ==
'dayhourtextshort') {
3438 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") :
$conf->format_date_hour_text_short);
3439 } elseif ($format ==
'dayhourlog') {
3441 $format =
'%Y%m%d%H%M%S';
3442 } elseif ($format ==
'dayhourlogsmall') {
3444 $format =
'%y%m%d%H%M';
3445 } elseif ($format ==
'dayhourldap') {
3446 $format =
'%Y%m%d%H%M%SZ';
3447 } elseif ($format ==
'dayhourxcard') {
3448 $format =
'%Y%m%dT%H%M%SZ';
3449 } elseif ($format ==
'dayxcard') {
3451 } elseif ($format ==
'dayrfc') {
3452 $format =
'%Y-%m-%d';
3453 } elseif ($format ==
'dayhourrfc') {
3454 $format =
'%Y-%m-%dT%H:%M:%SZ';
3455 } elseif ($format ==
'standard') {
3456 $format =
'%Y-%m-%d %H:%M:%S';
3459 if ($reduceformat) {
3460 $format = str_replace(
'%Y',
'%y', $format);
3461 $format = str_replace(
'yyyy',
'yy', $format);
3465 if (preg_match(
'/%b/i', $format)) {
3467 $format = str_replace(
'%b',
'__b__', $format);
3468 $format = str_replace(
'%B',
'__B__', $format);
3470 if (preg_match(
'/%a/i', $format)) {
3472 $format = str_replace(
'%a',
'__a__', $format);
3473 $format = str_replace(
'%A',
'__A__', $format);
3478 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)) {
3479 dol_print_error(
null,
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]));
3481 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3483 dol_syslog(
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]), LOG_WARNING);
3486 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3487 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3488 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3489 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3490 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3491 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3493 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
3496 $tzo =
new DateTimeZone(
'UTC');
3498 $tzo =
new DateTimeZone(date_default_timezone_get());
3500 $dtts =
new DateTime();
3501 $dtts->setTimestamp($time);
3502 $dtts->setTimezone($tzo);
3503 $newformat = str_replace(
3504 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3505 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3508 $ret = $dtts->format($newformat);
3510 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3511 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3516 if ($time < 100000000000) {
3517 $timetouse = $time + $offsettz + $offsetdst;
3520 $tzo =
new DateTimeZone(
'UTC');
3522 $tzo =
new DateTimeZone(date_default_timezone_get());
3524 $dtts =
new DateTime();
3525 $dtts->setTimestamp($timetouse);
3526 $dtts->setTimezone($tzo);
3527 $newformat = str_replace(
3528 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3529 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3532 $ret = $dtts->format($newformat);
3534 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3535 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3540 $ret =
'Bad value '.$time.
' for date';
3544 if (preg_match(
'/__b__/i', $format)) {
3545 $timetouse = $time + $offsettz + $offsetdst;
3548 $tzo =
new DateTimeZone(
'UTC');
3550 $tzo =
new DateTimeZone(date_default_timezone_get());
3552 $dtts =
new DateTime();
3553 $dtts->setTimestamp($timetouse);
3554 $dtts->setTimezone($tzo);
3555 $month = (int) $dtts->format(
"m");
3556 $month = sprintf(
"%02d", $month);
3557 if ($encodetooutput) {
3558 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3559 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3561 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3562 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3565 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3566 $ret = str_replace(
'__B__', $monthtext, $ret);
3570 if (preg_match(
'/__a__/i', $format)) {
3572 $timetouse = $time + $offsettz + $offsetdst;
3575 $tzo =
new DateTimeZone(
'UTC');
3577 $tzo =
new DateTimeZone(date_default_timezone_get());
3579 $dtts =
new DateTime();
3580 $dtts->setTimestamp($timetouse);
3581 $dtts->setTimezone($tzo);
3582 $w = $dtts->format(
"w");
3583 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3585 $ret = str_replace(
'__A__', $dayweek, $ret);
3586 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3613function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3615 if ($timestamp ===
'') {
3619 $datetimeobj =
new DateTime();
3620 $datetimeobj->setTimestamp($timestamp);
3621 if ($forcetimezone) {
3622 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3625 'year' => ((
int) date_format($datetimeobj,
'Y')),
3626 'mon' => ((
int) date_format($datetimeobj,
'm')),
3627 'mday' => ((
int) date_format($datetimeobj,
'd')),
3628 'wday' => ((
int) date_format($datetimeobj,
'w')),
3629 'yday' => ((
int) date_format($datetimeobj,
'z')),
3630 'hours' => ((
int) date_format($datetimeobj,
'H')),
3631 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3632 'seconds' => ((
int) date_format($datetimeobj,
's')),
3660function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3665 if ($gm ===
'auto') {
3666 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
3671 if ($hour == -1 || empty($hour)) {
3674 if ($minute == -1 || empty($minute)) {
3677 if ($second == -1 || empty($second)) {
3683 if (!$month || !$day) {
3692 if ($hour < 0 || $hour > 24) {
3695 if ($minute < 0 || $minute > 60) {
3698 if ($second < 0 || $second > 60) {
3703 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3704 $default_timezone = @date_default_timezone_get();
3705 $localtz =
new DateTimeZone($default_timezone);
3706 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3708 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3710 $localtz =
new DateTimeZone($default_timezone);
3712 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3713 $default_timezone = @date_default_timezone_get();
3715 } elseif (strrpos($gm,
"tz,") !==
false) {
3716 $timezone = str_replace(
"tz,",
"", $gm);
3718 $localtz =
new DateTimeZone($timezone);
3720 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3724 if (empty($localtz)) {
3725 $localtz =
new DateTimeZone(
'UTC');
3729 $dt =
new DateTime(
'now', $localtz);
3730 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3731 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3732 $date = $dt->getTimestamp();
3748function dol_now($mode =
'auto')
3752 if ($mode ===
'auto') {
3756 if ($mode ==
'gmt') {
3758 } elseif ($mode ==
'tzserver') {
3759 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3761 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3767 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3770 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3771 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3772 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3789 global
$conf, $langs;
3792 if (!empty(
$conf->dol_optimize_smallscreen)) {
3797 if (empty($shortvalue) || $size < ($level * 10)) {
3799 $textunitshort = $langs->trans(
"b");
3800 $textunitlong = $langs->trans(
"Bytes");
3802 $ret = round($size / $level, 0);
3803 $textunitshort = $langs->trans(
"Kb");
3804 $textunitlong = $langs->trans(
"KiloBytes");
3807 if (empty($shortunit)) {
3808 $ret .=
' '.$textunitlong;
3810 $ret .=
' '.$textunitshort;
3826function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3834 $linkstart =
'<a href="';
3835 if (!preg_match(
'/^http/i', $url)) {
3836 $linkstart .=
'http://';
3841 $linkstart .=
' target="'.$target.
'"';
3843 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3847 if (!preg_match(
'/^http/i', $url)) {
3854 if ($morecss ==
'float') {
3855 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3857 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3874function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0, $morecss =
'paddingrightonly')
3876 global $user, $langs, $hookmanager;
3887 if (empty($email)) {
3891 if ($addlink == 1) {
3892 $newemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="';
3893 if (!preg_match(
'/^mailto:/i', $email)) {
3894 $newemail .=
'mailto:';
3896 $newemail .= $email;
3897 $newemail .=
'" target="_blank">';
3899 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3904 $newemail .= $email;
3906 $newemail .=
'</a>';
3908 $langs->load(
"errors");
3909 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3912 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3914 $linktoaddaction =
'';
3916 $linktoaddaction =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage=1&actioncode='.urlencode($type).
'&contactid='.((int) $cid).
'&socid='.((int) $socid).
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
3918 if ($linktoaddaction) {
3919 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3922 } elseif ($addlink ===
'thirdparty') {
3923 $tmpnewemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="'.DOL_URL_ROOT.
'/societe/card.php?socid='.$socid.
'&action=presend&mode=init#formmailbeforetitle">';
3924 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3925 if ($withpicto == 1) {
3926 $tmpnewemail .= $newemail;
3928 $tmpnewemail .=
'</a>';
3930 $newemail = $tmpnewemail;
3932 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3935 $langs->load(
"errors");
3936 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3946 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3948 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3952 $rep .= $hookmanager->resPrint;
3967 $socialnetworks = array();
3969 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3970 $cachekey =
'socialnetworks_' .
$conf->entity;
3972 if (!is_null($dataretrieved)) {
3973 $socialnetworks = $dataretrieved;
3975 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3976 $sql .=
" WHERE entity=".$conf->entity;
3977 $resql = $db->query($sql);
3979 while ($obj = $db->fetch_object($resql)) {
3980 $socialnetworks[$obj->code] = array(
3981 'rowid' => $obj->rowid,
3982 'label' => $obj->label,
3984 'icon' => $obj->icon,
3985 'active' => $obj->active,
3991 return $socialnetworks;
4006 global $hookmanager, $langs, $user;
4010 if (empty($value)) {
4014 if (!empty($type)) {
4015 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4017 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
4018 if ($type ==
'skype') {
4020 $htmllink .=
' <a href="skype:';
4022 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
4023 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
4024 $htmllink .=
'</a><a href="skype:';
4026 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
4027 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
4028 $htmllink .=
'</a>';
4029 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4030 $addlink =
'AC_SKYPE';
4033 $link =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage=1&actioncode='.$addlink.
'&contactid='.$cid.
'&socid='.$socid.
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
4035 $htmllink .= ($link ?
' '.$link :
'');
4038 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
4041 if (preg_match(
'/^https?:\/\//i', $link)) {
4042 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4044 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4046 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
4047 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4048 if ($tmpvirginurl) {
4049 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
4050 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
4052 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4053 if ($tmpvirginurl3) {
4054 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
4055 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
4058 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4059 if ($tmpvirginurl2) {
4060 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
4061 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
4064 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4065 if (preg_match(
'/^https?:\/\//i', $link)) {
4066 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4068 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4074 $htmllink .=
'</div>';
4076 $langs->load(
"errors");
4077 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4081 $parameters = array(
4086 'dictsocialnetworks' => $dictsocialnetworks,
4089 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4093 $htmllink .= $hookmanager->resPrint;
4108function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4112 if (empty($profID) || empty($profIDtype)) {
4115 if (empty($countrycode)) {
4116 $countrycode = $mysoc->country_code;
4118 $newProfID = $profID;
4119 $id = substr($profIDtype, -1);
4121 if (strtoupper($countrycode) ==
'FR') {
4127 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
4131 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
4135 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
4137 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4139 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
4142 if (!empty($addcpButton)) {
4165function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4167 global
$conf, $user, $langs, $mysoc, $hookmanager;
4170 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4171 if (empty($phone)) {
4177 if (empty($countrycode) && is_object($mysoc)) {
4178 $countrycode = $mysoc->country_code;
4182 if (!empty(
$conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4187 $newphonewa = $phone;
4188 if (strtoupper($countrycode) ==
"FR") {
4191 $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);
4193 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4195 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4197 $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);
4199 $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);
4201 $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);
4203 } elseif (strtoupper($countrycode) ==
"CA") {
4205 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4207 } elseif (strtoupper($countrycode) ==
"PT") {
4209 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4211 } elseif (strtoupper($countrycode) ==
"SR") {
4213 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4215 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4217 } elseif (strtoupper($countrycode) ==
"DE") {
4219 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4221 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4223 } elseif (strtoupper($countrycode) ==
"ES") {
4225 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4227 } elseif (strtoupper($countrycode) ==
"BF") {
4229 $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);
4231 } elseif (strtoupper($countrycode) ==
"RO") {
4233 $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);
4235 } elseif (strtoupper($countrycode) ==
"TR") {
4237 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4239 } elseif (strtoupper($countrycode) ==
"US") {
4241 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4243 } elseif (strtoupper($countrycode) ==
"MX") {
4245 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4247 $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);
4249 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4251 } elseif (strtoupper($countrycode) ==
"ML") {
4253 $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);
4255 } elseif (strtoupper($countrycode) ==
"TH") {
4257 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4259 $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);
4261 } elseif (strtoupper($countrycode) ==
"MU") {
4264 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4266 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4268 } elseif (strtoupper($countrycode) ==
"ZA") {
4270 $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);
4272 } elseif (strtoupper($countrycode) ==
"SY") {
4274 $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);
4276 $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);
4278 } elseif (strtoupper($countrycode) ==
"AE") {
4280 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4282 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4284 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4286 } elseif (strtoupper($countrycode) ==
"DZ") {
4288 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4290 } elseif (strtoupper($countrycode) ==
"BE") {
4292 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4294 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4296 } elseif (strtoupper($countrycode) ==
"PF") {
4298 $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);
4300 } elseif (strtoupper($countrycode) ==
"CO") {
4302 $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);
4304 } elseif (strtoupper($countrycode) ==
"JO") {
4306 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 1).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4308 } elseif (strtoupper($countrycode) ==
"JM") {
4310 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4312 } elseif (strtoupper($countrycode) ==
"MG") {
4314 $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);
4316 } elseif (strtoupper($countrycode) ==
"GB") {
4318 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4320 } elseif (strtoupper($countrycode) ==
"CH") {
4322 $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);
4324 $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);
4326 } elseif (strtoupper($countrycode) ==
"TN") {
4328 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4330 } elseif (strtoupper($countrycode) ==
"GF") {
4332 $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);
4334 } elseif (strtoupper($countrycode) ==
"GP") {
4336 $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);
4338 } elseif (strtoupper($countrycode) ==
"MQ") {
4340 $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);
4342 } elseif (strtoupper($countrycode) ==
"IT") {
4344 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4346 $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);
4348 } elseif (strtoupper($countrycode) ==
"AU") {
4352 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4354 } elseif (strtoupper($countrycode) ==
"LU") {
4357 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4359 $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);
4361 $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);
4363 $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);
4365 } elseif (strtoupper($countrycode) ==
"PE") {
4368 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4370 $newphonewa =
'+51'.$newphone;
4371 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4373 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4375 $newphonewa = $newphone;
4376 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3).$separ.substr($newphone, 14, 3);
4380 $newphoneastart = $newphoneaend =
'';
4381 if (!empty($addlink)) {
4382 if ($addlink ==
'tel' ||
$conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4383 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4384 $newphoneaend .=
'</a>';
4385 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4386 if (empty($user->clicktodial_loaded)) {
4387 $user->fetch_clicktodial();
4391 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4392 if (!empty($user->clicktodial_url)) {
4393 $urlmask = $user->clicktodial_url;
4396 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4397 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4398 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4400 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4402 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4403 '__PHONETO__' => urlencode($phone),
4404 '__LOGIN__' => $clicktodial_login,
4405 '__PASS__' => $clicktodial_password);
4409 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4410 $newphoneaend =
'</a>';
4413 $newphoneastart =
'<a href="'.$url.
'"';
4415 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4417 $newphoneastart .=
'>';
4418 $newphoneaend .=
'</a>';
4423 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4425 $addlinktoagenda =
'';
4426 if ($addlink ==
'AC_FAX') {
4430 $addlinktoagenda =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage='. urlencode($_SERVER[
'REQUEST_URI']) .
'&actioncode='.$type.($cid ?
'&contactid='.$cid :
'').($socid ?
'&socid='.$socid :
'').
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
4432 if ($addlinktoagenda) {
4433 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4438 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4440 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4441 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4444 if (empty($titlealt)) {
4445 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4450 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4451 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4452 $rep .= $hookmanager->resPrint;
4454 if (empty($reshook)) {
4457 if ($withpicto ==
'fax') {
4458 $picto =
'phoning_fax';
4459 } elseif ($withpicto ==
'phone') {
4461 } elseif ($withpicto ==
'mobile') {
4462 $picto =
'phoning_mobile';
4467 if ($adddivfloat == 1) {
4468 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'">';
4469 } elseif (empty($adddivfloat)) {
4470 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
'>';
4473 $rep .= $newphoneastart;
4474 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4475 if ($separ !=
'hidenum') {
4476 $rep .= ($withpicto ?
' ' :
'').$newphone;
4478 $rep .= $newphoneaend;
4480 if ($adddivfloat == 1) {
4482 } elseif (empty($adddivfloat)) {
4510 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4511 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
4513 $ret .=
' ('.$countrycode.
')';
4533 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4534 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4535 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4536 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4538 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4541 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
4544 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
4560 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4562 } elseif (!empty($_SERVER[
'HTTP_X_FORWARDED_PROTO']) && $_SERVER[
'HTTP_X_FORWARDED_PROTO'] ==
'https' || !empty($_SERVER[
'HTTP_X_FORWARDED_SSL']) && $_SERVER[
'HTTP_X_FORWARDED_SSL'] ==
'on') {
4580 if (isModEnabled(
'geoipmaxmind')) {
4584 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4585 $geoip =
new DolGeoIP(
'country', $datafile);
4587 $countrycode = $geoip->getCountryCodeFromIP($ip);
4590 return $countrycode;
4602 global
$conf, $langs, $user;
4606 if (isModEnabled(
'geoipmaxmind')) {
4611 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4612 $geoip =
new DolGeoIP(
'country', $datafile);
4613 $countrycode = $geoip->getCountryCodeFromIP($ip);
4614 $ret = $countrycode;
4633 global
$conf, $user, $langs, $hookmanager;
4639 $parameters = array(
'element' => $element,
'id' =>
$id);
4640 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4641 $out .= $hookmanager->resPrint;
4643 if (empty($reshook)) {
4644 if (empty($charfornl)) {
4645 $out .= nl2br($address);
4647 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4651 $showgmap = $showomap = 0;
4652 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4655 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4658 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4661 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4664 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4667 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4670 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4673 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4678 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4681 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.
$id, 1);
4682 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4704function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4706 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4709 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4712 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4730 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4731 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4734 if (function_exists(
'getmxrr')) {
4737 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4738 if (count($mxhosts) > 1) {
4741 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
4778 $tmparray = explode(
' ', $s);
4779 foreach ($tmparray as $tmps) {
4794function dol_strlen($string, $stringencoding =
'UTF-8')
4796 if (is_null($string)) {
4800 if (function_exists(
'mb_strlen')) {
4801 return mb_strlen($string, $stringencoding);
4803 return strlen($string);
4817function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4821 if (empty($stringencoding)) {
4822 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
4826 if (empty($trunconbytes)) {
4827 if (function_exists(
'mb_substr')) {
4828 $ret = mb_substr($string, $start, $length, $stringencoding);
4830 $ret = substr($string, $start, $length);
4833 if (function_exists(
'mb_strcut')) {
4834 $ret = mb_strcut($string, $start, $length, $stringencoding);
4836 $ret = substr($string, $start, $length);
4856function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4864 if (empty($stringencoding)) {
4865 $stringencoding =
'UTF-8';
4868 if (!empty(
$conf->dol_optimize_smallscreen) &&
$conf->dol_optimize_smallscreen == 1 && $display == 1) {
4869 $size = round($size / 3);
4873 if ($trunc ==
'right') {
4875 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4877 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4882 } elseif ($trunc ==
'middle') {
4884 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4885 $size1 = (int) round($size / 2);
4886 $size2 = (int) round($size / 2);
4887 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4891 } elseif ($trunc ==
'left') {
4893 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4895 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4899 } elseif ($trunc ==
'wrap') {
4901 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4907 return 'BadParam3CallingDolTrunc';
4921 $type2picto = array(
4922 'varchar' =>
'font',
4925 'int' =>
'sort-numeric-down',
4926 'double' =>
'sort-numeric-down',
4927 'price' =>
'currency',
4928 'pricecy' =>
'multicurrency',
4929 'password' =>
'key',
4930 'boolean' =>
'check-square',
4931 'date' =>
'calendar',
4932 'datetime' =>
'calendar',
4933 'duration' =>
'hourglass',
4939 'sellist' =>
'list',
4940 'stars' =>
'fontawesome_star_fas',
4941 'radio' =>
'check-circle',
4942 'checkbox' =>
'list',
4943 'chkbxlst' =>
'list',
4945 'icon' =>
"question",
4946 'point' =>
"country",
4947 'multipts' =>
'country',
4948 'linestrg' =>
"country",
4949 'polygon' =>
"country",
4950 'separate' =>
'minus'
4953 if (!empty($type2picto[$key])) {
4954 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4957 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4982function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4987 $url = DOL_URL_ROOT;
4988 $theme = isset(
$conf->theme) ?
$conf->theme :
null;
4989 $path =
'theme/'.$theme;
4990 if (empty($picto)) {
4995 if ($pictoisfullpath) {
4997 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5000 $fullpathpicto = $picto;
5002 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5003 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5004 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5009 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5010 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5011 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5014 $pictoconvertkey = array(
'facture' =>
'bill',
'shipping' =>
'shipment',
'fichinter' =>
'intervention',
'agenda' =>
'calendar',
'invoice_supplier' =>
'supplier_invoice',
'order_supplier' =>
'supplier_order');
5015 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5016 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5019 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5021 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5022 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5025 if ($pictowithouttext ==
'file-o') {
5026 $pictowithouttext =
'file';
5029 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5030 $marginleftonlyshort = 0;
5032 if (!empty($pictowithouttextarray[1])) {
5034 $fakey =
'fa-'.$pictowithouttextarray[0];
5035 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5036 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5037 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5039 $fakey =
'fa-'.$pictowithouttext;
5049 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5050 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5051 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5053 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5054 $morestyle = $reg[1];
5055 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5057 $moreatt = trim($moreatt);
5059 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5060 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5064 $enabledisablehtml .=
'</span>';
5066 return $enabledisablehtml;
5069 if (empty($srconly) && in_array($pictowithouttext, array(
5070 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
5071 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
5072 'back',
'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
5073 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
'hourglass',
5074 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
5075 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
5076 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
5077 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
5078 'commercial',
'companies',
5079 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
5080 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
5081 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
5082 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
5083 'hands-helping',
'help',
'holiday',
5084 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
5085 'key',
'knowledgemanagement',
5086 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
5087 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
5088 'off',
'on',
'order',
5089 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
5090 'stock',
'resize',
'service',
'stats',
5091 'security',
'setup',
'share-alt',
'sign-out',
'split',
'stripe',
'stripe-s',
'switch_off',
'switch_on',
'switch_on_grey',
'switch_on_warning',
'switch_on_red',
'tools',
'unlink',
'uparrow',
'user',
'user-tie',
'vcard',
'wrench',
5092 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
5093 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
5094 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
5095 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
5096 'technic',
'ticket',
5098 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
5099 'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
5100 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
5101 'uncheck',
'undo',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
5102 'conferenceorbooth',
'eventorganization',
5103 'stamp',
'signature',
5106 $fakey = $pictowithouttext;
5110 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'))) {
5113 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
5117 $arrayconvpictotofa = array(
5118 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
5119 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
5120 'back' =>
'arrow-left',
'bank_account' =>
'university',
5121 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
5122 'bookcal' =>
'calendar-check',
5123 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
5125 'card' =>
'address-card',
'chart' =>
'chart-line',
'company' =>
'building',
'contact' =>
'address-book',
'contract' =>
'suitcase',
'collab' =>
'people-arrows',
'conversation' =>
'comments',
'country' =>
'globe-americas',
'cron' =>
'business-time',
'cross' =>
'times',
5126 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
5127 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
5128 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
5129 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
5130 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
5131 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
5132 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
5133 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
5134 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
5135 'info' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
5136 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
5137 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
5138 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
5139 'sign-out' =>
'sign-out-alt',
5140 'switch_off' =>
'toggle-off',
'switch_on' =>
'toggle-on',
'switch_on_grey' =>
'toggle-on',
'switch_on_warning' =>
'toggle-on',
'switch_on_red' =>
'toggle-on',
'check' =>
'check',
'bookmark' =>
'star',
5141 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
5142 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
5143 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
5144 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
5145 'other' =>
'square',
5146 'playdisabled' =>
'play',
'pdf' =>
'file-pdf',
'poll' =>
'check-double',
'pos' =>
'cash-register',
'preview' =>
'binoculars',
'project' =>
'project-diagram',
'projectpub' =>
'project-diagram',
'projecttask' =>
'tasks',
'propal' =>
'file-signature',
'proposal' =>
'file-signature',
5147 'partnership' =>
'handshake',
'payment' =>
'money-check-alt',
'payment_vat' =>
'money-check-alt',
'pictoconfirm' =>
'check-square',
'phoning' =>
'phone',
'phoning_mobile' =>
'mobile-alt',
'phoning_fax' =>
'fax',
'previous' =>
'arrow-alt-circle-left',
'printer' =>
'print',
'product' =>
'cube',
'puce' =>
'angle-right',
5148 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
5149 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
5150 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
5151 'service' =>
'concierge-bell',
5152 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
5153 'status' =>
'stop-circle',
5154 'stripe' =>
'stripe-s',
'supplier' =>
'building',
5155 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
5156 'title_agenda' =>
'calendar-alt',
5157 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
5158 'jabber' =>
'comment-o',
5159 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
5160 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
5161 'webportal' =>
'door-open'
5163 if (
$conf->currency ==
'EUR') {
5164 $arrayconvpictotofa[
'currency'] =
'euro-sign';
5165 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
5167 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
5168 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
5170 if ($pictowithouttext ==
'off') {
5171 $fakey =
'fa-square';
5173 } elseif ($pictowithouttext ==
'on') {
5174 $fakey =
'fa-check-square';
5176 } elseif ($pictowithouttext ==
'listlight') {
5177 $fakey =
'fa-download';
5178 $marginleftonlyshort = 1;
5179 } elseif ($pictowithouttext ==
'printer') {
5180 $fakey =
'fa-print';
5182 } elseif ($pictowithouttext ==
'note') {
5183 $fakey =
'fa-sticky-note';
5184 $marginleftonlyshort = 1;
5185 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5186 $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');
5187 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5188 if (preg_match(
'/selected/', $pictowithouttext)) {
5191 $marginleftonlyshort = 1;
5192 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5193 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5195 $fakey =
'fa-'.$pictowithouttext;
5198 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5199 $morecss .=
' em092';
5201 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
5202 $morecss .=
' em088';
5204 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5205 $morecss .=
' em080';
5209 $arrayconvpictotomarginleftonly = array(
5210 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5211 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_grey',
'switch_on_red',
'switch_off',
5212 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5214 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5215 $marginleftonlyshort = 0;
5219 $arrayconvpictotomorcess = array(
5220 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5221 'bank_account' =>
'infobox-bank_account',
5222 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5223 'bookcal' =>
'infobox-action',
5224 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5225 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5226 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5227 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5228 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5229 'incoterm' =>
'infobox-supplier_proposal',
5230 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5231 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5232 'order' =>
'infobox-commande',
5233 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5234 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5235 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'invoice' =>
'infobox-commande',
5236 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5237 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5238 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5239 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5240 'resource' =>
'infobox-action',
5241 'salary' =>
'infobox-bank_account',
'shapes' =>
'infobox-adherent',
'shipment' =>
'infobox-commande',
'stripe' =>
'infobox-bank_account',
'supplier_invoice' =>
'infobox-order_supplier',
'supplier_invoicea' =>
'infobox-order_supplier',
'supplier_invoiced' =>
'infobox-order_supplier',
5242 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5243 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5244 'vat' =>
'infobox-bank_account',
5246 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode'
5248 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5249 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5253 $arrayconvpictotocolor = array(
5254 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5255 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5256 'dynamicprice' =>
'#a69944',
5257 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5259 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5260 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5261 'other' =>
'#ddd',
'world' =>
'#986c6a',
5262 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5264 'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5265 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5266 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5267 'website' =>
'#304',
'workstation' =>
'#a69944'
5269 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5270 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5277 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5278 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5279 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5281 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5282 $morestyle = $reg[1];
5283 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5285 $moreatt = trim($moreatt);
5287 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5288 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5292 $enabledisablehtml .=
'</span>';
5294 return $enabledisablehtml;
5301 } elseif (!empty(
$conf->modules_parts[
'theme']) && array_key_exists($theme,
$conf->modules_parts[
'theme'])) {
5302 $path = $theme.
'/theme/'.$theme;
5307 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5313 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5318 foreach (
$conf->file->dol_document_root as $type => $dirroot) {
5319 if ($type ==
'main') {
5323 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5324 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5330 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5334 return $fullpathpicto;
5338 return '<img src="'.$fullpathpicto.
'"'.($notitle ?
'' :
' alt="'.dol_escape_htmltag($alt).
'"').(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt.($morecss ?
' class="'.$morecss.
'"' :
'') :
' class="inline-block'.($morecss ?
' '.$morecss :
'').
'"').
'>';
5354function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0)
5356 if (strpos($picto,
'^') === 0) {
5357 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
5359 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
5374function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5378 if (is_numeric($picto)) {
5381 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5382 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5386 $path = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/weather/'.$picto;
5388 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5402function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5406 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5410 if ($pictoisfullpath) {
5413 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5416 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.
$conf->theme.
'/img/'.$picto;
5418 if (file_exists($themepath)) {
5424 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5440function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5444 if (empty($titlealt) || $titlealt ==
'default') {
5445 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5447 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5448 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5450 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5451 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5453 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5454 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5456 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5457 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5459 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5461 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5465 if (!is_numeric($numaction)) {
5469 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5479function img_pdf($titlealt =
'default', $size = 3)
5483 if ($titlealt ==
'default') {
5484 $titlealt = $langs->trans(
'Show');
5487 return img_picto($titlealt,
'pdf'.$size.
'.png');
5497function img_edit_add($titlealt =
'default', $other =
'')
5501 if ($titlealt ==
'default') {
5502 $titlealt = $langs->trans(
'Add');
5505 return img_picto($titlealt,
'edit_add.png', $other);
5518 if ($titlealt ==
'default') {
5519 $titlealt = $langs->trans(
'Remove');
5522 return img_picto($titlealt,
'edit_remove.png', $other);
5533function img_edit($titlealt =
'default', $float = 0, $other =
'')
5537 if ($titlealt ==
'default') {
5538 $titlealt = $langs->trans(
'Modify');
5541 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5552function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5556 if ($titlealt ==
'default') {
5557 $titlealt = $langs->trans(
'View');
5560 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5562 return img_picto($titlealt,
'eye', $moreatt);
5573function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5577 if ($titlealt ==
'default') {
5578 $titlealt = $langs->trans(
'Delete');
5581 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5591function img_printer($titlealt =
"default", $other =
'')
5594 if ($titlealt ==
"default") {
5595 $titlealt = $langs->trans(
"Print");
5597 return img_picto($titlealt,
'printer.png', $other);
5607function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5611 if ($titlealt ==
'default') {
5612 $titlealt = $langs->trans(
'Split');
5615 return img_picto($titlealt,
'split.png', $other);
5625function img_help($usehelpcursor = 1, $usealttitle = 1)
5630 if (is_string($usealttitle)) {
5633 $usealttitle = $langs->trans(
'Info');
5637 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5646function img_info($titlealt =
'default')
5650 if ($titlealt ==
'default') {
5651 $titlealt = $langs->trans(
'Informations');
5654 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5665function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5669 if ($titlealt ==
'default') {
5670 $titlealt = $langs->trans(
'Warning');
5674 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5683function img_error($titlealt =
'default')
5687 if ($titlealt ==
'default') {
5688 $titlealt = $langs->trans(
'Error');
5691 return img_picto($titlealt,
'error.png');
5701function img_next($titlealt =
'default', $moreatt =
'')
5705 if ($titlealt ==
'default') {
5706 $titlealt = $langs->trans(
'Next');
5710 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5720function img_previous($titlealt =
'default', $moreatt =
'')
5724 if ($titlealt ==
'default') {
5725 $titlealt = $langs->trans(
'Previous');
5729 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5740function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5744 if ($titlealt ==
'default') {
5745 $titlealt = $langs->trans(
'Down');
5748 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5759function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5763 if ($titlealt ==
'default') {
5764 $titlealt = $langs->trans(
'Up');
5767 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5778function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5782 if ($titlealt ==
'default') {
5783 $titlealt = $langs->trans(
'Left');
5786 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5797function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5801 if ($titlealt ==
'default') {
5802 $titlealt = $langs->trans(
'Right');
5805 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5815function img_allow($allow, $titlealt =
'default')
5819 if ($titlealt ==
'default') {
5820 $titlealt = $langs->trans(
'Active');
5824 return img_picto($titlealt,
'tick.png');
5839 if (is_null($morecss)) {
5843 if ($brand ==
'visa' || $brand ==
'Visa') {
5845 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5846 $brand =
'cc-mastercard';
5847 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5849 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5850 $brand =
'cc-discover';
5851 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5853 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5854 $brand =
'cc-diners-club';
5855 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5856 $brand =
'credit-card';
5859 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5870function img_mime($file, $titlealt =
'', $morecss =
'')
5872 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5878 if (empty($titlealt)) {
5879 $titlealt =
'Mime type: '.$mimetype;
5883 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5894function img_search($titlealt =
'default', $other =
'')
5898 if ($titlealt ==
'default') {
5899 $titlealt = $langs->trans(
'Search');
5902 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
5904 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5905 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5921 if ($titlealt ==
'default') {
5922 $titlealt = $langs->trans(
'Search');
5925 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
5927 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5928 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5945function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
5947 global
$conf, $langs;
5949 if ($infoonimgalt) {
5950 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5952 if (empty(
$conf->use_javascript_ajax)) {
5953 $textfordropdown =
'';
5956 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5957 $fa =
'info-circle';
5958 if ($picto ==
'warning') {
5959 $fa =
'exclamation-triangle';
5961 $result = ($nodiv ?
'' :
'<div class="wordbreak '.$class.($morecss ?
' '.$morecss :
'').($textfordropdown ?
' hidden' :
'').
'">').
'<span class="fa fa-'.$fa.
'" title="'.
dol_escape_htmltag($admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note')).
'"></span> ';
5963 $result .= ($nodiv ?
'' :
'</div>');
5965 if ($textfordropdown) {
5966 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5967 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5968 jQuery(document).ready(function() {
5969 jQuery(".'.$class.
'text").click(function() {
5970 console.log("toggle text");
5971 jQuery(".'.$class.
'").toggle();
5976 $result = $tmpresult.$result;
5997 global
$conf, $langs, $user, $argv;
5998 global $dolibarr_main_prod;
6005 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
6007 $langs->load(
"main");
6011 $langs->loadLangs(array(
'main',
'errors'));
6013 if ($_SERVER[
'DOCUMENT_ROOT']) {
6014 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
6016 $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";
6018 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
6020 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
6021 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
6022 if (isset(
$conf->global->MAIN_FEATURES_LEVEL)) {
6023 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
6025 if ($user instanceof
User) {
6026 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
6028 if (function_exists(
"phpversion")) {
6029 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
6031 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
6032 if (function_exists(
"php_uname")) {
6033 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
6035 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
6037 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
6038 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
6039 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset(
$conf->standard_menu) ?
dol_htmlentities(
$conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
6041 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
6042 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
6044 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
6045 $syslog .=
"pid=".dol_getmypid();
6048 if (!empty(
$conf->modules)) {
6049 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ',
$conf->modules).
"<br>\n";
6052 if (is_object($db)) {
6053 if ($_SERVER[
'DOCUMENT_ROOT']) {
6054 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
6055 $lastqueryerror = $db->lastqueryerror();
6057 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6059 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6060 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6061 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6065 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
6066 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6067 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6068 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6070 $syslog .=
", sql=".$db->lastquery();
6071 $syslog .=
", db_error=".$db->lasterror();
6074 if ($error || $errors) {
6076 if (is_array($error) && is_array($errors)) {
6077 $errors = array_merge($error, $errors);
6078 } elseif (is_array($error)) {
6080 } elseif (is_array($errors) && !empty($error)) {
6081 $errors = array_merge(array($error), $errors);
6082 } elseif (!empty($error)) {
6083 $errors = array_merge(array($error), array($errors));
6086 $langs->load(
"errors");
6088 foreach ($errors as $msg) {
6092 if ($_SERVER[
'DOCUMENT_ROOT']) {
6095 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
6097 $syslog .=
", msg=".$msg;
6100 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
6101 xdebug_print_function_stack();
6102 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
6103 $out .=
'File: '.xdebug_call_file().
"<br>\n";
6104 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
6105 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
6110 if (!headers_sent()) {
6111 if (function_exists(
'top_httphead')) {
6115 http_response_code(202);
6118 if (empty($dolibarr_main_prod)) {
6121 if (empty($langs->defaultlang)) {
6122 $langs->setDefaultLang();
6124 $langs->loadLangs(array(
"main",
"errors"));
6126 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";
6127 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
6128 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6129 if (!defined(
"MAIN_CORE_ERROR")) {
6130 define(
"MAIN_CORE_ERROR", 1);
6147function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6151 if (empty($email)) {
6155 $langs->load(
"errors");
6158 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
6159 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
6160 if ($errormessage) {
6161 print
'<br><br>'.$errormessage;
6163 if (is_array($errormessages) && count($errormessages)) {
6164 foreach ($errormessages as $mesgtoshow) {
6165 print
'<br><br>'.$mesgtoshow;
6168 print
'</div></div>';
6187function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6189 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6210function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6212 global $langs, $form;
6215 if ($moreattrib ==
'class="right"') {
6216 $prefix .=
'right ';
6219 $sortorder = strtoupper($sortorder);
6228 $tmpsortfield = explode(
',', $sortfield);
6229 $sortfield1 = trim($tmpsortfield[0]);
6230 $tmpfield = explode(
',', $field);
6231 $field1 = trim($tmpfield[0]);
6233 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6234 $prefix =
'wrapcolumntitle '.$prefix;
6240 $liste_titre =
'liste_titre';
6241 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6242 $liste_titre =
'liste_titre_sel';
6245 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6250 if (empty($thead) && $field && empty($disablesortlink)) {
6251 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6252 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6253 $options = preg_replace(
'/&+/i',
'&', $options);
6254 if (!preg_match(
'/^&/', $options)) {
6255 $options =
'&'.$options;
6258 $sortordertouseinlink =
'';
6259 if ($field1 != $sortfield1) {
6260 if (preg_match(
'/^DESC/i', $sortorder)) {
6261 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6263 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6266 if (preg_match(
'/^ASC/i', $sortorder)) {
6267 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6269 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6272 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6273 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
6279 if (preg_match(
'/:\w+$/', $tooltip)) {
6280 $tmptooltip = explode(
':', $tooltip);
6282 $tmptooltip = array($tooltip);
6284 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6286 $out .= $langs->trans($name);
6289 if (empty($thead) && $field && empty($disablesortlink)) {
6293 if (empty($thead) && $field) {
6294 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6295 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6296 $options = preg_replace(
'/&+/i',
'&', $options);
6297 if (!preg_match(
'/^&/', $options)) {
6298 $options =
'&'.$options;
6301 if (!$sortorder || ($field1 != $sortfield1)) {
6305 if (preg_match(
'/^DESC/', $sortorder)) {
6308 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6310 if (preg_match(
'/^ASC/', $sortorder)) {
6313 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6318 $tagend =
'</'.$tag.
'>';
6320 $out = $tagstart.$sortimg.$out.$tagend;
6335 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6337 print
'<div class="titre">'.$title.
'</div>';
6351function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
6369function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6373 if ($picto ==
'setup') {
6378 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6379 $return .=
'<tr class="toptitle">';
6381 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6383 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6384 $return .=
'<div class="titre inline-block">';
6385 $return .=
'<span class="inline-block valignmiddle">'.$title.
'</span>';
6386 $return .=
'</div>';
6389 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6392 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6394 $return .=
'</tr></table>'.
"\n";
6422function 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 =
'')
6424 global
$conf, $langs;
6427 $savtotalnboflines = $totalnboflines;
6428 if (is_numeric($totalnboflines)) {
6429 $totalnboflines = abs($totalnboflines);
6434 $tmparray = preg_split(
'/<br>/i', $title, 2);
6435 if (!empty($tmparray[1])) {
6436 $title = $tmparray[0];
6437 $subtitle = $tmparray[1];
6440 $page = (int) $page;
6442 if ($picto ==
'setup') {
6443 $picto =
'title_setup.png';
6445 if ((
$conf->browser->name ==
'ie') && $picto ==
'generic') {
6446 $picto =
'title.gif';
6449 $limit =
$conf->liste_limit;
6452 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6460 print
"<!-- Begin print_barre_liste -->\n";
6461 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'">';
6462 print
'<tr class="toptitle">';
6466 if ($picto && $title) {
6467 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
6468 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
6472 print
'<td class="nobordernopadding valignmiddle col-title">';
6473 print
'<div class="titre inline-block">';
6474 print
'<span class="inline-block valignmiddle print-barre-liste">'.$title.
'</span>';
6475 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'' && $totalnboflines > 0) {
6476 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="'.$langs->trans(
"NbRecordQualified").
'">('.$totalnboflines.
')</span>';
6479 if (!empty($subtitle)) {
6480 print
'<br><div class="subtitle inline-block hideonsmartphone">'.$subtitle.
'</div>';
6485 if ($morehtmlcenter && empty(
$conf->dol_optimize_smallscreen)) {
6486 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6490 print
'<td class="nobordernopadding valignmiddle right col-right">';
6491 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6493 $options .=
"&sortfield=".urlencode($sortfield);
6496 $options .=
"&sortorder=".urlencode($sortorder);
6500 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6501 if ($totalnboflines) {
6503 $maxnbofpage = (empty(
$conf->dol_optimize_smallscreen) ? 4 : 0);
6506 $nbpages = ceil($totalnboflines / $limit);
6510 $cpt = ($page - $maxnbofpage);
6516 if (empty($pagenavastextinput)) {
6517 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6519 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6520 } elseif ($cpt == 2) {
6521 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6527 if ($pagenavastextinput) {
6528 if ($cpt == $page) {
6529 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
6533 if ($cpt == $page) {
6534 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6536 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6540 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6542 if (empty($pagenavastextinput)) {
6543 if ($cpt < $nbpages) {
6544 if ($cpt < $nbpages - 2) {
6545 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6546 } elseif ($cpt == $nbpages - 2) {
6547 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6549 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6553 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6556 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6560 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6561 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
6565 if ($pagenavastextinput) {
6572 print
'</table>'.
"\n";
6575 if ($morehtmlcenter && !empty(
$conf->dol_optimize_smallscreen)) {
6576 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6579 print
"<!-- End title -->\n\n";
6598function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
6600 global
$conf, $langs;
6602 print
'<div class="pagination"><ul>';
6603 if ($beforearrows) {
6604 print
'<li class="paginationbeforearrows">';
6605 print $beforearrows;
6609 if (empty($hidenavigation)) {
6610 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
6611 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6612 $pagesizechoices .=
',5000:5000';
6622 print
'<li class="pagination">';
6623 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.
'">';
6624 print
'<datalist id="limitlist">';
6626 print
'<li class="paginationcombolimit valignmiddle">';
6627 print
'<select id="limit'.(is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix).
'" name="limit" class="flat selectlimit nopadding maxwidth75 center'.(is_numeric($selectlimitsuffix) ?
'' :
' '.$selectlimitsuffix).
'" title="'.
dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
6629 $tmpchoice = explode(
',', $pagesizechoices);
6630 $tmpkey = $limit.
':'.$limit;
6631 if (!in_array($tmpkey, $tmpchoice)) {
6632 $tmpchoice[$tmpkey] = $tmpkey;
6634 $tmpkey =
$conf->liste_limit.
':'.
$conf->liste_limit;
6635 if (!in_array($tmpkey, $tmpchoice)) {
6636 $tmpchoice[$tmpkey] = $tmpkey;
6638 asort($tmpchoice, SORT_NUMERIC);
6639 foreach ($tmpchoice as $val) {
6641 $tmp = explode(
':', $val);
6644 if ($key !=
'' && $val !=
'') {
6645 if ((
int) $key == (
int) $limit) {
6646 $selected =
' selected="selected"';
6648 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6652 print
'</datalist>';
6655 print
ajax_combobox(
"limit".(is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
6659 if (
$conf->use_javascript_ajax) {
6660 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6662 jQuery(document).ready(function () {
6663 jQuery(".selectlimit").change(function() {
6664 console.log("We change limit so we submit the form");
6665 $(this).parents(\'form:first\').submit();
6674 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>';
6676 if ($betweenarrows) {
6677 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6678 print $betweenarrows;
6679 print
'<!--</div>-->';
6681 if ($nextpage > 0) {
6682 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>';
6685 print
'<li class="paginationafterarrows">';
6690 print
'</ul></div>'.
"\n";
6705function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6709 if (preg_match(
'/%/', $rate)) {
6710 $rate = str_replace(
'%',
'', $rate);
6714 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6715 $morelabel =
' ('.$reg[1].
')';
6716 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6717 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6719 if (preg_match(
'/\*/', $rate)) {
6720 $rate = str_replace(
'*',
'', $rate);
6725 if (!preg_match(
'/\//', $rate)) {
6726 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6729 $ret = $rate.($addpercent ?
'%' :
'');
6731 if (($info_bits & 1) && $usestarfornpr >= 0) {
6754function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6756 global $langs,
$conf;
6759 if (empty($amount)) {
6762 $amount = (is_numeric($amount) ? $amount : 0);
6763 if ($rounding == -1) {
6766 $nbdecimal = $rounding;
6768 if ($outlangs ===
'none') {
6778 if (!($outlangs instanceof
Translate)) {
6782 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6783 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6785 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6786 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6788 if ($thousand ==
'None') {
6790 } elseif ($thousand ==
'Space') {
6797 $amount = str_replace(
',',
'.', $amount);
6799 $data = explode(
'.', $amount);
6800 $decpart = isset($data[1]) ? $data[1] :
'';
6801 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6811 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6812 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6813 $nbdecimal = $nbdecimalmaxshown;
6821 if ((
string) $forcerounding !=
'-1') {
6822 if ($forcerounding ===
'MU') {
6824 } elseif ($forcerounding ===
'MT') {
6826 } elseif ($forcerounding >= 0) {
6827 $nbdecimal = $forcerounding;
6832 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
6834 $output = preg_replace(
'/\s/',
' ', $output);
6835 $output = preg_replace(
'/\'/',
''', $output);
6838 $cursymbolbefore = $cursymbolafter =
'';
6839 if ($currency_code && is_object($outlangs)) {
6840 if ($currency_code ==
'auto') {
6841 $currency_code =
$conf->currency;
6844 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6845 $listoflanguagesbefore = array(
'nl_NL');
6846 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6847 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6849 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6850 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6853 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6882function price2num($amount, $rounding =
'', $option = 0)
6884 global $langs,
$conf;
6887 if (is_null($amount)) {
6896 if (is_null($langs)) {
6900 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6901 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6903 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6904 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6907 if ($thousand ==
'None') {
6909 } elseif ($thousand ==
'Space') {
6917 if (!is_numeric($amount)) {
6918 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6921 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6922 $amount = str_replace($thousand,
'', $amount);
6928 if (is_numeric($amount)) {
6930 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6931 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6933 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6938 if ($thousand !=
',' && $thousand !=
'.') {
6939 $amount = str_replace(
',',
'.', $amount);
6942 $amount = str_replace(
' ',
'', $amount);
6943 $amount = str_replace($thousand,
'', $amount);
6944 $amount = str_replace($dec,
'.', $amount);
6946 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6952 $nbofdectoround =
'';
6953 if ($rounding ==
'MU') {
6955 } elseif ($rounding ==
'MT') {
6957 } elseif ($rounding ==
'MS') {
6958 $nbofdectoround = isset(
$conf->global->MAIN_MAX_DECIMALS_STOCK) ?
$conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6959 } elseif ($rounding ==
'CU') {
6961 } elseif ($rounding ==
'CT') {
6963 } elseif (is_numeric($rounding)) {
6964 $nbofdectoround = (int) $rounding;
6969 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6971 return 'ErrorBadParameterProvidedToFunction';
6977 if (is_numeric($amount)) {
6979 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6980 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6982 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6988 if ($thousand !=
',' && $thousand !=
'.') {
6989 $amount = str_replace(
',',
'.', $amount);
6992 $amount = str_replace(
' ',
'', $amount);
6993 $amount = str_replace($thousand,
'', $amount);
6994 $amount = str_replace($dec,
'.', $amount);
6996 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7014function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7016 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
7018 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7019 $dimension *= 1000000;
7021 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7024 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7025 $dimension /= 1000000;
7027 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
7044 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
7046 $ret .=
' '.measuringUnitString(0, $type, (
string) $unit, $use_short_label, $outputlangs);
7064function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
7066 global $db,
$conf, $mysoc;
7068 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
7069 $thirdparty_seller = $mysoc;
7072 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);
7074 $vatratecleaned = $vatrate;
7076 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
7077 $vatratecleaned = trim($reg[1]);
7078 $vatratecode = $reg[2];
7087 if ($mysoc->country_code ==
'ES') {
7089 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
7092 if ($thirdparty_seller->id == $mysoc->id) {
7093 if (!$thirdparty_buyer->localtax1_assuj) {
7097 if (!$thirdparty_seller->localtax1_assuj) {
7105 if (!$mysoc->localtax2_assuj) {
7108 if ($thirdparty_seller->id == $mysoc->id) {
7109 if (!$thirdparty_buyer->localtax2_assuj) {
7113 if (!$thirdparty_seller->localtax2_assuj) {
7119 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
7122 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
7128 if (in_array($mysoc->country_code, array(
'ES'))) {
7129 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
7135 if ($thirdparty_seller != $mysoc) {
7137 return $thirdparty_seller->localtax1_value;
7146 if ($thirdparty_seller != $mysoc) {
7149 return $thirdparty_seller->localtax2_value;
7152 if (in_array($mysoc->country_code, array(
'ES'))) {
7153 return $thirdparty_buyer->localtax2_value;
7162 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
7163 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7164 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
7165 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7166 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7167 if (!empty($vatratecode)) {
7168 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
7170 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
7173 $resql = $db->query($sql);
7176 $obj = $db->fetch_object($resql);
7179 return $obj->localtax1;
7180 } elseif ($local == 2) {
7181 return $obj->localtax2;
7202 $valors = explode(
":", $tax);
7204 if (count($valors) > 1) {
7221 $sql =
" SELECT t.localtax".$local.
" as localtax";
7222 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7223 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7224 $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";
7225 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7226 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7227 $sql .=
" ORDER BY t.rowid DESC";
7229 $resql = $db->query($sql);
7231 $obj = $db->fetch_object($resql);
7233 return $obj->localtax;
7254function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7258 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7261 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7262 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7263 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7264 if ($firstparamisid) {
7265 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7267 $vatratecleaned = $vatrate;
7270 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7271 $vatratecleaned = $reg[1];
7272 $vatratecode = $reg[2];
7275 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7278 $sql .=
" WHERE t.fk_pays = c.rowid";
7280 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
7282 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
7284 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7285 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7287 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7291 $resql = $db->query($sql);
7293 $obj = $db->fetch_object($resql);
7296 'rowid' => $obj->rowid,
7297 'code' => $obj->code,
7298 'rate' => $obj->rate,
7299 'localtax1' => $obj->localtax1,
7300 'localtax1_type' => $obj->localtax1_type,
7301 'localtax2' => $obj->localtax2,
7302 'localtax2_type' => $obj->localtax2_type,
7304 'accountancy_code_sell' => $obj->accountancy_code_sell,
7305 'accountancy_code_buy' => $obj->accountancy_code_buy
7337 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7340 $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";
7341 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7342 if ($firstparamisid) {
7343 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7345 $vatratecleaned = $vatrate;
7348 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7349 $vatratecleaned = $reg[1];
7350 $vatratecode = $reg[2];
7353 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7354 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7355 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7356 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7358 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7359 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7361 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7363 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7367 $resql = $db->query($sql);
7369 $obj = $db->fetch_object($resql);
7372 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7375 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7376 } elseif ($local == 2) {
7377 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7379 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);
7401 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7409 $product->fetch($idprod);
7411 if (($mysoc->country_code == $thirdpartytouse->country_code)
7412 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7413 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7416 if ($idprodfournprice > 0) {
7417 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
7419 $ret = $product->vatrate_supplier;
7420 if ($product->default_vat_code_supplier) {
7421 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7427 $ret = $product->tva_tx;
7428 if ($product->default_vat_code) {
7429 $ret .=
' ('.$product->default_vat_code.
')';
7442 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7443 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7444 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7445 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7446 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7447 $sql .= $db->plimit(1);
7449 $resql = $db->query($sql);
7451 $obj = $db->fetch_object($resql);
7453 $ret = $obj->vat_rate;
7454 if ($obj->default_vat_code) {
7455 $ret .=
' ('.$obj->default_vat_code.
')';
7479 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7496 if (!class_exists(
'Product')) {
7497 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7506 $result = $product->fetch($idprod);
7508 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7522 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7523 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7524 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7525 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7526 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7527 $sql .= $db->plimit(1);
7529 $resql = $db->query($sql);
7531 $obj = $db->fetch_object($resql);
7534 $ret = $obj->localtax1;
7535 } elseif ($local == 2) {
7536 $ret = $obj->localtax2;
7544 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7569 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7572 $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;
7574 $seller_country_code = $thirdparty_seller->country_code;
7575 $seller_in_cee =
isInEEC($thirdparty_seller);
7577 $buyer_country_code = $thirdparty_buyer->country_code;
7578 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7580 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 in cee=".((
string) (
int) $buyer_in_cee).
", idprod=".$idprod.
", idprodfournprice=".$idprodfournprice.
", SERVICE_ARE_ECOMMERCE_200238EC=".(
getDolGlobalString(
'SERVICE_ARE_ECOMMERCE_200238EC') ?
$conf->global->SERVICE_ARE_ECOMMERCE_200238EC :
''));
7585 if ($seller_in_cee && $buyer_in_cee) {
7586 $isacompany = $thirdparty_buyer->isACompany();
7587 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7588 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7602 if (!$seller_use_vat) {
7608 if (!empty($thirdparty_buyer->state_id)) {
7609 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
7610 $sql .=
" FROM ".$db->prefix().
"c_tva as t";
7611 $sql .=
" INNER JOIN ".$db->prefix().
"c_departements as d ON t.fk_department_buyer = d.rowid";
7612 $sql .=
" WHERE d.rowid = ".((int) $thirdparty_buyer->state_id);
7613 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7615 $res = $db->query($sql);
7617 if ($db->num_rows($res)) {
7618 $obj = $db->fetch_object($res);
7619 return $obj->vat_default_rate.
' ('.$obj->vat_default_code.
')';
7626 if (($seller_country_code == $buyer_country_code)
7627 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7628 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7633 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7637 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
7639 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
7640 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
7642 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
7654 if (($seller_in_cee && $buyer_in_cee)) {
7655 $isacompany = $thirdparty_buyer->isACompany();
7656 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7657 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7674 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
7675 $isacompany = $thirdparty_buyer->isACompany();
7703 if ($idprodfournprice > 0) {
7704 if (!class_exists(
'ProductFournisseur')) {
7705 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7708 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7709 return $prodprice->fourn_tva_npr;
7710 } elseif ($idprod > 0) {
7711 if (!class_exists(
'Product')) {
7712 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7715 $prod->fetch($idprod);
7716 return $prod->tva_npr;
7739 if (!is_object($thirdparty_seller)) {
7742 if (!is_object($thirdparty_buyer)) {
7747 if ($mysoc->country_code ==
'ES') {
7748 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7753 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7756 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7760 } elseif ($local == 2) {
7762 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7765 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7770 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7785function yn($yesno, $format = 1, $color = 0)
7789 $result =
'unknown';
7791 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7792 $result = $langs->trans(
'yes');
7793 if ($format == 1 || $format == 3) {
7794 $result = $langs->trans(
"Yes");
7797 $result =
'<input type="checkbox" value="1" checked disabled>';
7800 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7802 if ($format == 4 || !is_numeric($format)) {
7803 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
7807 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7808 $result = $langs->trans(
"no");
7809 if ($format == 1 || $format == 3) {
7810 $result = $langs->trans(
"No");
7813 $result =
'<input type="checkbox" value="0" disabled>';
7816 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7818 if ($format == 4 || !is_numeric($format)) {
7819 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
7825 $classname =
'error';
7829 return '<span class="'.$classname.
'">'.$result.
'</span>';
7852function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
7854 if (empty($modulepart) && is_object(
$object)) {
7855 if (!empty(
$object->module)) {
7856 $modulepart =
$object->module;
7857 } elseif (!empty(
$object->element)) {
7858 $modulepart =
$object->element;
7865 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
7867 $arrayforoldpath[
'product'] = 2;
7870 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7871 $level = $arrayforoldpath[$modulepart];
7874 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7876 if (empty($num) && is_object(
$object)) {
7879 if (empty($alpha)) {
7880 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7882 $num = preg_replace(
'/^.*\-/i',
'', $num);
7884 $num = substr(
"000".$num, -$level);
7886 $path = substr($num, 0, 1);
7889 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7892 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7902 if (empty($withoutslash) && !empty($path)) {
7917function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
7921 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7924 if (@is_dir($dir_osencoded)) {
7932 if (!empty($dataroot)) {
7934 $dir = str_replace($dataroot.
'/',
'', $dir);
7935 $ccdir = $dataroot.
'/';
7938 $cdir = explode(
"/", $dir);
7939 $num = count($cdir);
7940 for ($i = 0; $i < $num; $i++) {
7942 $ccdir .=
'/'.$cdir[$i];
7944 $ccdir .= $cdir[$i];
7947 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7955 if (!@is_dir($ccdir_osencoded)) {
7956 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7959 $dirmaskdec = octdec((
string) $newmask);
7960 if (empty($newmask)) {
7963 $dirmaskdec |= octdec(
'0111');
7964 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7966 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7969 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7978 return ($nberr ? -$nberr : $nbcreated);
7989function dolChmod($filepath, $newmask =
'')
7993 if (!empty($newmask)) {
7994 @chmod($filepath, octdec($newmask));
7996 @chmod($filepath, octdec(
$conf->global->MAIN_UMASK));
8008 return '<span class="fieldrequired">*</span>';
8028function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
8030 if (is_null($stringtoclean)) {
8034 if ($removelinefeed == 2) {
8035 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
8037 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
8042 $temp = str_replace(
'< ',
'__ltspace__', $temp);
8043 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
8046 $temp = strip_tags($temp);
8049 $pattern =
"/<[^<>]+>/";
8056 $tempbis = str_replace(
'<>',
'', $temp);
8057 $tempbis = preg_replace($pattern,
'', $tempbis);
8059 }
while ($tempbis != $temp);
8064 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
8070 if ($removelinefeed == 1) {
8071 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
8075 if ($removedoublespaces) {
8076 while (strpos($temp,
" ")) {
8077 $temp = str_replace(
" ",
" ", $temp);
8081 $temp = str_replace(
'__ltspace__',
'< ', $temp);
8082 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
8104function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0)
8106 if (empty($allowed_tags)) {
8107 $allowed_tags = array(
8108 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
8109 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
8110 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8113 $allowed_tags[] =
"comment";
8115 if (!in_array(
'iframe', $allowed_tags)) {
8116 $allowed_tags[] =
"iframe";
8120 if (!in_array(
'link', $allowed_tags)) {
8121 $allowed_tags[] =
"link";
8125 if (!in_array(
'script', $allowed_tags)) {
8126 $allowed_tags[] =
"script";
8130 if (!in_array(
'style', $allowed_tags)) {
8131 $allowed_tags[] =
"style";
8135 $allowed_tags_string = implode(
"><", $allowed_tags);
8136 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
8138 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
8143 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
8145 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
8146 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
8149 $temp = strip_tags($stringtoclean, $allowed_tags_string);
8151 if ($cleanalsosomestyles) {
8152 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
8154 if ($removeclassattribute) {
8155 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
8160 if ($cleanalsojavascript) {
8161 $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);
8164 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
8166 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
8187 if (is_null($allowed_attributes)) {
8188 $allowed_attributes = array(
8189 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
8191 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8195 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
8196 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
8199 $dom =
new DOMDocument(
'',
'UTF-8');
8201 $savwarning = error_reporting();
8202 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
8203 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
8204 error_reporting($savwarning);
8206 if ($dom instanceof DOMDocument) {
8207 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
8208 $el = $els->item($i);
8209 if (!$el instanceof DOMElement) {
8212 $attrs = $el->attributes;
8213 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
8215 if (!empty($attrs->item($ii)->name)) {
8216 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
8218 $els->item($i)->removeAttribute($attrs->item($ii)->name);
8219 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
8221 $valuetoclean = $attrs->item($ii)->value;
8223 if (isset($valuetoclean)) {
8225 $oldvaluetoclean = $valuetoclean;
8226 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
8227 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
8228 if ($els->item($i)->tagName ==
'a') {
8229 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
8230 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
8231 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
8235 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
8236 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8237 }
while ($oldvaluetoclean != $valuetoclean);
8240 $attrs->item($ii)->value = $valuetoclean;
8247 $return = $dom->saveHTML();
8250 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
8251 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
8252 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
8253 return trim($return);
8255 return $stringtoclean;
8272 $temp = $stringtoclean;
8273 foreach ($disallowed_tags as $tagtoremove) {
8274 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8275 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8278 if ($cleanalsosomestyles) {
8279 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8297 if ($nboflines == 1) {
8299 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8300 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8303 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8308 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8312 $text = preg_replace(
'/\n/',
'', $text);
8314 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8316 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8319 $text = strtr($text, $repTable);
8320 if ($charset ==
'UTF-8') {
8321 $pattern =
'/(<br[^>]*>)/Uu';
8324 $pattern =
'/(<br[^>]*>)/U';
8326 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8331 $lastaddediscontent = 1;
8332 while ($countline < $nboflines && isset($a[$i])) {
8333 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8334 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8335 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8337 if (!$lastaddediscontent) {
8340 $lastaddediscontent = 0;
8343 $firstline .= $a[$i];
8344 $lastaddediscontent = 1;
8350 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8352 $ret = $firstline.($adddots ?
'...' :
'');
8370function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8372 if (is_null($stringtoencode)) {
8377 return nl2br($stringtoencode, $forxml);
8379 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8393function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8395 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8400 return $stringtoencode;
8402 $out = $stringtoencode;
8406 $oldstringtoclean = $out;
8408 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8410 libxml_use_internal_errors(
false);
8411 if (LIBXML_VERSION < 20900) {
8415 libxml_disable_entity_loader(
true);
8418 $dom =
new DOMDocument();
8424 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
8426 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
8429 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8430 $out = trim($dom->saveHTML());
8433 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
8434 $out = preg_replace(
'/<\/div>$/',
'', $out);
8438 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8442 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript'))) {
8447 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8453 'quote-marks' =>
false,
8454 'doctype' =>
'strict',
8455 'show-body-only' =>
true,
8456 "indent-attributes" =>
false,
8457 "vertical-space" =>
false,
8469 $out = $tidy->repairString($out, $config,
'utf8');
8476 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8481 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8484 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8488 $out = preg_replace(
'/'/i',
''', $out);
8493 $out = preg_replace_callback(
8494 '/&#(x?[0-9][0-9a-f]+;?)/i',
8499 static function ($m) {
8506 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8509 if ($check ==
'restricthtmlallowlinkscript') {
8511 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
8523 $out = preg_replace(
'/'/i',
"'", $out);
8527 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8528 $out = preg_replace(
'/on(abort|after|animation|auxclick|before|blur|cancel|canplay|canplaythrough|change|click|close|contextmenu|cuechange|copy|cut)[a-z]*\s*=/i',
'', $out);
8529 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8530 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8531 $out = preg_replace(
'/on(paste|pause|play|playing|progress|ratechange|reset|resize|scroll|search|seeked|seeking|show|stalled|start|submit|suspend)[a-z]*\s*=/i',
'', $out);
8532 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8534 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8535 }
while ($oldstringtoclean != $out);
8542 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8543 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8544 $nblinks = count($reg[0]);
8545 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8546 $out =
'ErrorTooManyLinksIntoHTMLString';
8549 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8551 $out =
'ErrorHTMLLinksNotAllowed';
8553 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8556 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8559 if (preg_match_all($pattern, $out, $matches)) {
8561 $urls = $matches[1];
8564 foreach ($urls as $url) {
8566 echo
"Found url = ".$url .
"\n";
8569 $out =
'ErrorHTMLExternalLinksNotAllowed';
8598function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
8600 if (is_null($stringtoencode)) {
8604 $newstring = $stringtoencode;
8606 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
8607 if ($removelasteolbr) {
8608 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
8610 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
8611 $newstring = strtr($newstring, array(
'&' =>
'__and__',
'<' =>
'__lt__',
'>' =>
'__gt__',
'"' =>
'__dquot__'));
8613 $newstring = strtr($newstring, array(
'__and__' =>
'&',
'__lt__' =>
'<',
'__gt__' =>
'>',
'__dquot__' =>
'"'));
8615 if ($removelasteolbr) {
8616 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
8635 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
8636 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
8637 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
8638 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
8650 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
8651 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
8667 if ($keepsomeentities) {
8668 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
8670 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
8671 if ($keepsomeentities) {
8672 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
8688function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
8690 return htmlentities($string, $flags, $encoding, $double_encode);
8709 for ($scursor = 0; $scursor < $len; $scursor++) {
8710 $ordchar = ord($s[$scursor]);
8712 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
8715 } elseif ($ordchar > 126 && $ordchar < 160) {
8719 $out .= $s[$scursor];
8741 $arraystring = explode(
"\n", $s);
8742 $nb = count($arraystring);
8759 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8761 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8764 $text = strtr($text, $repTable);
8765 if ($charset ==
'UTF-8') {
8766 $pattern =
'/(<br[^>]*>)/Uu';
8769 $pattern =
'/(<br[^>]*>)/U';
8771 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8773 $nblines = (int) floor((count($a) + 1) / 2);
8776 foreach ($a as $line) {
8779 $line_dec = html_entity_decode($line);
8781 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8782 $nblines += substr_count($line_dec,
'\n');
8802 if (is_null($msg)) {
8807 if (preg_match(
'/<(html|link|script)/i', $msg)) {
8809 } elseif (preg_match(
'/<body/i', $msg)) {
8811 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8813 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8815 } elseif (preg_match(
'/<br/i', $msg)) {
8821 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8822 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
8824 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8826 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8828 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8830 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8832 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8834 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8836 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8838 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8840 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8843 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8865function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
8867 if (!empty($invert)) {
8875 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8897 global $db,
$conf, $mysoc, $user, $extrafields;
8899 $substitutionarray = array();
8901 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
8905 $emailsendersignature = $user->signature;
8906 $usersignature = $user->signature;
8907 $substitutionarray = array_merge($substitutionarray, array(
8908 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8912 if (is_object($user) && ($user instanceof
User)) {
8913 $substitutionarray = array_merge($substitutionarray, array(
8914 '__USER_ID__' => (
string) $user->id,
8915 '__USER_LOGIN__' => (
string) $user->login,
8916 '__USER_EMAIL__' => (
string) $user->email,
8917 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8918 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8919 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8920 '__USER_FAX__' => (
string) $user->office_fax,
8921 '__USER_LASTNAME__' => (
string) $user->lastname,
8922 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8923 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8924 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8925 '__USER_JOB__' => (string) $user->job,
8927 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8931 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8932 $substitutionarray = array_merge($substitutionarray, array(
8933 '__MYCOMPANY_NAME__' => $mysoc->name,
8934 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8935 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8936 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8937 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8938 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8939 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8940 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8941 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8942 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8943 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
8944 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
8945 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
8946 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
8947 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8948 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8949 '__MYCOMPANY_ADDRESS__' => $mysoc->
address,
8950 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8951 '__MYCOMPANY_TOWN__' => $mysoc->town,
8952 '__MYCOMPANY_STATE__' => $mysoc->state,
8953 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8954 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8955 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8956 '__MYCOMPANY_CURRENCY_CODE__' =>
$conf->currency
8960 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8962 $substitutionarray[
'__ID__'] =
'__ID__';
8963 $substitutionarray[
'__REF__'] =
'__REF__';
8964 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8965 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8966 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8967 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8968 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8969 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8970 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8972 if (isModEnabled(
"societe")) {
8973 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8974 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8975 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8976 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8977 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8978 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8980 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8981 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8982 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8983 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8984 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8985 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
8986 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8987 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8988 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8989 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8990 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8991 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8992 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
8993 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
8994 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
8995 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
8996 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8997 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8998 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
9000 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
9001 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
9002 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
9003 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
9004 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
9005 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
9010 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
9011 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
9012 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
9013 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
9014 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
9015 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
9016 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
9017 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
9018 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
9019 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
9022 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
9023 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
9024 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
9025 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
9027 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
9028 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
9029 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
9030 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
9034 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
9035 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
9036 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
9037 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
9038 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
9040 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
9041 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
9043 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
9044 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
9046 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
9047 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
9048 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
9049 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
9050 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
9051 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
9052 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
9054 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
9055 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
9056 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
9057 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
9058 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
9060 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
9061 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
9062 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
9063 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
9065 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
9066 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
9067 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
9070 '@phan-var-force Adherent|Delivery $object';
9071 $substitutionarray[
'__ID__'] =
$object->id;
9072 $substitutionarray[
'__REF__'] =
$object->ref;
9073 $substitutionarray[
'__NEWREF__'] =
$object->newref;
9075 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9076 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9077 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
9078 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
9079 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
9080 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
9081 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
9082 $substitutionarray[
'__DATE_DELIVERY__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
'day',
false, $outputlangs) :
'');
9084 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%A") :
'');
9086 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%b") :
'');
9093 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9094 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9095 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset(
$object->delivery_date) ?
dol_print_date(
$object->delivery_date,
'day',
false, $outputlangs) :
'');
9096 $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 :
'')) :
'');
9100 '@phan-var-force Adherent $object';
9103 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
9104 if (method_exists(
$object,
'getCivilityLabel')) {
9105 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
9107 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
9108 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
9109 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
9110 if (method_exists(
$object,
'getFullName')) {
9111 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
9113 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
9114 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
9115 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
9116 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
9117 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
9118 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
9119 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
9120 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
9121 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
9122 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
9123 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
9127 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
9128 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
9130 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
9131 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
9132 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
9133 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
9134 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
9135 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
9136 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
9137 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
9138 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
9139 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
9140 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
9144 '@phan-var-force Societe $object';
9145 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object) ?
$object->id :
'');
9146 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object) ?
$object->name :
'');
9147 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object) ?
$object->name_alias :
'');
9148 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object) ?
$object->code_client :
'');
9149 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object) ?
$object->code_fournisseur :
'');
9150 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object) ?
$object->email :
'');
9151 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object) ?
$object->email :
'');
9154 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object) ?
$object->address :
'');
9155 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object) ?
$object->zip :
'');
9156 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object) ?
$object->town :
'');
9157 $substitutionarray[
'__THIRDPARTY_STATE__'] = (is_object(
$object) ?
$object->state :
'');
9158 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object) ?
$object->country_id :
'');
9159 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object) ?
$object->country_code :
'');
9160 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object) ?
$object->idprof1 :
'');
9161 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object) ?
$object->idprof2 :
'');
9162 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object) ?
$object->idprof3 :
'');
9163 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object) ?
$object->idprof4 :
'');
9164 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object) ?
$object->idprof5 :
'');
9165 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object) ?
$object->idprof6 :
'');
9166 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object) ?
$object->tva_intra :
'');
9169 } elseif (is_object(
$object->thirdparty)) {
9170 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->id :
'');
9171 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name :
'');
9172 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name_alias :
'');
9173 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_client :
'');
9174 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_fournisseur :
'');
9175 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9176 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9179 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->address :
'');
9180 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->zip :
'');
9181 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->town :
'');
9182 $substitutionarray[
'__THIRDPARTY_STATE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->state :
'');
9183 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_id :
'');
9184 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_code :
'');
9185 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof1 :
'');
9186 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof2 :
'');
9187 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof3 :
'');
9188 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof4 :
'');
9189 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof5 :
'');
9190 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof6 :
'');
9191 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->tva_intra :
'');
9196 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
9197 '@phan-var-force RecruitmentCandidature $object';
9198 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
9199 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9200 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9202 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
9203 '@phan-var-force ConferenceOrBoothAttendee $object';
9204 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
9205 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9206 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9210 '@phan-var-force Project $object';
9211 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
9212 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
9213 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
9214 } elseif (is_object(
$object)) {
9216 if (!empty(
$object->project)) {
9218 } elseif (!empty(
$object->projet)) {
9221 if (!is_null($project) && is_object($project)) {
9222 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
9223 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
9224 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
9229 $project_id =
$object->fk_project;
9230 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
9231 $project_id =
$object->fk_project;
9233 if ($project_id > 0) {
9235 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9236 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9237 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9243 '@phan-var-force Facture $object';
9244 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
9247 '@phan-var-force Expedition $object';
9248 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9249 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9250 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9253 '@phan-var-force Reception $object';
9254 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9255 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9259 '@phan-var-force Contrat $object';
9260 $dateplannedstart =
'';
9261 $datenextexpiration =
'';
9262 foreach (
$object->lines as $line) {
9263 if ($line->date_start > $dateplannedstart) {
9264 $dateplannedstart = $line->date_start;
9266 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9267 $datenextexpiration = $line->date_end;
9270 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9271 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9272 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9274 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9275 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9276 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9280 '@phan-var-force Ticket $object';
9281 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9282 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9283 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9284 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9285 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9286 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9287 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9288 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9289 $userstat =
new User($db);
9290 if (
$object->fk_user_assign > 0) {
9291 $userstat->fetch(
$object->fk_user_assign);
9292 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9295 if (
$object->fk_user_create > 0) {
9296 $userstat->fetch(
$object->fk_user_create);
9297 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9303 if (!is_object($extrafields)) {
9306 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9308 if (
$object->fetch_optionals() > 0) {
9309 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9310 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9311 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9312 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9313 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9314 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9315 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9316 $datetime =
$object->array_options[
'options_'.$key];
9317 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9318 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9319 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9320 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9321 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9322 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9323 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9324 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9325 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9326 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9327 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9328 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9336 if (empty($substitutionarray[
'__REF__'])) {
9340 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9341 $outputlangs->loadLangs(array(
'paypal',
'other'));
9344 $typeforonlinepayment =
'free';
9346 $typeforonlinepayment =
'order';
9349 $typeforonlinepayment =
'invoice';
9352 $typeforonlinepayment =
'member';
9353 if (!empty(
$object->last_subscription_amount)) {
9354 $amounttouse =
$object->last_subscription_amount;
9358 $typeforonlinepayment =
'contract';
9361 $typeforonlinepayment =
'ficheinter';
9364 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9369 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9370 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9374 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions_be.lib.php';
9379 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9381 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9384 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9386 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9389 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9391 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9394 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9396 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9399 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9401 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9404 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9406 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9410 '@phan-var-force Propal $object';
9411 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9412 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9413 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9416 '@phan-var-force Commande $object';
9417 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9420 '@phan-var-force Facture $object';
9421 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9424 '@phan-var-force Contrat $object';
9425 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9426 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9427 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9430 '@phan-var-force Fichinter $object';
9431 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9432 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9433 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9435 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9436 '@phan-var-force SupplierProposal $object';
9437 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9439 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9440 '@phan-var-force FactureFournisseur $object';
9441 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9444 '@phan-var-force Expedition $object';
9445 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9450 '@phan-var-force ActionComm $object';
9451 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9452 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9454 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9458 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9459 '@phan-var-force Facture|FactureRec $object';
9460 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9463 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
9465 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
9467 $already_payed_all = 0;
9472 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9476 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9480 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9482 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9486 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9487 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9489 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9490 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9494 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9495 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9496 $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) :
'';
9497 $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)) :
'';
9498 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9499 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9501 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9502 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9505 if ($onlykey != 2) {
9506 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9507 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9508 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9509 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9510 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9511 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9513 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9514 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9518 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9519 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9520 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9521 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
9525 if ($onlykey != 2) {
9526 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9527 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
9533 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
9534 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
9544 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
9546 $substitutionarray = array_merge($substitutionarray, array(
9547 '__NOW_TMS__' => (
string) $now,
9548 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
9549 '__DAY__' => (
string) $tmp[
'mday'],
9550 '__DAY_TEXT__' => $daytext,
9551 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
9552 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
9553 '__MONTH__' => (
string) $tmp[
'mon'],
9554 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
9555 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
9556 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
9557 '__YEAR__' => (
string) $tmp[
'year'],
9558 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
9559 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
9560 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
9561 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
9562 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
9563 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
9564 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
9565 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
9566 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
9570 if (isModEnabled(
'multicompany')) {
9571 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' =>
$conf->entity));
9573 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
9574 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
9575 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
9576 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
9577 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
9582 return $substitutionarray;
9601function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
9603 global
$conf, $db, $langs;
9605 if (!is_array($substitutionarray)) {
9606 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
9609 if (empty($outputlangs)) {
9610 $outputlangs = $langs;
9620 if (is_object($outputlangs)) {
9622 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
9624 $tmp = explode(
'|', $reg[1]);
9625 if (!empty($tmp[1])) {
9626 $outputlangs->load($tmp[1]);
9629 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
9631 if (empty($converttextinhtmlifnecessary)) {
9633 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9647 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
9655 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
9656 $keyfound = $reg[1];
9658 $value =
'*****forbidden*****';
9660 $value = empty(
$conf->global->$keyfound) ?
'' :
$conf->global->$keyfound;
9663 if (empty($converttextinhtmlifnecessary)) {
9665 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9678 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
9683 foreach ($substitutionarray as $key => $value) {
9684 if (!isset($value)) {
9688 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
9692 if (empty($converttextinhtmlifnecessary)) {
9693 $text = str_replace(
"$key",
"$value", $text);
9705 $text = str_replace(
"$key",
"$value", $text);
9721 $memory_object_list = array();
9722 foreach ($substitutionarray as $key => $value) {
9723 $lazy_load_arr = array();
9724 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
9725 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
9726 $key_to_substitute = $lazy_load_arr[1];
9727 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
9728 $param_arr = explode(
':', $value);
9730 if (count($param_arr) == 4) {
9731 $path = $param_arr[0];
9732 $class = $param_arr[1];
9733 $method = $param_arr[2];
9734 $id = (int) $param_arr[3];
9737 if (!isset($memory_object_list[$class])) {
9739 require_once DOL_DOCUMENT_ROOT . $path;
9740 if (class_exists($class)) {
9741 $memory_object_list[$class] = array(
9749 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
9750 if (method_exists($class, $method)) {
9751 if (!isset($memory_object_list[$class][
'list'][
$id])) {
9752 $tmpobj =
new $class($db);
9754 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
9755 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
9758 $tmpobj = $memory_object_list[$class][
'list'][
$id];
9760 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
9763 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
9789 global
$conf, $user;
9791 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9796 $dirsubstitutions = array_merge(array(), (array)
$conf->modules_parts[
'substitutions']);
9798 foreach ($dirsubstitutions as $reldir) {
9806 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
9807 foreach ($substitfiles as $substitfile) {
9809 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
9812 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
9814 require_once $dir.$substitfile[
'name'];
9816 $function_name = $module.
"_".$callfunc;
9817 if (function_exists($function_name)) {
9818 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
9826 foreach ($substitutionarray as $key => $value) {
9827 $tags .=
'{'.$key.
'} => '.$value.
"\n";
9829 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9842function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
9844 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9857function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
9863 if (!is_object($outputlangs)) {
9864 $outputlangs = $langs;
9867 if ($date_start && $date_end) {
9868 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9870 if ($date_start && !$date_end) {
9871 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9873 if (!$date_start && $date_end) {
9874 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9894 if ($nameorder < 0) {
9897 if ($nameorder == 1) {
9899 if ($firstname && $lastname) {
9903 } elseif ($nameorder == 2 || $nameorder == 3) {
9905 if (empty($ret) && $nameorder == 3) {
9910 if (empty($ret) && $nameorder == 5) {
9913 if ($nameorder == 0) {
9914 if ($firstname && $lastname) {
9936function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
9939 if (!is_array($mesgs)) {
9940 $mesgs = trim((
string) $mesgs);
9943 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9947 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
9949 $_SESSION[
'dol_events'][$style][] = $mesgs;
9954 foreach ($mesgs as $mesg) {
9955 $mesg = trim((
string) $mesg);
9957 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9961 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
9963 $_SESSION[
'dol_events'][$style][] = $mesg;
9983function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
9985 if (empty($mesg) && empty($mesgs)) {
9993 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE".$messagekey])) {
9994 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9995 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
9997 if (empty($mesgs)) {
10000 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
10021 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
10022 if (empty($disabledoutputofmessages)) {
10025 unset($_SESSION[
'dol_events'][
'mesgs']);
10028 if (isset($_SESSION[
'dol_events'][
'errors'])) {
10029 if (empty($disabledoutputofmessages)) {
10032 unset($_SESSION[
'dol_events'][
'errors']);
10036 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
10037 if (empty($disabledoutputofmessages)) {
10040 unset($_SESSION[
'dol_events'][
'warnings']);
10058function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
10060 global
$conf, $langs;
10065 $divstart = $divend =
'';
10068 if ((empty(
$conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
10069 $divstart =
'<div class="'.$style.
' clearboth">';
10070 $divend =
'</div>';
10073 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
10074 $langs->load(
"errors");
10076 if (is_array($mesgarray) && count($mesgarray)) {
10077 foreach ($mesgarray as $message) {
10079 $out .= $langs->trans($message);
10080 if ($ret < count($mesgarray)) {
10087 $out .= $langs->trans($mesgstring);
10093 if (!empty(
$conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
10094 $return =
'<script nonce="'.getNonce().
'">
10095 $(document).ready(function() {
10100 /* jnotify(message, preset of message type, keepmessage) */
10102 "'.($style ==
"ok" ? 3000 : $style).
'",
10103 '.($style ==
"ok" ?
"false" :
"true").
',
10104 { remove: function (){} } );
10145function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
10147 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
10153 if (is_array($mesgarray)) {
10154 foreach ($mesgarray as $val) {
10155 if ($val && preg_match(
'/class="error"/i', $val)) {
10159 if ($val && preg_match(
'/class="warning"/i', $val)) {
10164 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
10166 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
10169 if ($style ==
'error') {
10172 if ($style ==
'warning') {
10176 if ($iserror || $iswarning) {
10178 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
10179 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
10180 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
10182 if (is_array($mesgarray)) {
10183 $newmesgarray = array();
10184 foreach ($mesgarray as $val) {
10185 if (is_string($val)) {
10186 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
10187 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
10188 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
10189 $newmesgarray[] = $tmpmesgstring;
10191 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
10194 $mesgarray = $newmesgarray;
10196 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
10238function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
10241 $order = strtolower($order);
10243 if (is_array($array)) {
10244 $sizearray = count($array);
10245 if ($sizearray > 0) {
10247 foreach (array_keys($array) as $key) {
10248 if (is_object($array[$key])) {
10249 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
10252 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
10254 if ($natsort == -1) {
10255 $temp[$key] =
'___'.$temp[$key];
10259 if (empty($natsort) || $natsort == -1) {
10260 if ($order ==
'asc') {
10266 if ($case_sensitive) {
10269 natcasesort($temp);
10271 if ($order !=
'asc') {
10272 $temp = array_reverse($temp,
true);
10278 foreach (array_keys($temp) as $key) {
10279 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10298 $str = (string) $str;
10301 $strLength = strlen($str);
10302 for ($i = 0; $i < $strLength; $i++) {
10303 if (ord($str[$i]) < 0x80) {
10305 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10307 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10309 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10311 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10313 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10318 for ($j = 0; $j < $n; $j++) {
10319 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10340 return preg_match(
'//u', $str) ? true :
false;
10352 if (function_exists(
'mb_check_encoding')) {
10354 if (!mb_check_encoding($str,
'ASCII')) {
10358 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10376 $tmp = ini_get(
"unicode.filesystem_encoding");
10377 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10378 $tmp =
'iso-8859-1';
10387 if ($tmp ==
'iso-8859-1') {
10388 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10408function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
10418 if (isset(
$conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10419 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10422 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10424 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10425 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10426 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
10427 $sql .=
" WHERE ".$fieldkey.
" = ".((int) $key);
10429 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10431 if (!empty($entityfilter)) {
10432 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10438 $resql = $db->query($sql);
10440 $obj = $db->fetch_object($resql);
10442 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $obj->valuetoget;
10444 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10448 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10465 if ($matchrule == 1) {
10466 if ($var ==
'mainmenu') {
10468 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10469 } elseif ($var ==
'leftmenu') {
10471 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10473 return 'This variable is not accessible with dol_eval';
10476 return 'This value for matchrule is not implemented';
10490function verifCond($strToEvaluate, $onlysimplestring =
'1')
10494 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10497 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10498 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10518function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10522 global $db, $langs, $user, $website, $websitepage;
10523 global $action, $mainmenu, $leftmenu;
10525 global $objectoffield;
10531 $isObBufferActive =
false;
10532 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
10533 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
10538 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
10544 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
10545 if ($onlysimplestring ==
'2') {
10546 $specialcharsallowed .=
'[]';
10549 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
10551 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
10552 if ($returnvalue) {
10553 return 'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s;
10555 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s, LOG_WARNING);
10561 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
10562 if ($returnvalue) {
10563 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a call using of "$abc(" or "$abc (" instead of using the direct name of the function): '.$s;
10565 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a call using of "$abc(" or "$abc (" instead of using the direct name of the function): '.$s, LOG_WARNING);
10573 while ($scheck && $savescheck != $scheck) {
10574 $savescheck = $scheck;
10575 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10576 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
10577 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
10578 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10579 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10580 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
10583 if (strpos($scheck,
'(') !==
false) {
10584 if ($returnvalue) {
10585 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
10587 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s, LOG_WARNING);
10596 if (is_array($s) || $s ===
'Array') {
10597 if ($returnvalue) {
10598 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
10600 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
10604 if (strpos($s,
'::') !==
false) {
10605 if ($returnvalue) {
10606 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
10608 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s, LOG_WARNING);
10612 if (strpos($s,
'`') !==
false) {
10613 if ($returnvalue) {
10614 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
10616 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
10620 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
10621 if ($returnvalue) {
10622 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
10624 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
10630 $forbiddenphpstrings = array(
'$$',
'$_',
'}[');
10631 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
10633 $forbiddenphpfunctions = array();
10635 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
10636 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
10637 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
10638 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
10639 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
10640 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
10641 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
10642 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
10643 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
10644 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
10646 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
10648 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
10650 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
10653 $oldstringtoclean = $s;
10654 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
10655 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
10656 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
10658 }
while ($oldstringtoclean != $s);
10661 if (strpos($s,
'__forbiddenstring__') !==
false) {
10662 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
10663 if ($returnvalue) {
10664 return 'Bad string syntax to evaluate: '.$s;
10666 dol_syslog(
'Bad string syntax to evaluate: '.$s);
10672 if ($returnvalue) {
10674 $isObBufferActive =
true;
10675 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
10676 $tmpo = ob_get_clean();
10677 $isObBufferActive =
false;
10679 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
10683 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
10691 }
catch (Error $e) {
10692 if ($isObBufferActive) {
10694 $tmpo = ob_get_clean();
10695 $isObBufferActive =
false;
10697 $error =
'dol_eval try/catch error : ';
10698 $error .= $e->getMessage();
10700 if ($returnvalue) {
10701 return 'Exception during evaluation: '.$s;
10717 return (trim($element) !=
'');
10730 if (empty($codelang)) {
10734 if ($codelang ==
'auto') {
10735 return '<span class="fa fa-language"></span>';
10738 $langtocountryflag = array(
10740 'ca_ES' =>
'catalonia',
10744 'sw_SW' =>
'unknown',
10754 if (isset($langtocountryflag[$codelang])) {
10755 $flagImage = $langtocountryflag[$codelang];
10757 $tmparray = explode(
'_', $codelang);
10758 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
10763 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
10764 $morecss = $reg[1];
10769 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
10783 if (empty($countrycode)) {
10787 if (strtoupper($countrycode) ==
'MQ') {
10790 if (strtoupper($countrycode) ==
'SE') {
10793 if (strtoupper($countrycode) ==
'CH') {
10794 if ($mysoc->country_code ==
'FR') {
10797 if ($mysoc->country_code ==
'DE') {
10800 if ($mysoc->country_code ==
'IT') {
10982 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10983 if (in_array($buildprimarykeytotest, $locales)) {
10984 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10987 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10988 foreach ($locales as $locale) {
10989 $locale_language = locale_get_primary_language($locale);
10990 $locale_region = locale_get_region($locale);
10991 if (strtoupper($countrycode) == $locale_region) {
10993 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10997 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
11035 global $hookmanager, $db;
11037 if (isset(
$conf->modules_parts[
'tabs'][$type]) && is_array(
$conf->modules_parts[
'tabs'][$type])) {
11038 foreach (
$conf->modules_parts[
'tabs'][$type] as $value) {
11039 $values = explode(
':', $value);
11042 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
11047 $posstart = strpos($str,
'(');
11048 if ($posstart > 0) {
11049 $posend = strpos($str,
')');
11050 if ($posstart > 0) {
11051 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
11052 if (is_numeric($res1)) {
11053 $postab = (int) $res1;
11054 $values[1] =
'+' . substr($str, $posend + 1);
11058 if (count($values) == 6) {
11062 if ($values[0] != $type) {
11068 if ($filterorigmodule) {
11069 if (strpos($values[3],
'@')) {
11070 if ($filterorigmodule !=
'external') {
11074 if ($filterorigmodule !=
'core') {
11079 $langs->load($values[3]);
11081 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11083 $substitutionarray = array();
11088 $labeltemp = explode(
',', $values[2]);
11089 $label = $langs->trans($labeltemp[0]);
11091 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
11093 $classtoload = $labeltemp[1];
11094 if (class_exists($classtoload)) {
11095 $obj =
new $classtoload($db);
11096 $function = $labeltemp[3];
11097 if ($obj && $function && method_exists($obj, $function)) {
11099 $nbrec = $obj->$function(
$object->id, $obj);
11100 if (!empty($nbrec)) {
11101 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
11109 $newtab[1] = $label;
11110 $newtab[2] = str_replace(
'+',
'', $values[1]);
11115 } elseif (count($values) == 5) {
11116 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
11118 if ($values[0] != $type) {
11122 if ($filterorigmodule) {
11123 if (strpos($values[3],
'@')) {
11124 if ($filterorigmodule !=
'external') {
11128 if ($filterorigmodule !=
'core') {
11133 $langs->load($values[3]);
11135 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11136 $substitutionarray = array();
11140 $label = $langs->trans($values[2]);
11144 $newtab[1] = $label;
11145 $newtab[2] = str_replace(
'+',
'', $values[1]);
11149 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
11150 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
11151 if ($values[0] != $type) {
11154 $tabname = str_replace(
'-',
'', $values[1]);
11155 foreach ($head as $key => $val) {
11156 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
11158 if ($head[$key][2] == $tabname && $condition) {
11159 unset($head[$key]);
11168 if (!empty($hookmanager)) {
11169 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
11170 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
11171 if ($reshook > 0) {
11172 $head = $hookmanager->resArray;
11174 $head = array_merge($head, $hookmanager->resArray);
11193 global
$conf, $hookmanager, $user, $langs;
11196 global $micro_start_time;
11198 if ($zone ==
'private') {
11199 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
11201 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
11205 print
"\n<!-- A div to store page_y POST parameter -->\n";
11206 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
11208 $parameters = array();
11209 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
11210 if (empty($reshook)) {
11216 if (!empty(
$conf->use_javascript_ajax)) {
11217 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
11218 print
'<script>'.
"\n";
11219 print
'jQuery(document).ready(function() {'.
"\n";
11221 if ($zone ==
'private' && empty(
$conf->dol_use_jmobile)) {
11223 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
11224 print
'jQuery("li.menuhider").click(function(event) {';
11225 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
11226 print
' console.log("We click on .menuhider");'.
"\n";
11227 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
11232 if ($action ==
'create' || $action ==
'edit' || (empty($action) && (preg_match(
'/new\.php/', $_SERVER[
"PHP_SELF"]))) || ((empty($action) || $action ==
'addline') && (preg_match(
'/card\.php/', $_SERVER[
"PHP_SELF"])))) {
11233 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
11234 $relativepathstring = $_SERVER[
"PHP_SELF"];
11236 if (constant(
'DOL_URL_ROOT')) {
11237 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
11239 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
11240 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
11243 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
11244 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
11246 if ($defkey !=
'_noquery_') {
11247 $tmpqueryarraytohave = explode(
'&', $defkey);
11249 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11250 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
11252 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
11256 if (!$foundintru) {
11265 print
'console.log("set the focus by executing jQuery(...).focus();")'.
"\n";
11266 foreach ($defval as $paramkey => $paramval) {
11268 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
11269 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // TODO KO with ckeditor
11270 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
11275 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
11276 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
11278 if ($defkey != '_noquery_') {
11279 $tmpqueryarraytohave = explode('&', $defkey);
11281 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11282 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
11283 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
11284 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
11288 if (!$foundintru) {
11291 //var_dump($defkey.'-'.$qualified);
11297 print 'console.log("set the js code to manage fields that are
set as mandatory
");'."\n
";
11299 foreach ($defval as $paramkey => $paramval) {
11300 // Solution 1: Add handler on submit to check if mandatory fields are empty
11301 print 'var form = $(\'#'.dol_escape_js($paramkey).'\').closest("form
");'."\n
";
11302 print "form.on(
'submit',
function(event) {
11303 var submitter =
event.originalEvent.submitter;
11305 var buttonName = $(submitter).attr(
'name');
11306 if (buttonName ==
'cancel') {
11307 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
11312 console.log(
'We did not click on cancel button but on something else, we check that field #".dol_escape_js($paramkey)." is not empty');
11314 var tmpvalue = jQuery(
'#".dol_escape_js($paramkey)."').val();
11315 let tmptypefield = jQuery(
'#".dol_escape_js($paramkey)."').prop(
'nodeName').toLowerCase();
11317 if (tmptypefield ==
'textarea') {
11319 var tmpeditor = CKEDITOR.instances[
'".dol_escape_js($paramkey)."'];
11321 tmpvalue = tmpeditor.getData();
11322 console.log(
'For textarea tmpvalue is '+tmpvalue);
11326 let tmpvalueisempty =
false;
11327 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1) {
11328 tmpvalueisempty =
true;
11330 if (tmpvalue ===
'0' && tmptypefield ==
'select') {
11331 tmpvalueisempty =
true;
11333 if (tmpvalueisempty) {
11334 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
11335 event.preventDefault();
11336 event.stopPropagation();
11337 alert(
'".dol_escape_js($langs->trans("ErrorFieldRequired", $paramkey).' (
'.$langs->trans("CustomMandatoryFieldRule").')
')."');
11340 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
11345 // Solution 2: Add property 'required' on input
11346 // so browser will check value and try to focus on it when submitting the form.
11347 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
11348 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11349 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11350 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
11351 //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
";
11352 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
11358 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");'.
"\n";
11363 print
'jQuery("input[name=\'cancel\']").click(function() {
11364 console.log("We click on cancel button so removed all required attribute");
11365 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
11375 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
11377 print
"/* JS CODE TO ENABLE to add memory info */\n";
11378 print
'window.console && console.log("';
11383 if (!empty($micro_start_time)) {
11384 $micro_end_time = microtime(
true);
11385 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
11388 if (function_exists(
"memory_get_usage")) {
11389 print
' - Mem: '.memory_get_usage();
11391 if (function_exists(
"memory_get_peak_usage")) {
11392 print
' - Real mem peak: '.memory_get_peak_usage(
true);
11394 if (function_exists(
"zend_loader_file_encoded")) {
11395 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
11400 print
"\n".
'</script>'.
"\n";
11406 foreach ($tmptagarray as $tmptag) {
11408 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
11410 <!-- Global site tag (gtag.js) - Google Analytics -->
11411 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
11413 window.dataLayer = window.dataLayer || [];
11414 function gtag(){dataLayer.push(arguments);}
11415 gtag(\'js\', new Date());
11417 gtag(\'config\', \''.trim($tmptag).
'\');
11424 // Add Xdebug coverage of code
11425 if (defined('XDEBUGCOVERAGE
')) {
11426 print_r(xdebug_get_code_coverage());
11429 // Add DebugBar data
11430 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
11431 if (isset($debugbar['time
'])) {
11432 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
11433 $debugbar['time
']->stopMeasure('pageaftermaster
');
11435 print '<!-- Output debugbar data -->
'."\n";
11436 $renderer = $debugbar->getJavascriptRenderer();
11437 print $renderer->render();
11438 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
11440 print "<!-- Start of log output\n";
11441 //print '<div
class=
"hidden">
'."\n";
11442 foreach ($conf->logbuffer as $logline) {
11443 print $logline."<br>\n";
11445 //print '</div>
'."\n";
11446 print "End of log output -->\n";
11460function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
11462 if (is_null($string)) {
11466 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
11467 // This is a regex string
11468 $newdelimiter = $delimiter;
11470 // This is a simple string
11471 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
11472 $newdelimiter = preg_quote($delimiter, '/
');
11475 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
11477 foreach ($a as $s) { // each part
11479 if ($pos = strpos($s, $kv)) { // key/value delimiter
11480 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
11481 } else { // key delimiter not found
11499function dol_set_focus($selector)
11501 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
11502 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
11513function dol_getmypid()
11515 if (!function_exists('getmypid
')) {
11516 return mt_rand(99900000, 99965535);
11518 return getmypid(); // May be a number on 64 bits (depending on OS)
11544function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
11546 global $db, $langs;
11548 $value = trim($value);
11551 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
11554 $value = preg_replace('/([!<>=]+)\s+([0-9
'.preg_quote($langs->trans("DecimalSeparator"), '/
').'\-])/
', '\1\2
', $value); // Clean string '< 10
' into '<10
' so we can then explode on space to get all tests to do
11557 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
11559 $crits = explode(' ', $value);
11561 if (!is_array($fields)) {
11562 $fields = array($fields);
11565 $i1 = 0; // count the nb of and criteria added (all fields / criteria)
11566 foreach ($crits as $crit) { // Loop on each AND criteria
11567 $crit = trim($crit);
11568 $i2 = 0; // count the nb of valid criteria added for this this first criteria
11570 foreach ($fields as $field) {
11572 $tmpcrits = explode('|
', $crit);
11573 $i3 = 0; // count the nb of valid criteria added for this current field
11574 foreach ($tmpcrits as $tmpcrit) {
11575 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11578 $tmpcrit = trim($tmpcrit);
11580 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11583 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
11586 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
11587 if (!empty($reg[1])) {
11588 $operator = $reg[1];
11590 if ($newcrit != '') {
11591 $numnewcrit = price2num($newcrit);
11592 if (is_numeric($numnewcrit)) {
11593 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
11595 $newres .= '1 = 2
'; // force false, we received a corrupted data
11597 $i3++; // a criteria was added to string
11600 $i2++; // a criteria for 1 more field was added to string
11601 } elseif ($mode == 2 || $mode == -2) {
11602 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
11603 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
11604 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
11606 $newres .= ' OR
'.$field.' IS NULL
';
11608 $i2++; // a criteria for 1 more field was added to string
11609 } elseif ($mode == 3 || $mode == -3) {
11610 $tmparray = explode(',
', $crit);
11611 if (count($tmparray)) {
11613 foreach ($tmparray as $val) {
11616 $listofcodes .= ($listofcodes ? ',
' : '');
11617 $listofcodes .= "'".$db->escape($val)."'";
11620 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
11621 $i2++; // a criteria for 1 more field was added to string
11624 $newres .= ' OR
'.$field.' IS NULL
';
11626 } elseif ($mode == 4) {
11627 $tmparray = explode(',
', $crit);
11628 if (count($tmparray)) {
11630 foreach ($tmparray as $val) {
11633 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
11634 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
11635 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
11636 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
11638 $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)
11642 } else { // $mode=0
11643 $tmpcrits = explode('|
', $crit);
11644 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
11645 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
11646 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11649 $tmpcrit = trim($tmpcrit);
11651 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
11652 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
11654 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11657 if (preg_match('/\.(
id|rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
11658 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
11660 $tmpcrit2 = $tmpcrit;
11665 if (preg_match('/^!/
', $tmpcrit)) {
11666 $tmps .= $field." NOT LIKE "; // ! as exclude character
11667 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
11669 $tmps .= $field." LIKE ";
11673 if (preg_match('/^[\^\$]/', $tmpcrit)) {
11675 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
11677 if (preg_match('/[\^\$]$/', $tmpcrit)) {
11679 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
11682 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
11686 $newres .= $tmpbefore;
11687 $newres .= $db->escape($tmpcrit2);
11688 $newres .= $tmpafter;
11690 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
11691 $newres .= " OR ".$field." IS NULL)";
11698 $i2++; // a criteria for 1 more field was added to string
11703 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
11707 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
11718function showDirectDownloadLink($object)
11720 global $conf, $langs;
11723 $url = $object->getLastMainDocLink($object->element);
11725 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
11727 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
11728 $out .= ajax_autoselect("directdownloadlink", '');
11730 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
11744function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
11746 $dirName = dirname($file);
11747 if ($dirName == '.
') {
11751 if (!in_array($extName, array('', '_small
', '_mini
'))) {
11752 return 'Bad parameter extName
';
11755 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove image extension, whatever is its case
11756 $fileName = basename($fileName);
11758 if (empty($extImgTarget)) {
11759 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
11761 if (empty($extImgTarget)) {
11762 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
11764 if (empty($extImgTarget)) {
11765 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
11767 if (empty($extImgTarget)) {
11768 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
11770 if (empty($extImgTarget)) {
11771 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
11773 if (empty($extImgTarget)) {
11774 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
11777 if (!$extImgTarget) {
11783 $subdir = 'thumbs/
';
11786 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
11799function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
11801 global $conf, $langs;
11803 if (empty($conf->use_javascript_ajax)) {
11807 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
11809 if ($alldata == 1) {
11810 if ($isAllowedForPreview) {
11811 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));
11817 // old behavior, return a string
11818 if ($isAllowedForPreview) {
11819 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
11820 $title = $langs->transnoentities("Preview");
11821 //$title = '%27-alert(document.domain)-%27
';
11822 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
11824 // We need to urlencode the parameter after the dol_escape_js($tmpurl) because $tmpurl may contain n url with param file=abc%27def if file has a ' inside.
11841function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
11844 $out = '<script nonce=
"'.getNonce().'">
11845 jQuery(document).ready(
function () {
11846 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
11850 if ($textonlink === 'image
') {
11851 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
11853 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
11866function dolIsAllowedForPreview($file)
11868 // Check .noexe extension in filename
11869 if (preg_match('/\.noexe$/i
', $file)) {
11873 // Check mime types
11874 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
11875 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
11876 $mime_preview[] = 'svg+xml
';
11878 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
11879 //$mime_preview[]='archive
';
11880 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
11881 if ($num_mime !== false) {
11885 // By default, not allowed for preview
11899function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
11902 $imgmime = 'other.png
';
11903 $famime = 'file-o
';
11906 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
11908 // Plain text files
11909 if (preg_match('/\.txt$/i
', $tmpfile)) {
11910 $mime = 'text/plain
';
11911 $imgmime = 'text.png
';
11912 $famime = 'file-alt
';
11913 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
11914 $mime = 'text/richtext
';
11915 $imgmime = 'text.png
';
11916 $famime = 'file-alt
';
11917 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
11918 $mime = 'text/csv
';
11919 $imgmime = 'text.png
';
11920 $famime = 'file-csv
';
11921 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
11922 $mime = 'text/tab-separated-values
';
11923 $imgmime = 'text.png
';
11924 $famime = 'file-alt
';
11925 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
11926 $mime = 'text/plain
';
11927 $imgmime = 'text.png
';
11928 $famime = 'file-alt
';
11929 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
11930 $mime = 'text/plain
';
11931 $imgmime = 'text.png
';
11933 $famime = 'file-alt
';
11934 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
11935 $mime = 'text/plain
';
11936 $imgmime = 'text.png
';
11938 $famime = 'file-alt
';
11939 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
11940 $mime = 'text/css
';
11941 $imgmime = 'css.png
';
11943 $famime = 'file-alt
';
11944 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
11945 $mime = 'text/plain
';
11946 $imgmime = 'text.png
';
11948 $famime = 'file-alt
';
11949 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11950 $mime = 'text/plain
';
11951 $imgmime = 'text.png
';
11952 $famime = 'file-alt
';
11953 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11954 $mime = 'text/html
';
11955 $imgmime = 'html.png
';
11957 $famime = 'file-alt
';
11958 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11959 $mime = 'text/xml
';
11960 $imgmime = 'other.png
';
11962 $famime = 'file-alt
';
11963 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11964 $mime = 'text/xml
';
11965 $imgmime = 'other.png
';
11967 $famime = 'file-alt
';
11968 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11969 $mime = 'text/plain
';
11970 $imgmime = 'text.png
';
11972 $famime = 'file-code
';
11973 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11974 $mime = 'text/plain
';
11975 $imgmime = 'text.png
';
11977 $famime = 'file-code
';
11978 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11979 $mime = 'text/plain
';
11980 $imgmime = 'text.png
';
11982 $famime = 'file-code
';
11983 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11984 $mime = 'text/plain
';
11985 $imgmime = 'text.png
';
11987 $famime = 'file-code
';
11988 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11989 $mime = 'text/plain
';
11990 $imgmime = 'text.png
';
11992 $famime = 'file-code
';
11993 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11994 $mime = 'text/plain
';
11995 $imgmime = 'text.png
';
11997 $famime = 'file-code
';
11998 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11999 $mime = 'text/plain
';
12000 $imgmime = 'php.png
';
12002 $famime = 'file-code
';
12003 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
12004 $mime = 'text/plain
';
12005 $imgmime = 'php.png
';
12007 $famime = 'file-code
';
12008 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
12009 $mime = 'text/plain
';
12010 $imgmime = 'pl.png
';
12012 $famime = 'file-code
';
12013 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
12014 $mime = 'text/plain
';
12015 $imgmime = 'text.png
';
12017 $famime = 'file-code
';
12018 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
12019 $mime = 'text/x-javascript
';
12020 $imgmime = 'jscript.png
';
12022 $famime = 'file-code
';
12023 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
12024 $mime = 'application/vnd.oasis.opendocument.presentation
';
12025 $imgmime = 'ooffice.png
';
12026 $famime = 'file-powerpoint
';
12027 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
12028 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
12029 $imgmime = 'ooffice.png
';
12030 $famime = 'file-excel
';
12031 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
12032 $mime = 'application/vnd.oasis.opendocument.text
';
12033 $imgmime = 'ooffice.png
';
12034 $famime = 'file-word
';
12035 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
12036 $mime = 'application/msaccess
';
12037 $imgmime = 'mdb.png
';
12039 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
12040 $mime = 'application/msword
';
12041 $imgmime = 'doc.png
';
12042 $famime = 'file-word
';
12043 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
12044 $mime = 'application/msword
';
12045 $imgmime = 'doc.png
';
12046 $famime = 'file-word
';
12047 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
12048 $mime = 'application/vnd.ms-excel
';
12049 $imgmime = 'xls.png
';
12050 $famime = 'file-excel
';
12051 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
12052 $mime = 'application/vnd.ms-excel
';
12053 $imgmime = 'xls.png
';
12054 $famime = 'file-excel
';
12055 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
12056 $mime = 'application/vnd.ms-excel
';
12057 $imgmime = 'xls.png
';
12058 $famime = 'file-excel
';
12059 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
12060 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
12061 $imgmime = 'xls.png
';
12062 $famime = 'file-excel
';
12063 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
12064 $mime = 'application/vnd.ms-powerpoint
';
12065 $imgmime = 'ppt.png
';
12066 $famime = 'file-powerpoint
';
12067 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
12068 $mime = 'application/x-mspowerpoint
';
12069 $imgmime = 'ppt.png
';
12070 $famime = 'file-powerpoint
';
12071 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
12072 $mime = 'application/pdf
';
12073 $imgmime = 'pdf.png
';
12074 $famime = 'file-pdf
';
12075 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
12076 $mime = 'text/x-bat
';
12077 $imgmime = 'script.png
';
12079 $famime = 'file-code
';
12080 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
12081 $mime = 'text/x-sh
';
12082 $imgmime = 'script.png
';
12084 $famime = 'file-code
';
12085 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
12086 $mime = 'text/x-ksh
';
12087 $imgmime = 'script.png
';
12089 $famime = 'file-code
';
12090 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
12091 $mime = 'text/x-bash
';
12092 $imgmime = 'script.png
';
12094 $famime = 'file-code
';
12095 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
12096 $mime = 'image/x-icon
';
12097 $imgmime = 'image.png
';
12098 $famime = 'file-image
';
12099 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
12100 $mime = 'image/jpeg
';
12101 $imgmime = 'image.png
';
12102 $famime = 'file-image
';
12103 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
12104 $mime = 'image/png
';
12105 $imgmime = 'image.png
';
12106 $famime = 'file-image
';
12107 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
12108 $mime = 'image/gif
';
12109 $imgmime = 'image.png
';
12110 $famime = 'file-image
';
12111 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
12112 $mime = 'image/bmp
';
12113 $imgmime = 'image.png
';
12114 $famime = 'file-image
';
12115 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
12116 $mime = 'image/tiff
';
12117 $imgmime = 'image.png
';
12118 $famime = 'file-image
';
12119 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
12120 $mime = 'image/svg+xml
';
12121 $imgmime = 'image.png
';
12122 $famime = 'file-image
';
12123 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
12124 $mime = 'image/webp
';
12125 $imgmime = 'image.png
';
12126 $famime = 'file-image
';
12127 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
12128 $mime = 'text/calendar
';
12129 $imgmime = 'other.png
';
12130 $famime = 'file-alt
';
12131 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
12132 $mime = 'text/calendar
';
12133 $imgmime = 'other.png
';
12134 $famime = 'file-alt
';
12135 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
12136 $mime = 'application/x-bittorrent
';
12137 $imgmime = 'other.png
';
12138 $famime = 'file-o
';
12139 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
12141 $imgmime = 'audio.png
';
12142 $famime = 'file-audio
';
12143 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
12144 $mime = 'video/mp4
';
12145 $imgmime = 'video.png
';
12146 $famime = 'file-video
';
12147 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
12148 $mime = 'video/ogg
';
12149 $imgmime = 'video.png
';
12150 $famime = 'file-video
';
12151 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
12152 $mime = 'video/webm
';
12153 $imgmime = 'video.png
';
12154 $famime = 'file-video
';
12155 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
12156 $mime = 'video/x-msvideo
';
12157 $imgmime = 'video.png
';
12158 $famime = 'file-video
';
12159 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
12160 $mime = 'video/divx
';
12161 $imgmime = 'video.png
';
12162 $famime = 'file-video
';
12163 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
12164 $mime = 'video/xvid
';
12165 $imgmime = 'video.png
';
12166 $famime = 'file-video
';
12167 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
12169 $imgmime = 'video.png
';
12170 $famime = 'file-video
';
12171 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
12172 // application/xxx where zzz is zip, ...
12174 $imgmime = 'archive.png
';
12175 $famime = 'file-archive
';
12176 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
12177 $mime = 'application/octet-stream
';
12178 $imgmime = 'other.png
';
12179 $famime = 'file-o
';
12180 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
12182 $imgmime = 'library.png
';
12183 $famime = 'file-o
';
12184 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
12186 $imgmime = 'error.png
';
12187 $famime = 'file-alt
';
12190 // Return mimetype string
12191 switch ((int) $mode) {
12193 $tmp = explode('/
', $mime);
12194 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
12216function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid
')
12220 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
12222 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
12224 if (is_null($dictvalues)) {
12225 $dictvalues = array();
12227 $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
12228 if ($checkentity) {
12229 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
12232 $resql = $db->query($sql);
12234 while ($obj = $db->fetch_object($resql)) {
12235 $dictvalues[$obj->$rowidfield] = $obj;
12241 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
12244 if (!empty($dictvalues[
$id])) {
12246 $tmp = $dictvalues[
$id];
12247 return (property_exists($tmp, $field) ? $tmp->$field :
'');
12262 $stringcolor = str_replace(
'#',
'', $stringcolor);
12264 if (!empty($stringcolor)) {
12266 $tmp = explode(
',', $stringcolor);
12267 if (count($tmp) > 1) {
12272 $hexr = $stringcolor[0].$stringcolor[1];
12273 $hexg = $stringcolor[2].$stringcolor[3];
12274 $hexb = $stringcolor[4].$stringcolor[5];
12275 $r = hexdec($hexr);
12276 $g = hexdec($hexg);
12277 $b = hexdec($hexb);
12279 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
12280 if ($bright > 0.6) {
12301 if (empty($menuentry[
'enabled'])) {
12304 if ($type_user && $menuentry[
'module']) {
12305 $tmploops = explode(
'|', $menuentry[
'module']);
12307 foreach ($tmploops as $tmploop) {
12308 if (in_array($tmploop, $listofmodulesforexternal)) {
12317 if (!$menuentry[
'perms'] && $type_user) {
12323 if (!$menuentry[
'perms']) {
12338 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
12339 return (
int) $result;
12353function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
12355 $csstouse =
'badge';
12356 $csstouse .= (!empty($mode) ?
' badge-'.$mode :
'');
12357 $csstouse .= (!empty($type) ?
' badge-'.$type :
'');
12358 $csstouse .= (empty($params[
'css']) ?
'' :
' '.$params[
'css']);
12361 'class' => $csstouse
12364 if (empty($html)) {
12368 if (!empty($url)) {
12369 $attr[
'href'] = $url;
12372 if ($mode ===
'dot') {
12373 $attr[
'class'] .=
' classfortooltip';
12374 $attr[
'title'] = $html;
12375 $attr[
'aria-label'] = $label;
12380 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12381 foreach ($params[
'attr'] as $key => $value) {
12382 if ($key ==
'class') {
12383 $attr[
'class'] .=
' '.$value;
12384 } elseif ($key ==
'classOverride') {
12385 $attr[
'class'] = $value;
12387 $attr[$key] = $value;
12395 $attr = array_map(
'dol_escape_htmltag', $attr);
12397 $TCompiledAttr = array();
12398 foreach ($attr as $key => $value) {
12399 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12402 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
12404 $tag = !empty($url) ?
'a' :
'span';
12406 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
12422function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
12427 $dolGetBadgeParams = array();
12429 if (!empty($params[
'badgeParams'])) {
12430 $dolGetBadgeParams = $params[
'badgeParams'];
12434 if ($displayMode == 0) {
12435 $return = !empty($html) ? $html : (empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
12436 } elseif ($displayMode == 1) {
12437 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12441 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
12442 $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>' :
'');
12445 if (!empty(
$conf->dol_optimize_smallscreen)) {
12446 if ($displayMode == 0) {
12448 } elseif ($displayMode == 4) {
12450 } elseif ($displayMode == 6) {
12456 $statusImg = array(
12457 'status0' =>
'statut0',
12458 'status1' =>
'statut1',
12459 'status2' =>
'statut2',
12460 'status3' =>
'statut3',
12461 'status4' =>
'statut4',
12462 'status5' =>
'statut5',
12463 'status6' =>
'statut6',
12464 'status7' =>
'statut7',
12465 'status8' =>
'statut8',
12466 'status9' =>
'statut9'
12469 if (!empty($statusImg[$statusType])) {
12470 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
12472 $htmlImg =
img_picto($statusLabel, $statusType);
12475 if ($displayMode === 2) {
12476 $return = $htmlImg.
' '.$htmlLabelShort;
12477 } elseif ($displayMode === 3) {
12478 $return = $htmlImg;
12479 } elseif ($displayMode === 4) {
12480 $return = $htmlImg.
' '.$htmlLabel;
12481 } elseif ($displayMode === 5) {
12482 $return = $htmlLabelShort.
' '.$htmlImg;
12484 $return = $htmlLabel.
' '.$htmlImg;
12488 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12490 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
12491 if (empty($dolGetBadgeParams[
'attr'][
'title'])) {
12492 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
12494 $dolGetBadgeParams[
'attr'][
'class'] .=
' classfortooltip';
12496 $dolGetBadgeParams[
'attr'][
'title'] =
dol_htmlentitiesbr($dolGetBadgeParams[
'attr'][
'title'], 1);
12499 if ($displayMode == 3) {
12500 $return =
dolGetBadge((empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
12501 } elseif ($displayMode === 5) {
12502 $return =
dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
12504 $return =
dolGetBadge((empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
12550function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'',
$id =
'', $userRight = 1, $params = array())
12552 global $hookmanager, $action,
$object, $langs;
12555 if (is_array($url)) {
12557 foreach ($url as $key => $subbutton) {
12558 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
12565 if (array_key_exists(
'areDropdownButtons', $params) && $params[
"areDropdownButtons"] ===
false) {
12566 foreach ($url as $button) {
12567 if (!empty($button[
'lang'])) {
12568 $langs->load($button[
'lang']);
12570 $label = $langs->trans($button[
'label']);
12571 $text = $button[
'text'] ??
'';
12572 $actionType = $button[
'actionType'] ??
'';
12573 $tmpUrl = DOL_URL_ROOT.$button[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12574 $id = $button[
'id'] ??
'';
12575 $userRight = $button[
'perm'] ?? 1;
12576 $button[
'params'] = $button[
'params'] ?? [];
12578 $out .=
dolGetButtonAction($label, $text, $actionType, $tmpUrl,
$id, $userRight, $button[
'params']);
12583 if (count($url) > 1) {
12584 $out .=
'<div class="dropdown inline-block dropdown-holder">';
12585 $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>';
12586 $out .=
'<div class="dropdown-content">';
12587 foreach ($url as $subbutton) {
12588 if (!empty($subbutton[
'lang'])) {
12589 $langs->load($subbutton[
'lang']);
12592 if (!empty($subbutton[
'urlraw'])) {
12593 $tmpurl = $subbutton[
'urlraw'];
12595 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12599 $subbuttonparam = array();
12600 if (!empty($subbutton[
'attr'])) {
12601 $subbuttonparam[
'attr'] = $subbutton[
'attr'];
12603 $subbuttonparam[
'isDropDown'] = (empty($params[
'isDropDown']) ? ($subbutton[
'isDropDown'] ??
false) : $params[
'isDropDown']);
12605 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl, $subbutton[
'id'] ??
'', $subbutton[
'perm'], $subbuttonparam);
12610 foreach ($url as $subbutton) {
12611 if (!empty($subbutton[
'lang'])) {
12612 $langs->load($subbutton[
'lang']);
12615 if (!empty($subbutton[
'urlraw'])) {
12616 $tmpurl = $subbutton[
'urlraw'];
12618 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12622 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], $params);
12631 if (!empty($params[
'isDropdown']) || !empty($params[
'isDropDown'])) {
12632 $class =
"dropdown-item";
12634 $class =
'butAction';
12635 if ($actionType ==
'danger' || $actionType ==
'delete') {
12636 $class =
'butActionDelete';
12637 if (!empty($url) && strpos($url,
'token=') ===
false) {
12638 $url .=
'&token='.newToken();
12644 'href' => empty($url) ?
'' : $url,
12648 if (empty($text)) {
12650 $attr[
'title'] =
'';
12652 $attr[
'title'] = $label;
12653 $attr[
'aria-label'] = $label;
12656 if (empty($userRight)) {
12657 $attr[
'class'] =
'butActionRefused';
12658 $attr[
'href'] =
'';
12659 $attr[
'title'] = (($label && $text && $label != $text) ? $label :
'');
12660 $attr[
'title'] = ($attr[
'title'] ? $attr[
'title'].
'<br>' :
'').$langs->trans(
'NotEnoughPermissions');
12668 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12669 foreach ($params[
'attr'] as $key => $value) {
12670 if ($key ==
'class') {
12671 $attr[
'class'] .=
' '.$value;
12672 } elseif ($key ==
'classOverride') {
12673 $attr[
'class'] = $value;
12675 $attr[$key] = $value;
12681 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12682 $attr[
'class'] .=
' classfortooltip';
12686 if ($userRight && !empty($params[
'confirm'])) {
12687 if (!is_array($params[
'confirm'])) {
12688 $params[
'confirm'] = array();
12691 if (empty($params[
'confirm'][
'url'])) {
12692 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
12696 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
12697 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
12698 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
12699 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
12700 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
12701 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
12702 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
12704 $attr[
'class'] .=
' butActionConfirm';
12707 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12708 unset($attr[
'href']);
12712 $attr = array_map(
'dol_escape_htmltag', $attr);
12714 $TCompiledAttr = array();
12715 foreach ($attr as $key => $value) {
12716 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
12719 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
12721 $tag = !empty($attr[
'href']) ?
'a' :
'span';
12724 $parameters = array(
12725 'TCompiledAttr' => $TCompiledAttr,
12726 'compiledAttributes' => $compiledAttributes,
12731 'actionType' => $actionType,
12734 'userRight' => $userRight,
12735 'params' => $params
12738 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters,
$object, $action);
12739 if ($reshook < 0) {
12743 if (empty($reshook)) {
12745 return '<' . $tag .
' ' . $compiledAttributes .
'><span class="textbutton">' . $text .
'</span></' . $tag .
'>';
12747 return '<' . $tag .
' ' . $compiledAttributes .
'><span class="textbutton">' .
dol_escape_htmltag($text) .
'</span></' . $tag .
'>';
12750 return $hookmanager->resPrint;
12769 $parsedUrl = parse_url($url);
12770 if ((isset($parsedUrl[
'scheme']) && in_array($parsedUrl[
'scheme'], [
'javascript',
'mailto',
'tel'])) || strpos($url,
'#') === 0) {
12774 if (!empty($parsedUrl[
'query'])) {
12776 parse_str($parsedUrl[
'query'], $urlQuery);
12777 if (!isset($urlQuery[
'backtopage']) && isset($params[
'backtopage'])) {
12778 $url .=
'&backtopage='.urlencode($params[
'backtopage']);
12782 if (!isset($parsedUrl[
'scheme']) && $addDolUrlRoot) {
12783 $url = DOL_URL_ROOT.$url;
12798 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
12810 if (!empty($fieldValidationErrorMsg)) {
12811 $out .=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
12812 $out .=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
12831function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'',
$id =
'', $status = 1, $params = array())
12833 global $langs,
$conf, $user;
12836 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
12840 $class =
'btnTitle';
12841 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
12842 $class .=
' btnTitlePlus';
12844 $useclassfortooltip = 1;
12846 if (!empty($params[
'morecss'])) {
12847 $class .=
' '.$params[
'morecss'];
12852 'href' => empty($url) ?
'' : $url
12855 if (!empty($helpText)) {
12857 } elseif ($label) {
12858 $attr[
'title'] = $label;
12859 $useclassfortooltip = 0;
12862 if ($status == 2) {
12863 $attr[
'class'] .=
' btnTitleSelected';
12864 } elseif ($status <= 0) {
12865 $attr[
'class'] .=
' refused';
12867 $attr[
'href'] =
'';
12869 if ($status == -1) {
12870 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
12871 } elseif ($status == 0) {
12872 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
12876 if (!empty($attr[
'title']) && $useclassfortooltip) {
12877 $attr[
'class'] .=
' classfortooltip';
12885 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12886 foreach ($params[
'attr'] as $key => $value) {
12887 if ($key ==
'class') {
12888 $attr[
'class'] .=
' '.$value;
12889 } elseif ($key ==
'classOverride') {
12890 $attr[
'class'] = $value;
12892 $attr[$key] = $value;
12897 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12898 unset($attr[
'href']);
12903 $TCompiledAttr = array();
12904 foreach ($attr as $key => $value) {
12908 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
12910 $tag = (empty($attr[
'href']) ?
'span' :
'a');
12912 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
12913 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
12914 if (!empty($params[
'forcenohideoftext'])) {
12915 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
12917 $button .=
'</'.$tag.
'>';
12933 global
$conf, $db, $hookmanager;
12939 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element =
'';
12942 $module = $elementType;
12943 $element = $elementType;
12944 $subelement = $elementType;
12945 $table_element = $elementType;
12948 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $elementType, $regs)) {
12949 $element = $subelement = $regs[1];
12950 $module = $regs[2];
12955 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
12956 $module = $element = $regs[1];
12957 $subelement = $regs[2];
12961 if (substr($elementType, -3) ==
'det') {
12962 $module = preg_replace(
'/det$/',
'', $element);
12963 $subelement = preg_replace(
'/det$/',
'', $subelement);
12964 $classpath = $module.
'/class';
12965 $classfile = $module;
12966 $classname = preg_replace(
'/det$/',
'Line', $element);
12967 if (in_array($module, array(
'expedition',
'propale',
'facture',
'contrat',
'fichinter',
'commandefournisseur'))) {
12968 $classname = preg_replace(
'/det$/',
'Ligne', $element);
12972 if ($elementType ==
"action" || $elementType ==
"actioncomm") {
12973 $classpath =
'comm/action/class';
12974 $subelement =
'Actioncomm';
12975 $module =
'agenda';
12976 $table_element =
'actioncomm';
12977 } elseif ($elementType ==
'cronjob') {
12978 $classpath =
'cron/class';
12980 $table_element =
'cron';
12981 } elseif ($elementType ==
'adherent_type') {
12982 $classpath =
'adherents/class';
12983 $classfile =
'adherent_type';
12984 $module =
'adherent';
12985 $subelement =
'adherent_type';
12986 $classname =
'AdherentType';
12987 $table_element =
'adherent_type';
12988 } elseif ($elementType ==
'bank_account') {
12989 $classpath =
'compta/bank/class';
12991 $classfile =
'account';
12992 $classname =
'Account';
12993 } elseif ($elementType ==
'category') {
12994 $classpath =
'categories/class';
12995 $module =
'categorie';
12996 $subelement =
'categorie';
12997 $table_element =
'categorie';
12998 } elseif ($elementType ==
'contact') {
12999 $classpath =
'contact/class';
13000 $classfile =
'contact';
13001 $module =
'societe';
13002 $subelement =
'contact';
13003 $table_element =
'socpeople';
13004 } elseif ($elementType ==
'inventory') {
13005 $module =
'product';
13006 $classpath =
'product/inventory/class';
13007 } elseif ($elementType ==
'inventoryline') {
13008 $module =
'product';
13009 $classpath =
'product/inventory/class';
13010 $table_element =
'inventorydet';
13011 $parent_element =
'inventory';
13012 } elseif ($elementType ==
'stock' || $elementType ==
'entrepot') {
13014 $classpath =
'product/stock/class';
13015 $classfile =
'entrepot';
13016 $classname =
'Entrepot';
13017 $table_element =
'entrepot';
13018 } elseif ($elementType ==
'project') {
13019 $classpath =
'projet/class';
13020 $module =
'projet';
13021 $table_element =
'projet';
13022 } elseif ($elementType ==
'project_task') {
13023 $classpath =
'projet/class';
13024 $module =
'projet';
13025 $subelement =
'task';
13026 $table_element =
'projet_task';
13027 } elseif ($elementType ==
'facture' || $elementType ==
'invoice') {
13028 $classpath =
'compta/facture/class';
13029 $module =
'facture';
13030 $subelement =
'facture';
13031 $table_element =
'facture';
13032 } elseif ($elementType ==
'facturedet') {
13033 $classpath =
'compta/facture/class';
13034 $classfile =
'facture';
13035 $classname =
'FactureLigne';
13036 $module =
'facture';
13037 $table_element =
'facturedet';
13038 $parent_element =
'facture';
13039 } elseif ($elementType ==
'facturerec') {
13040 $classpath =
'compta/facture/class';
13041 $module =
'facture';
13042 $classname =
'FactureRec';
13043 } elseif ($elementType ==
'commande' || $elementType ==
'order') {
13044 $classpath =
'commande/class';
13045 $module =
'commande';
13046 $subelement =
'commande';
13047 $table_element =
'commande';
13048 } elseif ($elementType ==
'commandedet') {
13049 $classpath =
'commande/class';
13050 $classfile =
'commande';
13051 $classname =
'OrderLine';
13052 $module =
'commande';
13053 $table_element =
'commandedet';
13054 $parent_element =
'commande';
13055 } elseif ($elementType ==
'propal') {
13056 $classpath =
'comm/propal/class';
13057 $table_element =
'propal';
13058 } elseif ($elementType ==
'propaldet') {
13059 $classpath =
'comm/propal/class';
13060 $classfile =
'propal';
13061 $subelement =
'propaleligne';
13062 $module =
'propal';
13063 $table_element =
'propaldet';
13064 $parent_element =
'propal';
13065 } elseif ($elementType ==
'shipping') {
13066 $classpath =
'expedition/class';
13067 $classfile =
'expedition';
13068 $classname =
'Expedition';
13069 $module =
'expedition';
13070 $table_element =
'expedition';
13071 } elseif ($elementType ==
'expeditiondet' || $elementType ==
'shippingdet') {
13072 $classpath =
'expedition/class';
13073 $classfile =
'expedition';
13074 $classname =
'ExpeditionLigne';
13075 $module =
'expedition';
13076 $table_element =
'expeditiondet';
13077 $parent_element =
'expedition';
13078 } elseif ($elementType ==
'delivery_note') {
13079 $classpath =
'delivery/class';
13080 $subelement =
'delivery';
13081 $module =
'expedition';
13082 } elseif ($elementType ==
'delivery') {
13083 $classpath =
'delivery/class';
13084 $subelement =
'delivery';
13085 $module =
'expedition';
13086 } elseif ($elementType ==
'deliverydet') {
13088 } elseif ($elementType ==
'supplier_proposal') {
13089 $classpath =
'supplier_proposal/class';
13090 $module =
'supplier_proposal';
13091 $element =
'supplierproposal';
13092 $classfile =
'supplier_proposal';
13093 $subelement =
'supplierproposal';
13094 } elseif ($elementType ==
'supplier_proposaldet') {
13095 $classpath =
'supplier_proposal/class';
13096 $module =
'supplier_proposal';
13097 $classfile =
'supplier_proposal';
13098 $table_element =
'supplier_proposaldet';
13099 $parent_element =
'supplier_proposal';
13100 } elseif ($elementType ==
'contract') {
13101 $classpath =
'contrat/class';
13102 $module =
'contrat';
13103 $subelement =
'contrat';
13104 $table_element =
'contract';
13105 } elseif ($elementType ==
'contratdet') {
13106 $classpath =
'contrat/class';
13107 $module =
'contrat';
13108 $table_element =
'contratdet';
13109 $parent_element =
'contrat';
13110 } elseif ($elementType ==
'mailing') {
13111 $classpath =
'comm/mailing/class';
13112 $module =
'mailing';
13113 $classfile =
'mailing';
13114 $classname =
'Mailing';
13116 } elseif ($elementType ==
'member' || $elementType ==
'adherent') {
13117 $classpath =
'adherents/class';
13118 $module =
'adherent';
13119 $subelement =
'adherent';
13120 $table_element =
'adherent';
13121 } elseif ($elementType ==
'usergroup') {
13122 $classpath =
'user/class';
13124 } elseif ($elementType ==
'mo') {
13125 $classpath =
'mrp/class';
13130 $table_element =
'mrp_mo';
13131 } elseif ($elementType ==
'mrp_production') {
13132 $classpath =
'mrp/class';
13134 $classname =
'MoLine';
13137 $table_element =
'mrp_production';
13138 $parent_element =
'mo';
13139 } elseif ($elementType ==
'cabinetmed_cons') {
13140 $classpath =
'cabinetmed/class';
13141 $module =
'cabinetmed';
13142 $subelement =
'cabinetmedcons';
13143 $table_element =
'cabinetmedcons';
13144 } elseif ($elementType ==
'fichinter') {
13145 $classpath =
'fichinter/class';
13146 $module =
'ficheinter';
13147 $subelement =
'fichinter';
13148 $table_element =
'fichinter';
13149 } elseif ($elementType ==
'dolresource' || $elementType ==
'resource') {
13150 $classpath =
'resource/class';
13151 $module =
'resource';
13152 $subelement =
'dolresource';
13153 $table_element =
'resource';
13154 } elseif ($elementType ==
'opensurvey_sondage') {
13155 $classpath =
'opensurvey/class';
13156 $module =
'opensurvey';
13157 $subelement =
'opensurveysondage';
13158 } elseif ($elementType ==
'order_supplier' || $elementType ==
'commande_fournisseur') {
13159 $classpath =
'fourn/class';
13160 $module =
'fournisseur';
13161 $classfile =
'fournisseur.commande';
13162 $element =
'order_supplier';
13164 $classname =
'CommandeFournisseur';
13165 $table_element =
'commande_fournisseur';
13166 } elseif ($elementType ==
'commande_fournisseurdet') {
13167 $classpath =
'fourn/class';
13168 $module =
'fournisseur';
13169 $classfile =
'fournisseur.commande';
13170 $element =
'commande_fournisseurdet';
13172 $classname =
'CommandeFournisseurLigne';
13173 $table_element =
'commande_fournisseurdet';
13174 $parent_element =
'commande_fournisseur';
13175 } elseif ($elementType ==
'invoice_supplier') {
13176 $classpath =
'fourn/class';
13177 $module =
'fournisseur';
13178 $classfile =
'fournisseur.facture';
13179 $element =
'invoice_supplier';
13181 $classname =
'FactureFournisseur';
13182 $table_element =
'facture_fourn';
13183 } elseif ($elementType ==
'facture_fourn_det') {
13184 $classpath =
'fourn/class';
13185 $module =
'fournisseur';
13186 $classfile =
'fournisseur.facture';
13187 $element =
'facture_fourn_det';
13189 $classname =
'SupplierInvoiceLine';
13190 $table_element =
'facture_fourn_det';
13191 $parent_element =
'invoice_supplier';
13192 } elseif ($elementType ==
"service") {
13193 $classpath =
'product/class';
13194 $subelement =
'product';
13195 $table_element =
'product';
13196 } elseif ($elementType ==
'salary') {
13197 $classpath =
'salaries/class';
13198 $module =
'salaries';
13199 } elseif ($elementType ==
'payment_salary') {
13200 $classpath =
'salaries/class';
13201 $classfile =
'paymentsalary';
13202 $classname =
'PaymentSalary';
13203 $module =
'salaries';
13204 } elseif ($elementType ==
'productlot') {
13205 $module =
'productbatch';
13206 $classpath =
'product/stock/class';
13207 $classfile =
'productlot';
13208 $classname =
'Productlot';
13209 $element =
'productlot';
13211 $table_element =
'product_lot';
13212 } elseif ($elementType ==
'societeaccount') {
13213 $classpath =
'societe/class';
13214 $classfile =
'societeaccount';
13215 $classname =
'SocieteAccount';
13216 $module =
'societe';
13217 } elseif ($elementType ==
'websitepage') {
13218 $classpath =
'website/class';
13219 $classfile =
'websitepage';
13220 $classname =
'Websitepage';
13221 $module =
'website';
13222 $subelement =
'websitepage';
13223 $table_element =
'website_page';
13224 } elseif ($elementType ==
'fiscalyear') {
13225 $classpath =
'core/class';
13226 $module =
'accounting';
13227 $subelement =
'fiscalyear';
13228 } elseif ($elementType ==
'chargesociales') {
13229 $classpath =
'compta/sociales/class';
13231 $table_element =
'chargesociales';
13232 } elseif ($elementType ==
'tva') {
13233 $classpath =
'compta/tva/class';
13236 $table_element =
'tva';
13237 } elseif ($elementType ==
'emailsenderprofile') {
13239 $classpath =
'core/class';
13240 $classfile =
'emailsenderprofile';
13241 $classname =
'EmailSenderProfile';
13242 $table_element =
'c_email_senderprofile';
13244 } elseif ($elementType ==
'conferenceorboothattendee') {
13245 $classpath =
'eventorganization/class';
13246 $classfile =
'conferenceorboothattendee';
13247 $classname =
'ConferenceOrBoothAttendee';
13248 $module =
'eventorganization';
13249 } elseif ($elementType ==
'conferenceorbooth') {
13250 $classpath =
'eventorganization/class';
13251 $classfile =
'conferenceorbooth';
13252 $classname =
'ConferenceOrBooth';
13253 $module =
'eventorganization';
13254 } elseif ($elementType ==
'ccountry') {
13256 $classpath =
'core/class';
13257 $classfile =
'ccountry';
13258 $classname =
'Ccountry';
13259 $table_element =
'c_country';
13261 } elseif ($elementType ==
'ecmfiles') {
13263 $classpath =
'ecm/class';
13264 $classfile =
'ecmfiles';
13265 $classname =
'Ecmfiles';
13266 $table_element =
'ecmfiles';
13268 } elseif ($elementType ==
'knowledgerecord') {
13270 $classpath =
'knowledgemanagement/class';
13271 $classfile =
'knowledgerecord';
13272 $classname =
'KnowledgeRecord';
13273 $table_element =
'knowledgemanagement_knowledgerecord';
13277 if (empty($classfile)) {
13278 $classfile = strtolower($subelement);
13280 if (empty($classname)) {
13281 $classname = ucfirst($subelement);
13283 if (empty($classpath)) {
13284 $classpath = $module.
'/class';
13290 if ($module && isset(
$conf->$module)) {
13291 if (!empty(
$conf->$module->multidir_output[
$conf->entity])) {
13292 $dir_output =
$conf->$module->multidir_output[
$conf->entity];
13293 } elseif (!empty(
$conf->$module->output[
$conf->entity])) {
13294 $dir_output =
$conf->$module->output[
$conf->entity];
13295 } elseif (!empty(
$conf->$module->dir_output)) {
13296 $dir_output =
$conf->$module->dir_output;
13298 if (!empty(
$conf->$module->multidir_temp[
$conf->entity])) {
13299 $dir_temp =
$conf->$module->multidir_temp[
$conf->entity];
13300 } elseif (!empty(
$conf->$module->temp[
$conf->entity])) {
13301 $dir_temp =
$conf->$module->temp[
$conf->entity];
13302 } elseif (!empty(
$conf->$module->dir_temp)) {
13303 $dir_temp =
$conf->$module->dir_temp;
13308 if ($element ==
'order_supplier') {
13309 $dir_output =
$conf->fournisseur->commande->dir_output;
13310 $dir_temp =
$conf->fournisseur->commande->dir_temp;
13311 } elseif ($element ==
'invoice_supplier') {
13312 $dir_output =
$conf->fournisseur->facture->dir_output;
13313 $dir_temp =
$conf->fournisseur->facture->dir_temp;
13315 $dir_output .= $subdir;
13316 $dir_temp .= $subdir;
13318 $elementProperties = array(
13319 'module' => $module,
13320 'element' => $element,
13321 'table_element' => $table_element,
13322 'subelement' => $subelement,
13323 'classpath' => $classpath,
13324 'classfile' => $classfile,
13325 'classname' => $classname,
13326 'dir_output' => $dir_output,
13327 'dir_temp' => $dir_temp,
13328 'parent_element' => $parent_element,
13333 if (!is_object($hookmanager)) {
13334 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
13337 $hookmanager->initHooks(array(
'elementproperties'));
13341 $parameters = array(
13342 'elementType' => $elementType,
13343 'elementProperties' => $elementProperties
13346 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
13349 $elementProperties = $hookmanager->resArray;
13350 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
13351 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
13355 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
13356 unset($hookmanager->contextarray[$key]);
13359 return $elementProperties;
13374function fetchObjectByElement($element_id, $element_type, $element_ref =
'', $useCache = 0, $maxCacheByType = 10)
13382 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
13387 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
13388 } elseif ($element_prop[
'module'] ==
'societeaccount') {
13389 $ismodenabled = isModEnabled(
'website') || isModEnabled(
'webportal');
13391 $ismodenabled = isModEnabled($element_prop[
'module']);
13396 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
13397 if ($useCache === 1
13398 && !empty(
$conf->cache[
'fetchObjectByElement'][$element_type])
13399 && !empty(
$conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13400 && is_object(
$conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13402 return $conf->cache[
'fetchObjectByElement'][$element_type][$element_id];
13405 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13407 if (class_exists($element_prop[
'classname'])) {
13408 $className = $element_prop[
'classname'];
13409 $objecttmp =
new $className($db);
13410 '@phan-var-force CommonObject $objecttmp';
13412 if ($element_id > 0 || !empty($element_ref)) {
13413 $ret = $objecttmp->fetch($element_id, $element_ref);
13415 if (empty($objecttmp->module)) {
13416 $objecttmp->module = $element_prop[
'module'];
13419 if ($useCache > 0) {
13420 if (!isset(
$conf->cache[
'fetchObjectByElement'][$element_type])) {
13421 $conf->cache[
'fetchObjectByElement'][$element_type] = [];
13425 if (! empty(
$conf->cache[
'fetchObjectByElement'][$element_type]) && is_array(
$conf->cache[
'fetchObjectByElement'][$element_type]) && count(
$conf->cache[
'fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
13426 array_shift(
$conf->cache[
'fetchObjectByElement'][$element_type]);
13429 $conf->cache[
'fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
13438 dol_syslog($element_prop[
'classname'].
' doesn\'t exists in /'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13454 if (preg_match(
'/\.(htm|html|js|phar|php|php\d+|phtml|pht|pl|py|cgi|ksh|sh|shtml|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) {
13470 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
13482 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
13494 if (empty(
$conf->cache[
'nonce'])) {
13498 return $conf->cache[
'nonce'];
13515function startSimpleTable($header, $link =
"", $arguments =
"", $emptyColumns = 0, $number = -1, $pictofulllist =
'')
13519 print
'<div class="div-table-responsive-no-min">';
13520 print
'<table class="noborder centpercent">';
13521 print
'<tr class="liste_titre">';
13523 print ($emptyColumns < 1) ?
'<th>' :
'<th colspan="'.($emptyColumns + 1).
'">';
13525 print
'<span class="valignmiddle">'.$langs->trans($header).
'</span>';
13527 if (!empty($link)) {
13528 if (!empty($arguments)) {
13529 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
13531 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
13535 if ($number > -1) {
13536 print
'<span class="badge marginleftonlyshort">'.$number.
'</span>';
13537 } elseif (!empty($link)) {
13538 print
'<span class="badge marginleftonlyshort">...</span>';
13541 if (!empty($link)) {
13547 if ($number < 0 && !empty($link)) {
13548 print
'<th class="right">';
13568 if ($addLineBreak) {
13584function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
13589 print
'<tr class="oddeven">';
13590 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
13595 if ($nbofloop === 0) {
13605 if ($num > $nbofloop) {
13606 $colspan = $tableColumnCount;
13608 $colspan = $tableColumnCount - 1;
13611 if ($extraRightColumn) {
13615 print
'<tr class="liste_total">';
13617 if ($nbofloop > 0 && $num > $nbofloop) {
13618 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
13620 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
13621 print
'<td class="right centpercent">'.price($total).
'</td>';
13624 if ($extraRightColumn) {
13641 if ($method == -1) {
13652 while (ob_get_level()) {
13657 if ($method == 0) {
13658 readfile($fullpath_original_file_osencoded);
13659 } elseif ($method == 1) {
13661 $handle = fopen($fullpath_original_file_osencoded,
"rb");
13662 while (!feof($handle)) {
13663 print fread($handle, 8192);
13666 } elseif ($method == 2) {
13668 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
13669 $handle2 = fopen(
"php://output",
"wb");
13670 stream_copy_to_stream($handle1, $handle2);
13691 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'">';
13692 if ($texttoshow ===
'none') {
13693 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13694 $result .=
'<span class="clipboardCPValueToPrint"></span>';
13695 } elseif ($texttoshow) {
13696 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13697 $result .=
'<span class="clipboardCPValueToPrint">'.dol_escape_htmltag($texttoshow, 1, 1).
'</span>';
13699 $result .=
'<'.$tag.
' class="clipboardCPValue">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13701 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="'.dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")).
'"></span>';
13702 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
13703 $result .=
'<span class="clipboardCPText"></span>';
13704 $result .=
'</span>';
13718 $result = json_decode($stringtodecode);
13719 if ($result ===
null) {
13720 $result = unserialize($stringtodecode);
13747 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
13750 if (!preg_match(
'/^\(.*\)$/', $filter)) {
13751 $filter =
'(' . $filter .
')';
13754 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
13755 $firstandlastparenthesis = 0;
13757 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
13761 return 'Filter syntax error - '.$errorstr;
13766 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
13767 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
13770 if (preg_match(
'/[^\(\)]/', $t)) {
13771 $tmperrorstr =
'Bad syntax of the search string';
13772 $errorstr =
'Bad syntax of the search string: '.$filter;
13776 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - ".$errorstr, LOG_WARNING);
13777 return 'Filter error - '.$tmperrorstr;
13781 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeSQLCriteriaCallback', $filter).($nopar ?
"" :
')');
13783 if (is_object($db)) {
13784 $ret = str_replace(
'__NOW__', $db->idate(
dol_now()), $ret);
13786 if (is_object($user)) {
13787 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
13802 $arrayofandtags = array();
13806 $parenthesislevel = 0;
13811 if ($parenthesislevel >= 1) {
13812 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
13817 $countparenthesis = 0;
13818 while ($i < $nbofchars) {
13821 if ($char ==
'(') {
13822 $countparenthesis++;
13823 } elseif ($char ==
')') {
13824 $countparenthesis--;
13827 if ($countparenthesis == 0) {
13828 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
13829 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
13830 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
13833 if (!preg_match(
'/^\(.*\)$/', $s)) {
13836 $arrayofandtags[] = $s;
13849 if (!preg_match(
'/^\(.*\)$/', $s)) {
13852 $arrayofandtags[] = $s;
13855 return $arrayofandtags;
13867function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
13871 $tmp = $sqlfilters;
13875 $parenthesislevel = 0;
13883 if ($char ==
'(') {
13884 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
13886 $parenthesislevel++;
13889 } elseif ($char ==
')') {
13890 $nbcharremaining = ($nb - $i - 1);
13891 if ($nbcharremaining >= $counter) {
13892 $parenthesislevel = min($parenthesislevel, $counter - 1);
13894 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
13895 $parenthesislevel = $counter;
13900 if ($counter < 0) {
13901 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13902 $parenthesislevel = 0;
13910 if ($counter > 0) {
13911 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13912 $parenthesislevel = 0;
13930 if (empty($matches[1])) {
13933 $tmp = explode(
':', $matches[1]);
13934 if (count($tmp) < 3) {
13954 if (empty($matches[1])) {
13957 $tmp = explode(
':', $matches[1], 3);
13958 if (count($tmp) < 3) {
13962 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
13964 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
13967 'NOTLIKE' =>
'NOT LIKE',
13968 'ISNOT' =>
'IS NOT',
13969 'NOTIN' =>
'NOT IN',
13973 if (array_key_exists($operator, $realOperator)) {
13974 $operator = $realOperator[$operator];
13977 $tmpescaped = $tmp[2];
13983 if ($operator ==
'IN' || $operator ==
'NOT IN') {
13985 $tmpescaped2 =
'(';
13987 $tmpelemarray = explode(
',', $tmpescaped);
13988 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
13990 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
13991 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
13993 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
13996 $tmpescaped2 .= implode(
',', $tmpelemarray);
13997 $tmpescaped2 .=
')';
13999 $tmpescaped = $tmpescaped2;
14000 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
14001 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
14002 $tmpescaped = $regbis[1];
14005 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
14006 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
14009 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
14011 if (strtoupper($tmpescaped) ==
'NULL') {
14012 $tmpescaped =
'NULL';
14013 } elseif (ctype_digit((
string) $tmpescaped)) {
14014 $tmpescaped = (int) $tmpescaped;
14016 $tmpescaped = (float) $tmpescaped;
14020 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
14037 $out =
'<!-- timeline icon -->'.
"\n";
14038 $iconClass =
'fa fa-comments';
14043 if ($histo[$key][
'percent'] == -1) {
14044 $colorClass =
'timeline-icon-not-applicble';
14045 $pictoTitle = $langs->trans(
'StatusNotApplicable');
14046 } elseif ($histo[$key][
'percent'] == 0) {
14047 $colorClass =
'timeline-icon-todo';
14048 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
14049 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
14050 $colorClass =
'timeline-icon-in-progress';
14051 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
14052 } elseif ($histo[$key][
'percent'] >= 100) {
14053 $colorClass =
'timeline-icon-done';
14054 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
14057 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
14058 $iconClass =
'fa fa-ticket';
14059 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
14060 $iconClass =
'fa fa-pencilxxx';
14061 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14062 $iconClass =
'fa fa-comments';
14063 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14064 $iconClass =
'fa fa-mask';
14066 if ($actionstatic->type_picto) {
14067 $img_picto =
img_picto(
'', $actionstatic->type_picto);
14069 if ($actionstatic->type_code ==
'AC_RDV') {
14070 $iconClass =
'fa fa-handshake';
14071 } elseif ($actionstatic->type_code ==
'AC_TEL') {
14072 $iconClass =
'fa fa-phone';
14073 } elseif ($actionstatic->type_code ==
'AC_FAX') {
14074 $iconClass =
'fa fa-fax';
14075 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
14076 $iconClass =
'fa fa-envelope';
14077 } elseif ($actionstatic->type_code ==
'AC_INT') {
14078 $iconClass =
'fa fa-shipping-fast';
14079 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
14080 $iconClass =
'fa fa-robot';
14081 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
14082 $iconClass =
'fa fa-robot';
14087 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
14101 $documents = array();
14103 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
14104 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
14105 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
14107 $sql .=
' ORDER BY ecm.position ASC';
14109 $resql = $db->query($sql);
14111 if ($db->num_rows($resql)) {
14112 while ($obj = $db->fetch_object($resql)) {
14113 $documents[$obj->id] = $obj;
14139function show_actions_messaging(
$conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
14141 global $user,
$conf;
14144 global $param, $massactionbutton;
14146 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
14149 if (!is_object($filterobj) && !is_object($objcon)) {
14154 '@phan-var-force array<int,array{type:string,tododone:string,id:string,datestart:int|string,dateend:int|string,note:string,message:string,percent:string,userid:string,login:string,userfirstname:string,userlastname:string,userphoto:string,msg_from?:string,contact_id?:string,socpeopleassigned?:int[],lastname?:string,firstname?:string,fk_element?:int,elementtype?:string,acode:string,alabel?:string,libelle?:string,apicto?:string}> $histo';
14159 $sortfield_list = explode(
',', $sortfield);
14160 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
14161 $sortfield_new_list = array();
14162 foreach ($sortfield_list as $sortfield_value) {
14163 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
14165 $sortfield_new = implode(
',', $sortfield_new_list);
14170 if (isModEnabled(
'agenda')) {
14172 if (is_object($objcon) && $objcon->id > 0) {
14173 $sql =
"SELECT DISTINCT a.id, a.label as label,";
14175 $sql =
"SELECT a.id, a.label as label,";
14177 $sql .=
" a.datep as dp,";
14178 $sql .=
" a.note as message,";
14179 $sql .=
" a.datep2 as dp2,";
14180 $sql .=
" a.percent as percent, 'action' as type,";
14181 $sql .=
" a.fk_element, a.elementtype,";
14182 $sql .=
" a.fk_contact,";
14183 $sql .=
" a.email_from as msg_from,";
14184 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
14185 $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";
14186 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14187 $sql .=
", sp.lastname, sp.firstname";
14188 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14189 $sql .=
", m.lastname, m.firstname";
14190 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur'))) {
14193 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
14194 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
14195 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
14197 $force_filter_contact = $filterobj instanceof
User;
14199 if (is_object($objcon) && $objcon->id > 0) {
14200 $force_filter_contact =
true;
14201 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
14202 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
14205 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
14206 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
14207 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
14208 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
14209 $sql .=
" ON er.resource_type = 'dolresource'";
14210 $sql .=
" AND er.element_id = a.id";
14211 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
14212 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14213 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
14214 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14215 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
14216 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14217 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
14218 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14219 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
14220 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14221 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
14222 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14223 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
14224 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
14225 $sql .=
", ".MAIN_DB_PREFIX.
"facture as o";
14226 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
14227 $sql .=
", ".MAIN_DB_PREFIX.
"facture_fourn as o";
14230 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
14231 if (!$force_filter_contact) {
14232 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
14233 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
14234 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
14235 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
14236 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14237 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
14238 if ($filterobj->id) {
14239 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14241 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
14242 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
14243 if ($filterobj->id) {
14244 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14246 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14247 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
14248 if ($filterobj->id) {
14249 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14251 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14252 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
14253 if ($filterobj->id) {
14254 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14256 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14257 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
14258 if ($filterobj->id) {
14259 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14261 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14262 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
14263 if ($filterobj->id) {
14264 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14266 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14267 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
14268 if ($filterobj->id) {
14269 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14271 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
14272 $sql .=
" AND a.fk_contact = sp.rowid";
14273 if ($filterobj->id) {
14274 $sql .=
" AND a.fk_contact = ".((int) $filterobj->id);
14276 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
14277 $sql .=
" AND a.fk_element = o.rowid";
14278 if ($filterobj->id) {
14279 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice'";
14281 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
14282 $sql .=
" AND a.fk_element = o.rowid";
14283 if ($filterobj->id) {
14284 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice_supplier'";
14288 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
14292 if (!empty($actioncode) && $actioncode !=
'-1') {
14294 if ($actioncode ==
'AC_NON_AUTO') {
14295 $sql .=
" AND c.type != 'systemauto'";
14296 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14297 $sql .=
" AND c.type = 'systemauto'";
14299 if ($actioncode ==
'AC_OTH') {
14300 $sql .=
" AND c.type != 'systemauto'";
14301 } elseif ($actioncode ==
'AC_OTH_AUTO') {
14302 $sql .=
" AND c.type = 'systemauto'";
14306 if ($actioncode ==
'AC_NON_AUTO') {
14307 $sql .=
" AND c.type != 'systemauto'";
14308 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14309 $sql .=
" AND c.type = 'systemauto'";
14311 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
14315 if ($donetodo ==
'todo') {
14316 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
14317 } elseif ($donetodo ==
'done') {
14318 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
14320 if (is_array($filters) && $filters[
'search_agenda_label']) {
14321 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
14326 if (isModEnabled(
'mailing') && !empty($objcon->email)
14327 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
14328 $langs->load(
"mails");
14330 $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";
14331 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
14332 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
14333 $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";
14334 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14335 $sql2 .=
", '' as lastname, '' as firstname";
14336 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14337 $sql2 .=
", '' as lastname, '' as firstname";
14338 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14339 $sql2 .=
", '' as ref";
14340 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14341 $sql2 .=
", '' as ref";
14342 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14343 $sql2 .=
", '' as ref";
14345 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
14346 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
14347 $sql2 .=
" AND mc.statut = 1";
14348 $sql2 .=
" AND u.rowid = m.fk_user_valid";
14349 $sql2 .=
" AND mc.fk_mailing=m.rowid";
14352 if ($sql || $sql2) {
14353 if (!empty($sql) && !empty($sql2)) {
14354 $sql = $sql.
" UNION ".$sql2;
14355 } elseif (empty($sql) && !empty($sql2)) {
14364 $sql .= $db->order($sortfield_new, $sortorder);
14366 $sql .= $db->plimit($limit + 1, $offset);
14369 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
14370 $resql = $db->query($sql);
14373 $num = $db->num_rows($resql);
14375 $imaxinloop = ($limit ? min($num, $limit) : $num);
14376 while ($i < $imaxinloop) {
14377 $obj = $db->fetch_object($resql);
14379 if ($obj->type ==
'action') {
14381 $contactaction->id = $obj->id;
14382 $result = $contactaction->fetchResources();
14385 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
14391 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
14392 $tododone =
'todo';
14395 $histo[$numaction] = array(
14396 'type' => $obj->type,
14397 'tododone' => $tododone,
14399 'datestart' => $db->jdate($obj->dp),
14400 'dateend' => $db->jdate($obj->dp2),
14401 'note' => $obj->label,
14403 'percent' => $obj->percent,
14405 'userid' => $obj->user_id,
14406 'login' => $obj->user_login,
14407 'userfirstname' => $obj->user_firstname,
14408 'userlastname' => $obj->user_lastname,
14409 'userphoto' => $obj->user_photo,
14410 'msg_from' => $obj->msg_from,
14412 'contact_id' => $obj->fk_contact,
14413 'socpeopleassigned' => $contactaction->socpeopleassigned,
14414 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
14415 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
14416 'fk_element' => $obj->fk_element,
14417 'elementtype' => $obj->elementtype,
14419 'acode' => $obj->acode,
14420 'alabel' => $obj->alabel,
14421 'libelle' => $obj->alabel,
14422 'apicto' => $obj->apicto
14425 $histo[$numaction] = array(
14426 'type' => $obj->type,
14427 'tododone' =>
'done',
14429 'datestart' => $db->jdate($obj->dp),
14430 'dateend' => $db->jdate($obj->dp2),
14431 'note' => $obj->label,
14433 'percent' => $obj->percent,
14434 'acode' => $obj->acode,
14436 'userid' => $obj->user_id,
14437 'login' => $obj->user_login,
14438 'userfirstname' => $obj->user_firstname,
14439 'userlastname' => $obj->user_lastname,
14440 'userphoto' => $obj->user_photo
14455 if (!isModEnabled(
'agenda')) {
14456 $langs->loadLangs(array(
"admin",
"errors"));
14457 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
14460 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
14461 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
14463 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
14464 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
14465 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
14466 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
14471 $userstatic =
new User($db);
14472 $contactstatic =
new Contact($db);
14473 $userGetNomUrlCache = array();
14474 $contactGetNomUrlCache = array();
14476 $out .=
'<div class="filters-container" >';
14477 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
14478 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
14480 if ($objcon && get_class($objcon) ==
'Contact' &&
14481 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
14482 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
14484 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
14486 if (($filterobj && get_class($filterobj) ==
'Societe')) {
14487 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
14489 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
14494 $out .=
'<div class="div-table-responsive-no-min">';
14495 $out .=
'<table class="noborder borderbottom centpercent">';
14497 $out .=
'<tr class="liste_titre">';
14501 $out .=
'<th class="liste_titre width50 middle">';
14502 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14503 $out .= $searchpicto;
14508 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ').
"\n";
14510 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
14512 $out .=
'<th class="liste_titre"></th>';
14515 $out .=
'<th class="liste_titre">';
14516 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
14517 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
14520 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
14521 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
14526 $out .=
'<th class="liste_titre width50 middle">';
14527 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14528 $out .= $searchpicto;
14534 $out .=
'</table>';
14541 $out .=
'<ul class="timeline">';
14545 if ($filterobj instanceof
Societe) {
14546 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14548 if ($filterobj instanceof
User) {
14549 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14551 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
14552 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
14553 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
14555 if ($filterobj instanceof
Societe) {
14558 if ($filterobj instanceof
User) {
14564 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
14566 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
14568 $actualCycleDate =
false;
14571 foreach ($histo as $key => $value) {
14572 $actionstatic->fetch($histo[$key][
'id']);
14574 $actionstatic->type_picto = $histo[$key][
'apicto'];
14575 $actionstatic->type_code = $histo[$key][
'acode'];
14577 $labeltype = $actionstatic->type_code;
14578 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
14579 $labeltype =
'AC_OTH';
14581 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14582 $labeltype = $langs->trans(
"Message");
14584 if (!empty($arraylist[$labeltype])) {
14585 $labeltype = $arraylist[$labeltype];
14587 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
14588 $labeltype .=
' - '.$arraylist[$actionstatic->code];
14592 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
14594 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
14596 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
14597 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
14598 $out .=
'<!-- timeline time label -->';
14599 $out .=
'<li class="time-label">';
14600 $out .=
'<span class="timeline-badge-date">';
14601 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
14604 $out .=
'<!-- /.timeline-label -->';
14608 $out .=
'<!-- timeline item -->'.
"\n";
14609 $out .=
'<li class="timeline-code-'.(!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none").
'">';
14612 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
14617 $out .=
'<div class="timeline-item">'.
"\n";
14619 $out .=
'<span class="time timeline-header-action2">';
14621 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
14622 $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").
' ';
14623 $out .= $histo[$key][
'id'];
14626 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
14629 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
14630 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
14631 $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).
'">';
14633 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
14640 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
14641 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
14642 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
14643 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
14644 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
14645 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
14646 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
14648 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
14652 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14655 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14658 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
14661 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14667 $out .=
"</span></span>\n";
14670 $out .=
'<h3 class="timeline-header">';
14673 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
14674 if ($histo[$key][
'userid'] > 0) {
14675 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
14676 $userstatic->fetch($histo[$key][
'userid']);
14677 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
14679 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
14680 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
14681 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
14682 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
14683 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
14685 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
14688 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
14693 $out .=
' <div class="messaging-title inline-block">';
14695 if (empty(
$conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
14696 $out .= $labeltype.
' - ';
14700 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14701 $out .= $langs->trans(
'TicketNewMessage');
14702 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14703 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
14704 } elseif (isset($histo[$key][
'type'])) {
14705 if ($histo[$key][
'type'] ==
'action') {
14706 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14707 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
14708 $libelle = $histo[$key][
'note'];
14709 $actionstatic->id = $histo[$key][
'id'];
14711 } elseif ($histo[$key][
'type'] ==
'mailing') {
14712 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
14713 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14714 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
14717 $libelle .= $histo[$key][
'note'];
14722 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
14723 if (isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
14724 $link =
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
14726 if (!isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
14727 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
14729 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
14730 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
14733 $out .=
' - '.$link;
14742 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
14743 && $actionstatic->code !=
'AC_TICKET_CREATE'
14744 && $actionstatic->code !=
'AC_TICKET_MODIFY'
14746 $out .=
'<div class="timeline-body wordbreak small">';
14747 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
14749 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
14750 $out .=
'<div class="readmore-block --closed" >';
14751 $out .=
' <div class="readmore-block__excerpt">';
14753 $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>';
14755 $out .=
' <div class="readmore-block__full-text" >';
14757 $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>';
14771 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
14773 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
14774 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14776 $contact->fetch($cid);
14777 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14779 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
14783 $contactList .= !empty($contactList) ?
', ' :
'';
14784 $contactList .= $contact->getNomUrl(1);
14785 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14786 if (!empty($contact->phone_pro)) {
14787 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
14793 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
14794 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
14795 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14797 $result = $contact->fetch($histo[$key][
'contact_id']);
14798 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14800 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
14801 $result = ($contact instanceof
Contact) ? $contact->id : 0;
14805 $footer .= $contact->getNomUrl(1);
14806 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14807 if (!empty($contact->phone_pro)) {
14808 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
14815 if (!empty($documents)) {
14816 $footer .=
'<div class="timeline-documents-container">';
14817 foreach ($documents as $doc) {
14818 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
14819 $footer .=
' data-id="'.$doc->id.
'" ';
14820 $footer .=
' data-path="'.$doc->filepath.
'"';
14821 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
14824 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
14826 $file = $actionstatic->id.
'/'.$doc->filename;
14827 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
14828 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.
$conf->entity;
14829 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.
$conf->entity;
14831 $mimeAttr =
' mime="'.$mime.
'" ';
14833 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
14834 $class .=
' documentpreview';
14837 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
14838 $footer .=
img_mime($filePath).
' '.$doc->filename;
14841 $footer .=
'</span>';
14843 $footer .=
'</div>';
14846 if (!empty($footer)) {
14847 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
14850 $out .=
'</div>'.
"\n";
14853 $out .=
'<!-- END timeline item -->';
14859 jQuery(document).ready(function () {
14860 $(document).on("click", "[data-read-more-action]", function(e){
14861 let readMoreBloc = $(this).closest(".readmore-block");
14862 if(readMoreBloc.length > 0){
14863 e.preventDefault();
14864 if($(this).attr("data-read-more-action") == "close"){
14865 readMoreBloc.addClass("--closed").removeClass("--open");
14866 $("html, body").animate({
14867 scrollTop: readMoreBloc.offset().top - 200
14870 readMoreBloc.addClass("--open").removeClass("--closed");
14878 if (empty($histo)) {
14879 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
14902function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
14904 if ($timestamp ===
null) {
14905 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
14912 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
14913 $TParam = array_merge($TParam, array(
14920 return '&' . http_build_query($TParam);
14941function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
14943 global
$conf, $db, $langs, $hookmanager;
14946 if (!is_object($langs)) {
14947 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
14949 $langs->setDefaultLang();
14952 $langs->load(
"errors");
14954 if ($printheader) {
14955 if (function_exists(
"llxHeader")) {
14957 } elseif (function_exists(
"llxHeaderVierge")) {
14962 print
'<div class="error">';
14963 if (empty($message)) {
14964 print $langs->trans(
"ErrorRecordNotFound");
14966 print $langs->trans($message);
14971 if (empty($showonlymessage)) {
14972 if (empty($hookmanager)) {
14973 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
14976 $hookmanager->initHooks(array(
'main'));
14979 $parameters = array(
'message' => $message,
'params' => $params);
14980 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
14981 print $hookmanager->resPrint;
14984 if ($printfooter && function_exists(
"llxFooter")) {
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined( 'NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined( 'NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) if(!defined( 'NOLOGIN')) if(!defined('NOCSRFCHECK')) if(!defined( 'NOIPCHECK')) llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[])
Header function.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='')
On/off button to change a property status of an object This uses the ajax service objectonoff....
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage agenda events (actions)
Class to manage different types of events.
Class to manage GeoIP conversion Usage: $geoip=new GeoIP('country',$datfile); $geoip->getCountryCodeF...
Class to manage invoices.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
dol_get_prev_month($month, $year)
Return previous month.
dol_get_next_day($day, $month, $year)
Return next day.
getServerTimeZoneInt($refgmtdate='now')
Return server timezone int.
dol_get_prev_day($day, $month, $year)
Return previous day.
dol_get_next_month($month, $year)
Return next month.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert an image file or a PDF into another image format.
dragAndDropFileUpload($htmlname)
Function to manage the drag and drop of a file.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_is_dir($folder)
Test if filename is a directory.
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
isValidVATID($company)
Check if VAT numero is valid (check done on syntax only, no database or remote access)
dol_html_entity_decode($a, $b, $c='UTF-8', $keepsomeentities=0)
Replace html_entity_decode functions to manage errors.
dol_fiche_end($notab=0)
Show tab footer of a card.
verifCond($strToEvaluate, $onlysimplestring='1')
Verify if condition in string is ok or not.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
getDolGlobalFloat($key, $default=0)
Return a Dolibarr global constant float value.
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formatted size.
isOnlyOneLocalTax($local)
Return true if LocalTax (1 or 2) is unique.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) If ...
img_weather($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $morecss='')
Show weather picto.
dolCheckFilters($sqlfilters, &$error='', &$parenthesislevel=0)
Return if a $sqlfilters parameter has a valid balance of parenthesis.
finishSimpleTable($addLineBreak=false)
Add the correct HTML close tags for "startSimpleTable(...)" (use after the last table line)
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
getLanguageCodeFromCountryCode($countrycode)
Return default language from country code.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
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.
dol_print_socialnetworks($value, $cid, $socid, $type, $dictsocialnetworks=array())
Show social network link.
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.
img_right($titlealt='default', $selected=0, $moreatt='')
Show right arrow logo.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
dol_strtolower($string, $encoding="UTF-8")
Convert a string to lower.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
dol_htmlentitiesbr_decode($stringtodecode, $pagecodeto='UTF-8')
This function is called to decode a HTML string (it decodes entities and br tags)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_left($titlealt='default', $selected=0, $moreatt='')
Show left arrow logo.
dol_print_ip($ip, $mode=0)
Return an IP formatted to be shown on screen.
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
Function to test if an entry is enabled or not.
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_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0, $allowscript=0, $allowstyle=0)
Clean a string to keep only desirable HTML tags.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
isASecretKey($keyname)
Return if string has a name dedicated to store a secret.
dolPrintHTMLForTextArea($s, $allowiframe=0)
Return a string ready to be output on input textarea.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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).
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
roundUpToNextMultiple($n, $x=5)
Round to next multiple.
dol_user_country()
Return country code for current user.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=null)
Clean a string from some undesirable HTML tags.
getMultidirTemp($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its temporary ...
isHTTPS()
Return if we are using a HTTPS connection Check HTTPS (no way to be modified by user but may be empty...
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
picto_required()
Return picto saying a field is required.
isDolTms($timestamp)
isDolTms check if a timestamp is valid.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
GETPOSTDATE($prefix, $hourTime='', $gm='auto')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
checkVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
dolGetBadge($label, $html='', $type='primary', $mode='', $url='', $params=array())
Function dolGetBadge.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
getTaxesFromId($vatrate, $buyer=null, $seller=null, $firstparamisid=1)
Get tax (VAT) main information from Id.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dolPrintText($s)
Return a string label (possible on several lines and that should not contains any HTML) ready to be o...
utf8_valid($str)
Check if a string is in UTF8.
getPictoForType($key, $morecss='')
Return the picto for a data type.
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
img_allow($allow, $titlealt='default')
Show tick logo if allowed.
isValidMXRecord($domain)
Return if the domain name has a valid MX record.
dolButtonToOpenExportDialog($name, $label, $buttonstring, $exportSiteName, $overwriteGitUrl, $website)
Create a dialog with two buttons for export and overwrite of a website.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tab header of a card.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
get_localtax_by_third($local)
Get values of localtaxes (1 or 2) for company country for the common vat with the highest value.
dol_escape_php($stringtoescape, $stringforquotes=2)
Returns text escaped for inclusion into a php string, build with double quotes " or '.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getElementProperties($elementType)
Get an array with properties of an element.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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.
dolPrintHTMLForAttribute($s)
Return a string ready to be output on an HTML attribute (alt, title, data-html, .....
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolCompletUrlForDropdownButton(string $url, array $params, bool $addDolUrlRoot=true)
An function to complete dropdown url in dolGetButtonAction.
dol_get_object_properties($obj, $properties=[])
Get properties for an object - including magic properties when requested.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
dol_strftime($fmt, $ts=false, $is_gmt=false)
Format a string.
img_picto_common($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $notitle=0)
Show picto (generic function)
img_search($titlealt='default', $other='')
Show search logo.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
fieldLabel($langkey, $fieldkey, $fieldrequired=0)
Show a string with the label tag dedicated to the HTML edit field.
getBrowserInfo($user_agent)
Return information about user browser.
dolGetFirstLetters($s, $nbofchar=1)
Return first letters of a strings.
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
dol_strtoupper($string, $encoding="UTF-8")
Convert a string to upper.
getMultidirVersion($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its versioned ...
dol_sanitizeUrl($stringtoclean, $type=1)
Clean a string to use it as an URL (into a href or src attribute)
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
img_printer($titlealt="default", $other='')
Show printer logo.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
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...
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
getArrayOfSocialNetworks()
Get array of social network dictionary.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
num2Alpha($n)
Return a numeric value into an Excel like column number.
dol_size($size, $type='')
Optimize a size for some browsers (phone, smarphone...)
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
img_pdf($titlealt='default', $size=3)
Show pdf logo.
dolGetCountryCodeFromIp($ip)
Return a country code from IP.
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dolPrintPassword($s)
Return a string ready to be output on an HTML attribute (alt, title, ...)
colorIsLight($stringcolor)
Return true if the color is light.
dol_escape_all($stringtoescape)
Returns text escaped for all protocols (so only alpha chars and numbers)
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
readfileLowMemory($fullpath_original_file_osencoded, $method=-1)
Return a file on output using a low memory.
dolForgeSQLCriteriaCallback($matches)
Function to forge a SQL criteria from a USF (Universal Filter Syntax) string.
if(!function_exists( 'utf8_encode')) if(!function_exists('utf8_decode')) if(!function_exists( 'str_starts_with')) if(!function_exists('str_ends_with')) if(!function_exists( 'str_contains')) getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
fetchObjectByElement($element_id, $element_type, $element_ref='', $useCache=0, $maxCacheByType=10)
Fetch an object from its id and element_type Inclusion of classes is automatic.
print_titre($title)
Show a title.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_string_nounprintableascii($str, $removetabcrlf=1)
Clean a string from all non printable ASCII chars (0x00-0x1F and 0x7F).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
img_error($titlealt='default')
Show error logo.
getTimelineIcon($actionstatic, &$histo, $key)
Get timeline icon.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formatted messages to output (Used to show messages on html output).
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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.
isAFileWithExecutableContent($filename)
Return if a file can contains executable content.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_string_is_good_iso($s, $clean=0)
Check if a string is a correct iso string If not, it will not be considered as HTML encoded even if i...
getNonce()
Return a random string to be used as a nonce value for js.
isStringVarMatching($var, $regextext, $matchrule=1)
Check if a variable with name $var startx with $text.
complete_head_from_modules($conf, $langs, $object, &$head, &$h, $type, $mode='add', $filterorigmodule='')
Complete or removed entries into a head array (used to build tabs).
get_htmloutput_mesg($mesgstring='', $mesgarray=[], $style='ok', $keepembedded=0)
Get formatted messages to output (Used to show messages on html output).
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
get_product_localtax_for_country($idprod, $local, $thirdpartytouse)
Return localtax vat rate of a product in a particular country or default country vat if product is un...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
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 link.
jsonOrUnserialize($stringtodecode)
Decode an encode string.
addSummaryTableLine($tableColumnCount, $num, $nbofloop=0, $total=0, $noneWord="None", $extraRightColumn=false)
Add a summary line to the current open table ("None", "XMoreLines" or "Total xxx")
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.
get_product_vat_for_country($idprod, $thirdpartytouse, $idprodfournprice=0)
Return vat rate of a product in a particular country, or default country vat if product is unknown.
dolForgeDummyCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
getUserRemoteIP()
Return the IP of remote user.
sanitizeVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
dol_validElement($element)
Return if var element is ok.
dol_sanitizeKeyCode($str)
Clean a string to use it as a key or code.
img_credit_card($brand, $morecss=null)
Return image of a credit card according to its brand name.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_searchclear($titlealt='default', $other='')
Show search logo.
dolPrintLabel($s)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
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).
startSimpleTable($header, $link="", $arguments="", $emptyColumns=0, $number=-1, $pictofulllist='')
Start a table with headers and a optional clickable number (don't forget to use "finishSimpleTable()"...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
getFieldErrorIcon($fieldValidationErrorMsg)
get field error icon
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
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.
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
div refaddress div address
conf($dolibarr_main_document_root)
Load conf file (file must exists)
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
realCharForNumericEntities($matches)
Return the real char for a numeric entities.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
dol_setcache($memoryid, $data, $expire=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
dolGetRandomBytes($length)
Return a string of random bytes (hexa string) with length = $length for cryptographic purposes.