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) {
166 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_output')) {
168 if ($mode !=
'outputrel') {
169 $s =
$conf->$module->dir_output;
171 if ($forobject &&
$object->id > 0) {
176 return 'error-diroutput-not-defined-for-this-object='.$module;
178 } elseif ($mode ==
'temp') {
179 if (isset(
$conf->$module) && property_exists(
$conf->$module,
'multidir_temp')) {
181 } elseif (isset(
$conf->$module) && property_exists(
$conf->$module,
'dir_temp')) {
182 return $conf->$module->dir_temp;
184 return 'error-dirtemp-not-defined-for-this-object='.$module;
187 return 'error-bad-value-for-mode';
231 return (
string) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
246 return (
int) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
261 return (
float) (isset(
$conf->global->$key) ?
$conf->global->$key : $default);
275 return (
bool) (
$conf->global->$key ?? $default);
289 if (empty($tmpuser)) {
294 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
307 if (empty($tmpuser)) {
312 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
329 'adherent' =>
'member',
330 'member_type' =>
'adherent_type',
332 'contrat' =>
'contract',
333 'entrepot' =>
'stock',
334 'projet' =>
'project',
335 'categorie' =>
'category',
336 'commande' =>
'order',
337 'expedition' =>
'shipping',
338 'facture' =>
'invoice',
339 'fichinter' =>
'intervention',
340 'ficheinter' =>
'intervention',
341 'propale' =>
'propal',
342 'socpeople' =>
'contact',
343 'fournisseur' =>
'supplier',
345 'actioncomm' =>
'agenda',
346 'product_price' =>
'productprice',
347 'product_fournisseur_price' =>
'productsupplierprice',
357function isModEnabled($module)
367 $arrayconv[
'supplier_order'] =
'fournisseur';
368 $arrayconv[
'supplier_invoice'] =
'fournisseur';
373 if ($module ==
'delivery_note') {
377 $module =
'shipping';
381 $module_alt = $module;
382 if (!empty($arrayconv[$module])) {
383 $module_alt = $arrayconv[$module];
385 $module_bis = $module;
386 if (!empty($arrayconvbis[$module])) {
387 $module_bis = $arrayconvbis[$module];
390 return !empty(
$conf->modules[$module]) || !empty(
$conf->modules[$module_alt]) || !empty(
$conf->modules[$module_bis]);
402 if ($timestamp ===
'') {
403 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page '.$_SERVER[
"PHP_SELF"] .
getCallerInfoString(), LOG_NOTICE);
406 if (is_null($timestamp) || !is_numeric($timestamp)) {
426 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
428 $class =
'DoliDB'.ucfirst($type);
429 $db =
new $class($type, $host, $user, $pass, $name, $port);
450function getEntity($element, $shared = 1, $currentobject =
null)
454 if (!is_object($hookmanager)) {
455 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
462 $element =
'project';
465 $element =
'contract';
467 case 'order_supplier':
468 $element =
'supplier_order';
470 case 'invoice_supplier':
471 $element =
'supplier_invoice';
475 if (is_object($mc)) {
476 $out = $mc->getEntity($element, $shared, $currentobject);
479 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
481 $addzero[] =
'c_holiday_types';
483 if (in_array($element, $addzero)) {
486 $out .= ((int)
$conf->entity);
491 'element' => $element,
494 'currentobject' => $currentobject,
497 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
499 if (is_numeric($reshook)) {
500 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
501 $out .=
','.$hookmanager->resPrint;
502 } elseif ($reshook == 1) {
503 $out = $hookmanager->resPrint;
520 if (is_object($mc) && method_exists($mc,
'setEntity')) {
521 return $mc->setEntity($currentobject);
523 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity :
$conf->entity);
535 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
547 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
548 $r = chr($n % 26 + 0x41) . $r;
572 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
579 $user_agent = substr($user_agent, 0, 512);
581 $detectmobile =
new Mobile_Detect(
null, $user_agent);
582 $tablet = $detectmobile->isTablet();
584 if ($detectmobile->isMobile()) {
588 if ($detectmobile->is(
'AndroidOS')) {
589 $os = $phone =
'android';
590 } elseif ($detectmobile->is(
'BlackBerryOS')) {
591 $os = $phone =
'blackberry';
592 } elseif ($detectmobile->is(
'iOS')) {
595 } elseif ($detectmobile->is(
'PalmOS')) {
596 $os = $phone =
'palm';
597 } elseif ($detectmobile->is(
'SymbianOS')) {
599 } elseif ($detectmobile->is(
'webOS')) {
601 } elseif ($detectmobile->is(
'MaemoOS')) {
603 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
609 if (preg_match(
'/linux/i', $user_agent)) {
611 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
613 } elseif (preg_match(
'/windows/i', $user_agent)) {
619 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
621 $version = empty($reg[2]) ?
'' : $reg[2];
622 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
624 $version = empty($reg[2]) ?
'' : $reg[2];
625 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
627 $version = empty($reg[2]) ?
'' : $reg[2];
628 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
631 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
633 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
635 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
637 $version = empty($reg[2]) ?
'' : $reg[2];
638 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
641 $version = empty($reg[2]) ?
'' : $reg[2];
642 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
644 $version = end($reg);
645 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
648 $version = end($reg);
649 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
651 $name =
'textbrowser';
652 $version = empty($reg[3]) ?
'' : $reg[3];
653 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
655 $name =
'textbrowser';
656 $version = empty($reg[1]) ?
'' : $reg[1];
668 'browsername' => $name,
669 'browserversion' => $version,
671 'browserua' => $user_agent,
686 $disconnectdone =
false;
688 if (is_object($db) && !empty($db->connected)) {
689 $depth = $db->transaction_opened;
690 $disconnectdone = $db->close();
692 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));
704function GETPOSTISSET($paramname)
708 $relativepathstring = $_SERVER[
"PHP_SELF"];
710 if (constant(
'DOL_URL_ROOT')) {
711 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
713 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
714 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
720 if (!empty($_GET[
'restore_lastsearch_values'])) {
721 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
722 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
723 if (is_array($tmp)) {
724 foreach ($tmp as $key => $val) {
725 if ($key == $paramname) {
733 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
735 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
737 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
739 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
743 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
760 if (empty($method)) {
761 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
762 } elseif ($method == 1) {
763 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
764 } elseif ($method == 2) {
765 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
766 } elseif ($method == 3) {
767 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
769 $val =
'BadFirstParameterForGETPOST';
772 return is_array($val);
805function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
807 global $mysoc, $user,
$conf;
809 if (empty($paramname)) {
810 return 'BadFirstParameterForGETPOST';
813 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);
818 if (empty($method)) {
819 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
820 } elseif ($method == 1) {
821 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
822 } elseif ($method == 2) {
823 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
824 } elseif ($method == 3) {
825 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
827 return 'BadThirdParameterForGETPOST';
830 $relativepathstring =
'';
832 if (empty($method) || $method == 3 || $method == 4) {
833 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
835 if (constant(
'DOL_URL_ROOT')) {
836 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
838 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
839 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
845 if (!empty($_GET[
'restore_lastsearch_values'])) {
846 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
847 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
848 if (is_array($tmp)) {
849 foreach ($tmp as $key => $val) {
850 if ($key == $paramname) {
858 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
859 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
860 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
861 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
862 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
863 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
864 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
865 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
867 } elseif (!isset($_GET[
'sortfield'])) {
870 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
873 '@phan-var-force CommonObject $object';
874 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
876 $out =
$object->fields[$paramname][
'default'];
880 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
882 if (!empty($user->default_values)) {
883 if (isset($user->default_values[$relativepathstring][
'createform'])) {
884 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
886 if ($defkey !=
'_noquery_') {
887 $tmpqueryarraytohave = explode(
'&', $defkey);
890 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
891 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
904 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
905 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
912 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
914 if (!empty($user->default_values)) {
917 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
919 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
921 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
923 if ($defkey !=
'_noquery_') {
924 $tmpqueryarraytohave = explode(
'&', $defkey);
927 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
928 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
941 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
942 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
946 if ($paramname ==
'sortfield') {
949 if ($paramname ==
'sortorder') {
957 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
958 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
959 if (!empty($_GET[
'disabledefaultvalues'])) {
963 if ($defkey !=
'_noquery_') {
964 $tmpqueryarraytohave = explode(
'&', $defkey);
967 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
968 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
980 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
982 if (isset($_POST[
'search_all']) || isset($_GET[
'search_all'])) {
985 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
986 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
989 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
990 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
1005 '@phan-var-force string $paramname';
1006 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
1011 while (preg_match(
'/__([A-Z0-9]+(?:_[A-Z0-9]+){0,3})__/i', $out, $reg) && ($loopnb < $maxloop)) {
1015 if ($reg[1] ==
'DAY') {
1017 $newout = $tmp[
'mday'];
1018 } elseif ($reg[1] ==
'MONTH') {
1020 $newout = $tmp[
'mon'];
1021 } elseif ($reg[1] ==
'YEAR') {
1023 $newout = $tmp[
'year'];
1024 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
1027 $newout = $tmp2[
'day'];
1028 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
1031 $newout = $tmp2[
'month'];
1032 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
1034 $newout = ($tmp[
'year'] - 1);
1035 } elseif ($reg[1] ==
'NEXT_DAY') {
1038 $newout = $tmp2[
'day'];
1039 } elseif ($reg[1] ==
'NEXT_MONTH') {
1042 $newout = $tmp2[
'month'];
1043 } elseif ($reg[1] ==
'NEXT_YEAR') {
1045 $newout = ($tmp[
'year'] + 1);
1046 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1047 $newout = $mysoc->country_id;
1048 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1049 $newout = $user->id;
1050 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1051 $newout = $user->fk_user;
1052 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1053 $newout =
$conf->entity;
1054 } elseif ($reg[1] ==
'ID') {
1060 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1065 if (preg_match(
'/^array/', $check)) {
1066 if (!is_array($out) || empty($out)) {
1069 $tmparray = explode(
':', $check);
1070 if (!empty($tmparray[1])) {
1071 $tmpcheck = $tmparray[1];
1073 $tmpcheck =
'alphanohtml';
1075 foreach ($out as $outkey => $outval) {
1076 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1082 if (strpos($paramname,
'search_') === 0) {
1083 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1087 $out =
sanitizeVal($out, $check, $filter, $options);
1094 if (preg_match(
'/^backto/i', $paramname)) {
1095 $out = str_replace(
'\\',
'/', $out);
1096 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1098 $oldstringtoclean = $out;
1099 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1100 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1101 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1102 }
while ($oldstringtoclean != $out);
1107 if (empty($method) || $method == 3 || $method == 4) {
1108 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1115 if ($out !=
'' && isset($user)) {
1116 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1135 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1167function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto')
1170 if ($hourTime ===
'getpost') {
1174 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
1175 $hour = intval($m[1]);
1176 $minute = intval($m[2]);
1177 $second = intval($m[3]);
1179 $hour = $minute = $second = 0;
1182 $hour = (int) min($hour, 23);
1183 $minute = (int) min($minute, 59);
1184 $second = (int) min($second, 59);
1200function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1202 return sanitizeVal($out, $check, $filter, $options);
1214function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1223 if (!is_numeric($out)) {
1228 if (is_array($out)) {
1229 $out = implode(
',', $out);
1231 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1236 $out = filter_var($out, FILTER_SANITIZE_STRING);
1239 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1242 if (!is_array($out)) {
1244 if (preg_match(
'/[^a-z]+/i', $out)) {
1250 if (!is_array($out)) {
1252 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1258 if (!is_array($out)) {
1260 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1266 if (!is_array($out)) {
1268 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1275 if (!is_array($out)) {
1278 $oldstringtoclean = $out;
1282 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1289 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1290 }
while ($oldstringtoclean != $out);
1294 case 'alphawithlgt':
1295 if (!is_array($out)) {
1298 $oldstringtoclean = $out;
1302 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1309 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1310 }
while ($oldstringtoclean != $out);
1316 case 'restricthtmlnolink':
1317 case 'restricthtml':
1318 case 'restricthtmlallowclass':
1319 case 'restricthtmlallowlinkscript':
1320 case 'restricthtmlallowunvalid':
1325 if (empty($filter)) {
1326 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1328 if (is_null($options)) {
1331 $out = filter_var($out, $filter, $options);
1335 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1336 $out =
GETPOST($out,
'alphanohtml');
1344if (!function_exists(
'dol_getprefix')) {
1355 function dol_getprefix($mode =
'')
1358 if ($mode ==
'email') {
1364 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1365 return $_SERVER[
"SERVER_NAME"];
1370 if (!empty(
$conf->file->instance_unique_id)) {
1371 return sha1(
'dolibarr'.
$conf->file->instance_unique_id);
1375 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1379 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1380 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1383 if (!empty($tmp_instance_unique_id)) {
1384 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1388 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1389 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1391 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1408 global
$conf, $langs, $user, $mysoc;
1412 if (!file_exists($fullpath)) {
1413 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1417 if (!empty($classname) && !class_exists($classname)) {
1418 return include $fullpath;
1420 return include_once $fullpath;
1438function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1442 $path = preg_replace(
'/^\//',
'', $path);
1445 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1446 if (is_array(
$conf->file->dol_document_root)) {
1447 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1448 if ($key ==
'main') {
1452 if (@file_exists($dirroot.
'/'.$path)) {
1453 $res = $dirroot.
'/'.$path;
1458 if ($returnemptyifnotfound) {
1460 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1472 $res = DOL_URL_ROOT.
'/'.$path;
1475 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1478 $res = DOL_URL_ROOT.
'/'.$path;
1481 foreach (
$conf->file->dol_document_root as $key => $dirroot) {
1482 if ($key ==
'main') {
1487 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1488 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1491 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1496 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1497 if (!empty($regs[1])) {
1500 if (@file_exists($dirroot.
'/'.$regs[1])) {
1502 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1503 } elseif ($type == 2) {
1504 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).
$conf->file->dol_url_root[$key].
'/'.$path;
1505 } elseif ($type == 3) {
1509 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$conf->file->dol_main_url_root));
1510 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1513 $res = (preg_match(
'/^http/i',
$conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
$conf->file->dol_url_root[$key].
'/'.$path;
1537 if (empty($properties)) {
1538 return get_object_vars($obj);
1541 $existingProperties = [];
1542 $realProperties = get_object_vars($obj);
1545 foreach ($properties as $property) {
1546 if (array_key_exists($property, $realProperties)) {
1548 $existingProperties[$property] = $obj->{$property};
1549 } elseif (property_exists($obj, $property)) {
1551 $existingProperties[$property] = $obj->{$property};
1555 return $existingProperties;
1584 $myclone = unserialize(serialize(
$object));
1586 if (!empty($tmpsavdb)) {
1589 } elseif ($native == 2) {
1592 $tmparray = get_object_vars(
$object);
1594 if (is_array($tmparray)) {
1595 foreach ($tmparray as $propertykey => $propertyval) {
1596 if (is_scalar($propertyval) || is_array($propertyval)) {
1597 $myclone->$propertykey = $propertyval;
1617function dol_size($size, $type =
'')
1620 if (empty(
$conf->dol_optimize_smallscreen)) {
1623 if ($type ==
'width' && $size > 250) {
1648 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1650 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1651 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1652 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1653 $tmp = str_replace(
'..',
'', $tmp);
1674 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1681 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1682 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1683 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1684 $tmp = str_replace(
'..',
'', $tmp);
1699 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1701 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1703 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1707 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1711 $oldstringtoclean = $stringtoclean;
1714 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1715 }
while ($oldstringtoclean != $stringtoclean);
1719 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1722 return $stringtoclean;
1734 $oldstringtoclean = $stringtoclean;
1735 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1736 }
while ($oldstringtoclean != $stringtoclean);
1738 return $stringtoclean;
1751 return preg_replace(
'/[^\w]+/',
'', $str);
1765 if (is_null($str)) {
1770 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1771 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1772 return $transliterator->transliterate($str);
1775 $string = rawurlencode($str);
1776 $replacements = array(
1777 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1779 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1780 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1782 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1784 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1785 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1786 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1788 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1789 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1791 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1793 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1794 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1796 $string = strtr($string, $replacements);
1797 return rawurldecode($string);
1802 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1803 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1804 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1805 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1806 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1807 \xF9\xFA\xFB\xFC\xFD\xFF",
1815 $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"));
1833function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1835 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1836 if (empty($keepspaces)) {
1837 $forbidden_chars_to_replace[] =
" ";
1839 $forbidden_chars_to_remove = array();
1842 if (is_array($badcharstoreplace)) {
1843 $forbidden_chars_to_replace = $badcharstoreplace;
1845 if (is_array($badcharstoremove)) {
1846 $forbidden_chars_to_remove = $badcharstoremove;
1850 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1869 if ($removetabcrlf) {
1870 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1872 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1884function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
1886 if (is_null($stringtoescape)) {
1891 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
1893 if (empty($noescapebackslashn)) {
1894 $substitjs[
"\n"] =
'\\n';
1895 $substitjs[
'\\'] =
'\\\\';
1898 $substitjs[
"'"] =
"\\'";
1899 $substitjs[
'"'] =
"\\'";
1900 } elseif ($mode == 1) {
1901 $substitjs[
"'"] =
"\\'";
1902 } elseif ($mode == 2) {
1903 $substitjs[
'"'] =
'\\"';
1904 } elseif ($mode == 3) {
1905 $substitjs[
"'"] =
"\\'";
1906 $substitjs[
'"'] =
"\\\"";
1908 return strtr($stringtoescape, $substitjs);
1922 return rawurlencode($stringtoescape);
1933 return str_replace(
'"',
'\"', $stringtoescape);
1945 if (is_null($stringtoescape)) {
1949 if ($stringforquotes == 2) {
1950 return str_replace(
'"',
"'", $stringtoescape);
1951 } elseif ($stringforquotes == 1) {
1957 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
1958 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1961 return 'Bad parameter for stringforquotes in dol_escape_php';
1972 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
1983 return $stringtoescape;
2035 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
2060 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
2080function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
2082 if ($noescapetags ==
'common') {
2083 $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';
2085 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
2087 if ($cleanalsojavascript) {
2092 if ($escapeonlyhtmltags) {
2093 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
2095 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
2096 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE', $tmp);
2099 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
2102 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
2103 } elseif ($keepn == -1) {
2104 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
2107 if ($escapeonlyhtmltags) {
2108 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2111 $tmparrayoftags = array();
2112 if ($noescapetags) {
2113 $tmparrayoftags = explode(
',', $noescapetags);
2115 if (count($tmparrayoftags)) {
2117 $tmp = str_ireplace(
'__DOUBLEQUOTE',
'', $tmp);
2119 foreach ($tmparrayoftags as $tagtoreplace) {
2120 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2121 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2122 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2128 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)>/', $tmp, $reg)) {
2129 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
2130 $tmpattributes = str_ireplace(
'href="http:',
'__HREFHTTPA', $tmpattributes);
2131 $tmpattributes = str_ireplace(
'href="https:',
'__HREFHTTPSA', $tmpattributes);
2132 $tmpattributes = str_ireplace(
'src="http:',
'__SRCHTTPIMG', $tmpattributes);
2133 $tmpattributes = str_ireplace(
'src="https:',
'__SRCHTTPSIMG', $tmpattributes);
2134 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2135 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2137 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2139 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)\s+\/>/', $tmp, $reg)) {
2140 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
2141 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2142 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2144 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'\s+\/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2147 $diff = strcmp($tmpold, $tmp);
2152 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2156 if (count($tmparrayoftags)) {
2157 foreach ($tmparrayoftags as $tagtoreplace) {
2158 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2159 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2160 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2161 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2162 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2165 $result = str_ireplace(
'__HREFHTTPA',
'href="http:', $result);
2166 $result = str_ireplace(
'__HREFHTTPSA',
'href="https:', $result);
2167 $result = str_ireplace(
'__SRCHTTPIMG',
'src="http:', $result);
2168 $result = str_ireplace(
'__SRCHTTPSIMG',
'src="https:', $result);
2169 $result = str_ireplace(
'__DOUBLEQUOTE',
'"', $result);
2172 $result = str_ireplace(
'__SIMPLEQUOTE',
''', $result);
2189 if (function_exists(
'mb_strtolower')) {
2190 return mb_strtolower($string, $encoding);
2192 return strtolower($string);
2206 if (function_exists(
'mb_strtoupper')) {
2207 return mb_strtoupper($string, $encoding);
2209 return strtoupper($string);
2223 if (function_exists(
'mb_substr')) {
2224 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2226 return ucfirst($string);
2240 if (function_exists(
'mb_convert_case')) {
2241 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2243 return ucwords($string);
2255 $backtrace = debug_backtrace();
2257 if (count($backtrace) >= 2) {
2258 $trace = $backtrace[1];
2259 if (isset($trace[
'file'], $trace[
'line'])) {
2260 $msg =
" From {$trace['file']}:{$trace['line']}.";
2288function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2290 global
$conf, $user, $debugbar;
2293 if (!isModEnabled(
'syslog')) {
2298 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2299 global $website, $websitekey;
2300 if (is_object($website) && !empty($website->ref)) {
2301 $suffixinfilename .=
'_website_'.$website->ref;
2302 } elseif (!empty($websitekey)) {
2303 $suffixinfilename .=
'_website_'.$websitekey;
2308 if (defined(
'USESUFFIXINLOG')) {
2309 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2313 foreach (
$conf->loghandlers as $loghandlerinstance) {
2314 $loghandlerinstance->setIdent($ident);
2318 if (!empty($message)) {
2320 $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');
2321 if (!array_key_exists($level, $logLevels)) {
2322 throw new Exception(
'Incorrect log level');
2329 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2333 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2334 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2335 $ospid = sprintf(
"%7s",
dol_trunc((
string) getmypid(), 7,
'right',
'UTF-8', 1));
2336 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2338 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2344 print
"\n\n<!-- Log start\n";
2346 print
"Log end -->\n";
2350 'message' => $message,
2351 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') : false),
2353 'user' => ((is_object($user) && $user->id) ? $user->login : false),
2355 'osuser' => function_exists(
'posix_getuid') ? posix_getuid() : false,
2356 'ospid' => getmypid()
2360 if (!empty($remoteip)) {
2361 $data[
'ip'] = $remoteip;
2363 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
2364 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
2365 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
2366 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
2368 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2370 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
2371 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2373 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'];
2375 $data[
'ip'] =
'???';
2378 if (!empty($_SERVER[
'USERNAME'])) {
2380 $data[
'osuser'] = $_SERVER[
'USERNAME'];
2381 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2383 $data[
'osuser'] = $_SERVER[
'LOGNAME'];
2387 foreach (
$conf->loghandlers as $loghandlerinstance) {
2388 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2391 $loghandlerinstance->export($data, $suffixinfilename);
2397 foreach (
$conf->loghandlers as $loghandlerinstance) {
2398 $loghandlerinstance->setIdent($ident);
2418 $form =
new Form($db);
2420 $templatenameforexport = $website->name_template;
2421 if (empty($templatenameforexport)) {
2422 $templatenameforexport =
'website_'.$website->ref;
2426 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2429 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2430 $out .=
'jQuery(document).ready(function () {';
2431 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2432 $out .=
' var dialogHtml = \'';
2434 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2435 $dialogcontent .=
' <div style="margin-top: 20px;">';
2436 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2437 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2438 $dialogcontent .=
' </div>';
2439 $dialogcontent .=
' <br>';
2440 $dialogcontent .=
' <div style="margin-top: 20px;">';
2441 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2442 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2443 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2444 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2445 $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>';
2446 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2447 $dialogcontent .=
' </form>';
2448 $dialogcontent .=
' </div>';
2449 $dialogcontent .=
' </div>';
2456 // Add the content of the dialog to the body of the page
2457 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2458 $out .= ' if ($dialog.length > 0) {
2461 jQuery(
"body").append(dialogHtml);
';
2463 // Configuration of popup
2464 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2465 $out .= ' autoOpen:
false,
';
2466 $out .= ' modal:
true,
';
2467 $out .= ' height: 290,
';
2468 $out .= ' width:
"40%",
';
2469 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2472 // Simulate a click on the original "submit" input to export the site.
2473 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2474 $out .= ' console.log(
"Clic on exportsite.");
';
2475 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2476 $out .= ' console.log(
"element founded:", target.length > 0);
';
2477 $out .= ' if (target.length > 0) { target.click(); }
';
2478 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2482 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2483 $out .= ' return false;
';
2486 $out .= '</script>
';
2508function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $backtopagejsfields = '', $accesskey = '')
2512 if (strpos($url, '?
') > 0) {
2513 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2515 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2520 $backtopagejsfieldsid = '';
2521 $backtopagejsfieldslabel = '';
2522 if ($backtopagejsfields) {
2523 $tmpbacktopagejsfields = explode(':
', $backtopagejsfields);
2524 if (empty($tmpbacktopagejsfields[1])) { // If the part 'keyforpopupid:
' is missing, we add $name for it.
2525 $backtopagejsfields = $name.":".$backtopagejsfields;
2526 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[0]);
2528 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[1]);
2530 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ? '' : $tmp2backtopagejsfields[0];
2531 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ? '' : $tmp2backtopagejsfields[1];
2532 $url .= '&backtopagejsfields=
'.urlencode($backtopagejsfields);
2535 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2536 $out .= '<!-- a link
for button to open url into a dialog popup with backtopagejsfields =
'.$backtopagejsfields.' -->
';
2537 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2538 if (empty($conf->use_javascript_ajax)) {
2539 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2540 } elseif ($jsonopen) {
2541 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2543 $out .= ' href=
"#"';
2545 $out .= '>
'.$buttonstring.'</a>
';
2547 if (!empty($conf->use_javascript_ajax)) {
2548 // Add code to open url using the popup. Add also hidden field to retrieve the returned variables
2549 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2550 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2551 $out .= '<div
id=
"varforreturndialogid'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned
id' : '').'</div>
';
2552 $out .= '<div
id=
"varforreturndialoglabel'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned label
' : '').'</div>
';
2554 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2555 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2556 jQuery(document).ready(
function () {
2557 jQuery(
".button_'.$name.'").click(
function () {
2558 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2559 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2560 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2564 height: (window.innerHeight - 150),
2567 open: function (event, ui) {
2568 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2570 close:
function (event, ui) {
2571 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2572 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2573 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2574 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2575 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2577 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2578 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2583 $tmpdialog.dialog(\
'open\');
2608function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2610 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2629function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2631 global
$conf, $langs, $hookmanager;
2635 if (!empty(
$conf->dol_optimize_smallscreen)) {
2639 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2641 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2642 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2646 if ($morehtmlright) {
2647 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2671 if (is_array($links) && !empty($links)) {
2672 $keys = array_keys($links);
2674 $maxkey = max($keys);
2680 if (empty($limittoshow)) {
2683 if (!empty(
$conf->dol_optimize_smallscreen)) {
2691 for ($i = 0; $i <= $maxkey; $i++) {
2692 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2694 if ($i >= $limittoshow) {
2700 for ($i = 0; $i <= $maxkey; $i++) {
2701 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2707 if ($i < $limittoshow || $isactive) {
2709 $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])).
' -->';
2711 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2712 if (!empty($links[$i][0])) {
2713 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2715 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2717 } elseif (!empty($links[$i][1])) {
2719 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2721 if (!empty($links[$i][0])) {
2722 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2723 $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).
'">';
2726 if ($displaytab == 0 && $picto) {
2727 $out .=
img_picto($title, $picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle paddingright marginrightonlyshort');
2730 $out .= $links[$i][1];
2731 if (!empty($links[$i][0])) {
2732 $out .=
'</a>'.
"\n";
2734 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2743 $outmore .=
'<div class="popuptabset wordwrap">';
2745 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2746 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2747 if (!empty($links[$i][0])) {
2748 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2750 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2752 } elseif (!empty($links[$i][1])) {
2753 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2754 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2755 $outmore .=
'</a>'.
"\n";
2757 $outmore .=
'</div>';
2762 $displaytab = $i + 1;
2765 $outmore .=
'</div>';
2769 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2770 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2771 $widthofpopup = 200;
2773 $tabsname = $moretabssuffix;
2774 if (empty($tabsname)) {
2775 $tabsname = str_replace(
"@",
"", $picto);
2777 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2779 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2781 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2784 $out .=
'<div></div>';
2787 $out .=
'<script nonce="'.getNonce().
'">';
2788 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2789 var x = this.offsetLeft, y = this.offsetTop;
2790 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2791 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2792 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2794 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2797 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2798 $out .=
"</script>";
2801 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2805 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3 || $notab == -4) {
2806 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : ((($notab == -3 || $notab == -4) ?
' noborderbottom' :
'').($notab == -4 ?
'' :
' tabBarWithBottom'))));
2809 if (!empty($dragdropfile)) {
2810 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2813 $parameters = array(
'tabname' => $active,
'out' => $out);
2814 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2816 $out = $hookmanager->resPrint;
2842 if (!$notab || $notab == -1) {
2843 return "\n</div>\n";
2868function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2870 global
$conf, $form, $user, $langs, $hookmanager, $action;
2874 $maxvisiblephotos = 1;
2878 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
2879 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2882 $modulepart =
'unknown';
2884 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
2885 $modulepart =
$object->element;
2886 } elseif (
$object->element ==
'member') {
2887 $modulepart =
'memberphoto';
2888 } elseif (
$object->element ==
'user') {
2889 $modulepart =
'userphoto';
2892 if (class_exists(
"Imagick")) {
2893 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
2894 $modulepart =
$object->element;
2895 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
2896 $modulepart =
'ficheinter';
2897 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2898 $modulepart =
'contract';
2899 } elseif (
$object->element ==
'order_supplier') {
2900 $modulepart =
'supplier_order';
2901 } elseif (
$object->element ==
'invoice_supplier') {
2902 $modulepart =
'supplier_invoice';
2906 if (
$object->element ==
'product') {
2908 '@phan-var-force Product $object';
2910 $cssclass =
'photowithmargin photoref';
2911 $showimage =
$object->is_photo_available(
$conf->product->multidir_output[$entity]);
2913 if (
$conf->browser->layout ==
'phone') {
2914 $maxvisiblephotos = 1;
2917 $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>';
2921 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2923 $nophoto =
'/public/theme/common/nophoto.png';
2924 $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>';
2927 } elseif (
$object->element ==
'category') {
2929 '@phan-var-force Categorie $object';
2931 $cssclass =
'photowithmargin photoref';
2932 $showimage =
$object->isAnyPhotoAvailable(
$conf->categorie->multidir_output[$entity]);
2934 if (
$conf->browser->layout ==
'phone') {
2935 $maxvisiblephotos = 1;
2938 $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>';
2942 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2944 $nophoto =
'/public/theme/common/nophoto.png';
2945 $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>';
2948 } elseif (
$object->element ==
'bom') {
2950 '@phan-var-force Bom $object';
2952 $cssclass =
'photowithmargin photoref';
2953 $showimage =
$object->is_photo_available(
$conf->bom->multidir_output[$entity]);
2955 if (
$conf->browser->layout ==
'phone') {
2956 $maxvisiblephotos = 1;
2959 $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>';
2963 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2965 $nophoto =
'/public/theme/common/nophoto.png';
2966 $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>';
2969 } elseif (
$object->element ==
'ticket') {
2971 $cssclass =
'photoref';
2973 '@phan-var-force Ticket $object';
2974 $showimage =
$object->is_photo_available(
$conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
2976 if (
$conf->browser->layout ==
'phone') {
2977 $maxvisiblephotos = 1;
2981 $showphoto =
$object->show_photos(
'ticket',
$conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2983 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2991 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2993 $nophoto =
img_picto(
'No photo',
'object_ticket');
2994 $morehtmlleft .=
'<!-- No photo to show -->';
2995 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2996 $morehtmlleft .= $nophoto;
2997 $morehtmlleft .=
'</div></div>';
3002 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
3005 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
3007 $dir_output = (empty(
$conf->$modulepart->multidir_output[$entity]) ?
$conf->$modulepart->dir_output :
$conf->$modulepart->multidir_output[$entity]).
"/";
3008 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
3010 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
3014 if (empty($subdir)) {
3015 $subdir =
'errorgettingsubdirofobject';
3018 $filepath = $dir_output.$subdir.
"/";
3020 $filepdf = $filepath.$objectref.
".pdf";
3021 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
3024 $fileimage = $filepdf.
'_preview.png';
3025 $relativepathimage = $relativepath.
'_preview.png';
3027 $pdfexists = file_exists($filepdf);
3032 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
3034 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3043 if ($pdfexists && !$error) {
3044 $heightforphotref = 80;
3045 if (!empty(
$conf->dol_optimize_smallscreen)) {
3046 $heightforphotref = 60;
3049 if (file_exists($fileimage)) {
3050 $phototoshow =
'<div class="photoref">';
3051 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
3052 $phototoshow .=
'</div>';
3055 } elseif (!$phototoshow) {
3056 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
3060 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
3061 $morehtmlleft .= $phototoshow;
3062 $morehtmlleft .=
'</div>';
3066 if (empty($phototoshow)) {
3067 if (
$object->element ==
'action') {
3069 $cssclass =
'photorefcenter';
3070 $nophoto =
img_picto(
'No photo',
'title_agenda');
3073 $cssclass =
'photorefcenter';
3075 $prefix =
'object_';
3079 if (strpos($picto,
'fontawesome_') !==
false) {
3082 $nophoto =
img_picto(
'No photo', $prefix.$picto);
3084 $morehtmlleft .=
'<!-- No photo to show -->';
3085 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
3086 $morehtmlleft .= $nophoto;
3087 $morehtmlleft .=
'</div></div>';
3094 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
3097 if (
$object->element ==
'societe') {
3098 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3101 $morehtmlstatus .=
$object->getLibStatut(6);
3103 } elseif (
$object->element ==
'product') {
3105 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3106 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
3108 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
3110 $morehtmlstatus .=
' ';
3112 if (!empty(
$conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
3113 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
3115 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
3117 } elseif (in_array(
$object->element, array(
'salary'))) {
3119 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3122 $morehtmlstatus .= $tmptxt;
3123 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
3124 $totalallpayments =
$object->getSommePaiement(0);
3125 $totalallpayments +=
$object->getSumCreditNotesUsed(0);
3126 $totalallpayments +=
$object->getSumDepositsUsed(0);
3127 $tmptxt =
$object->getLibStatut(6, $totalallpayments);
3128 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3129 $tmptxt =
$object->getLibStatut(5, $totalallpayments);
3131 $morehtmlstatus .= $tmptxt;
3132 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3134 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3137 $morehtmlstatus .= $tmptxt;
3138 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3140 $morehtmlstatus .=
$object->getLibStatut(5);
3142 $morehtmlstatus .=
$object->getLibStatut(4);
3144 } elseif (
$object->element ==
'facturerec') {
3145 '@phan-var-force FactureRec $object';
3146 if (
$object->frequency == 0) {
3147 $morehtmlstatus .=
$object->getLibStatut(2);
3149 $morehtmlstatus .=
$object->getLibStatut(5);
3151 } elseif (
$object->element ==
'project_task') {
3158 if (
$object->progress >= 100) {
3162 $tmptxt =
$object->getLibStatut(5);
3163 $morehtmlstatus .= $tmptxt;
3164 } elseif (method_exists(
$object,
'getLibStatut')) {
3165 $tmptxt =
$object->getLibStatut(6);
3166 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3167 $tmptxt =
$object->getLibStatut(5);
3169 $morehtmlstatus .= $tmptxt;
3173 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3175 if (method_exists(
$object,
'getVentilExportCompta')) {
3176 $accounted =
$object->getVentilExportCompta();
3177 $langs->load(
"accountancy");
3178 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
3183 if (!empty(
$object->name_alias)) {
3184 '@phan-var-force Societe $object';
3185 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3189 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3191 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3195 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3198 $morehtmlref .=
'<div class="refidno refaddress">';
3199 $morehtmlref .= $moreaddress;
3200 $morehtmlref .=
'</div>';
3204 $morehtmlref .=
'<div style="clear: both;"></div>';
3205 $morehtmlref .=
'<div class="refidno opacitymedium">';
3206 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3207 $morehtmlref .=
'</div>';
3210 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3211 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3214 } elseif (empty($reshook)) {
3215 $morehtmlref .= $hookmanager->resPrint;
3216 } elseif ($reshook > 0) {
3217 $morehtmlref = $hookmanager->resPrint;
3225 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3226 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3228 print
'<div class="underrefbanner clearboth"></div>';
3240function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3244 if ($fieldrequired) {
3245 $ret .=
'<span class="fieldrequired">';
3247 $ret .=
'<label for="'.$fieldkey.
'">';
3248 $ret .= $langs->trans($langkey);
3250 if ($fieldrequired) {
3271 global $langs, $hookmanager;
3274 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3279 $ret .= ($extralangcode ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->address)));
3282 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3284 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3285 $ret .= (($ret && $town) ? $sep :
'').$town;
3288 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3291 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3293 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3295 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3296 $ret .= ($ret ? $sep :
'').$town;
3298 $ret .= ($ret ?
", " :
'').
$object->state;
3301 $ret .= ($ret ? $sep :
'').
$object->zip;
3303 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3305 $ret .= ($ret ? $sep :
'').
$object->zip;
3306 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3307 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3309 $ret .= $sep.$object->state;
3311 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3314 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3316 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3318 $ret .= ($ret ? $sep :
'').
$object->zip;
3319 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3320 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3321 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3324 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3325 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3326 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3327 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3328 $ret .= ($ret ?
", " :
'').
$object->state;
3332 if (!is_object($outputlangs)) {
3333 $outputlangs = $langs;
3336 $langs->load(
"dict");
3337 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3340 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3341 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3345 $ret .= $hookmanager->resPrint;
3362function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3364 if ((abs($ts) <= 0x7FFFFFFF)) {
3367 return 'Error date outside supported range';
3392function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3394 global
$conf, $langs;
3401 if ($tzoutput ===
'auto') {
3402 $tzoutput = (empty(
$conf) ?
'tzserver' : (isset(
$conf->tzuserinputkey) ?
$conf->tzuserinputkey :
'tzserver'));
3407 $offsettz = $offsetdst = 0;
3410 if (is_string($tzoutput)) {
3411 if ($tzoutput ==
'tzserver') {
3413 $offsettzstring = @date_default_timezone_get();
3418 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3420 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3422 if (class_exists(
'DateTimeZone')) {
3423 $user_date_tz =
new DateTimeZone($offsettzstring);
3424 $user_dt =
new DateTime();
3425 $user_dt->setTimezone($user_date_tz);
3426 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3427 $offsettz = $user_dt->getOffset();
3429 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3430 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3435 if (!is_object($outputlangs)) {
3436 $outputlangs = $langs;
3439 $format =
'daytextshort';
3444 $reduceformat = (!empty(
$conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3445 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3446 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3447 if ($formatwithoutreduce != $format) {
3448 $format = $formatwithoutreduce;
3454 if ($format ==
'day') {
3455 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") :
$conf->format_date_short);
3456 } elseif ($format ==
'hour') {
3457 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") :
$conf->format_hour_short);
3458 } elseif ($format ==
'hourduration') {
3459 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") :
$conf->format_hour_short_duration);
3460 } elseif ($format ==
'daytext') {
3461 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") :
$conf->format_date_text);
3462 } elseif ($format ==
'daytextshort') {
3463 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") :
$conf->format_date_text_short);
3464 } elseif ($format ==
'dayhour') {
3465 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") :
$conf->format_date_hour_short);
3466 } elseif ($format ==
'dayhoursec') {
3467 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") :
$conf->format_date_hour_sec_short);
3468 } elseif ($format ==
'dayhourtext') {
3469 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") :
$conf->format_date_hour_text);
3470 } elseif ($format ==
'dayhourtextshort') {
3471 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") :
$conf->format_date_hour_text_short);
3472 } elseif ($format ==
'dayhourlog') {
3474 $format =
'%Y%m%d%H%M%S';
3475 } elseif ($format ==
'dayhourlogsmall') {
3477 $format =
'%y%m%d%H%M';
3478 } elseif ($format ==
'dayhourldap') {
3479 $format =
'%Y%m%d%H%M%SZ';
3480 } elseif ($format ==
'dayhourxcard') {
3481 $format =
'%Y%m%dT%H%M%SZ';
3482 } elseif ($format ==
'dayxcard') {
3484 } elseif ($format ==
'dayrfc') {
3485 $format =
'%Y-%m-%d';
3486 } elseif ($format ==
'dayhourrfc') {
3487 $format =
'%Y-%m-%dT%H:%M:%SZ';
3488 } elseif ($format ==
'standard') {
3489 $format =
'%Y-%m-%d %H:%M:%S';
3492 if ($reduceformat) {
3493 $format = str_replace(
'%Y',
'%y', $format);
3494 $format = str_replace(
'yyyy',
'yy', $format);
3498 if (preg_match(
'/%b/i', $format)) {
3500 $format = str_replace(
'%b',
'__b__', $format);
3501 $format = str_replace(
'%B',
'__B__', $format);
3503 if (preg_match(
'/%a/i', $format)) {
3505 $format = str_replace(
'%a',
'__a__', $format);
3506 $format = str_replace(
'%A',
'__A__', $format);
3511 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)) {
3512 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"]));
3514 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3516 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);
3519 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3520 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3521 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3522 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3523 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3524 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3526 $time =
dol_mktime((
int) $shour, (
int) $smin, (
int) $ssec, (
int) $smonth, (
int) $sday, (
int) $syear,
true);
3529 $tzo =
new DateTimeZone(
'UTC');
3531 $tzo =
new DateTimeZone(date_default_timezone_get());
3533 $dtts =
new DateTime();
3534 $dtts->setTimestamp($time);
3535 $dtts->setTimezone($tzo);
3536 $newformat = str_replace(
3537 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3538 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3541 $ret = $dtts->format($newformat);
3543 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3544 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3549 if ($time < 100000000000) {
3550 $timetouse = $time + $offsettz + $offsetdst;
3553 $tzo =
new DateTimeZone(
'UTC');
3555 $tzo =
new DateTimeZone(date_default_timezone_get());
3557 $dtts =
new DateTime();
3558 $dtts->setTimestamp($timetouse);
3559 $dtts->setTimezone($tzo);
3560 $newformat = str_replace(
3561 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3562 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3565 $ret = $dtts->format($newformat);
3567 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3568 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3573 $ret =
'Bad value '.$time.
' for date';
3577 if (preg_match(
'/__b__/i', $format)) {
3578 $timetouse = $time + $offsettz + $offsetdst;
3581 $tzo =
new DateTimeZone(
'UTC');
3583 $tzo =
new DateTimeZone(date_default_timezone_get());
3585 $dtts =
new DateTime();
3586 $dtts->setTimestamp($timetouse);
3587 $dtts->setTimezone($tzo);
3588 $month = (int) $dtts->format(
"m");
3589 $month = sprintf(
"%02d", $month);
3590 if ($encodetooutput) {
3591 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3592 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3594 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3595 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3598 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3599 $ret = str_replace(
'__B__', $monthtext, $ret);
3603 if (preg_match(
'/__a__/i', $format)) {
3605 $timetouse = $time + $offsettz + $offsetdst;
3608 $tzo =
new DateTimeZone(
'UTC');
3610 $tzo =
new DateTimeZone(date_default_timezone_get());
3612 $dtts =
new DateTime();
3613 $dtts->setTimestamp($timetouse);
3614 $dtts->setTimezone($tzo);
3615 $w = $dtts->format(
"w");
3616 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3618 $ret = str_replace(
'__A__', $dayweek, $ret);
3619 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3646function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3648 if ($timestamp ===
'') {
3652 $datetimeobj =
new DateTime();
3653 $datetimeobj->setTimestamp($timestamp);
3654 if ($forcetimezone) {
3655 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3658 'year' => ((
int) date_format($datetimeobj,
'Y')),
3659 'mon' => ((
int) date_format($datetimeobj,
'm')),
3660 'mday' => ((
int) date_format($datetimeobj,
'd')),
3661 'wday' => ((
int) date_format($datetimeobj,
'w')),
3662 'yday' => ((
int) date_format($datetimeobj,
'z')),
3663 'hours' => ((
int) date_format($datetimeobj,
'H')),
3664 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3665 'seconds' => ((
int) date_format($datetimeobj,
's')),
3693function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3698 if ($gm ===
'auto') {
3699 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
3704 if ($hour == -1 || empty($hour)) {
3707 if ($minute == -1 || empty($minute)) {
3710 if ($second == -1 || empty($second)) {
3716 if (!$month || !$day) {
3725 if ($hour < 0 || $hour > 24) {
3728 if ($minute < 0 || $minute > 60) {
3731 if ($second < 0 || $second > 60) {
3736 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3737 $default_timezone = @date_default_timezone_get();
3738 $localtz =
new DateTimeZone($default_timezone);
3739 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3741 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3743 $localtz =
new DateTimeZone($default_timezone);
3745 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3746 $default_timezone = @date_default_timezone_get();
3748 } elseif (strrpos($gm,
"tz,") !==
false) {
3749 $timezone = str_replace(
"tz,",
"", $gm);
3751 $localtz =
new DateTimeZone($timezone);
3753 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3757 if (empty($localtz)) {
3758 $localtz =
new DateTimeZone(
'UTC');
3762 $dt =
new DateTime(
'now', $localtz);
3763 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3764 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3765 $date = $dt->getTimestamp();
3781function dol_now($mode =
'auto')
3785 if ($mode ===
'auto') {
3789 if ($mode ==
'gmt') {
3791 } elseif ($mode ==
'tzserver') {
3792 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3794 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3800 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3803 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3804 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3805 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3822 global
$conf, $langs;
3825 if (!empty(
$conf->dol_optimize_smallscreen)) {
3830 if (empty($shortvalue) || $size < ($level * 10)) {
3832 $textunitshort = $langs->trans(
"b");
3833 $textunitlong = $langs->trans(
"Bytes");
3835 $ret = round($size / $level, 0);
3836 $textunitshort = $langs->trans(
"Kb");
3837 $textunitlong = $langs->trans(
"KiloBytes");
3840 if (empty($shortunit)) {
3841 $ret .=
' '.$textunitlong;
3843 $ret .=
' '.$textunitshort;
3859function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3867 $linkstart =
'<a href="';
3868 if (!preg_match(
'/^http/i', $url)) {
3869 $linkstart .=
'http://';
3874 $linkstart .=
' target="'.$target.
'"';
3876 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3880 if (!preg_match(
'/^http/i', $url)) {
3887 if ($morecss ==
'float') {
3888 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3890 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3907function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0, $morecss =
'paddingrightonly')
3909 global $user, $langs, $hookmanager;
3920 if (empty($email)) {
3924 if ($addlink == 1) {
3925 $newemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="';
3926 if (!preg_match(
'/^mailto:/i', $email)) {
3927 $newemail .=
'mailto:';
3929 $newemail .= $email;
3930 $newemail .=
'" target="_blank">';
3932 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3937 $newemail .= $email;
3939 $newemail .=
'</a>';
3941 $langs->load(
"errors");
3942 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3945 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3947 $linktoaddaction =
'';
3949 $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>';
3951 if ($linktoaddaction) {
3952 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3955 } elseif ($addlink ===
'thirdparty') {
3956 $tmpnewemail =
'<a class="'.($morecss ? $morecss :
'').
'" style="text-overflow: ellipsis;" href="'.DOL_URL_ROOT.
'/societe/card.php?socid='.$socid.
'&action=presend&mode=init#formmailbeforetitle">';
3957 $tmpnewemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3958 if ($withpicto == 1) {
3959 $tmpnewemail .= $newemail;
3961 $tmpnewemail .=
'</a>';
3963 $newemail = $tmpnewemail;
3965 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3968 $langs->load(
"errors");
3969 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3979 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3981 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3985 $rep .= $hookmanager->resPrint;
4000 $socialnetworks = array();
4002 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
4003 $cachekey =
'socialnetworks_' .
$conf->entity;
4005 if (!is_null($dataretrieved)) {
4006 $socialnetworks = $dataretrieved;
4008 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
4009 $sql .=
" WHERE entity=".$conf->entity;
4010 $resql = $db->query($sql);
4012 while ($obj = $db->fetch_object($resql)) {
4013 $socialnetworks[$obj->code] = array(
4014 'rowid' => $obj->rowid,
4015 'label' => $obj->label,
4017 'icon' => $obj->icon,
4018 'active' => $obj->active,
4024 return $socialnetworks;
4039 global $hookmanager, $langs, $user;
4043 if (empty($value)) {
4047 if (!empty($type)) {
4048 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
4050 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
4051 if ($type ==
'skype') {
4053 $htmllink .=
' <a href="skype:';
4055 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
4056 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
4057 $htmllink .=
'</a><a href="skype:';
4059 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
4060 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
4061 $htmllink .=
'</a>';
4062 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
4063 $addlink =
'AC_SKYPE';
4066 $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>';
4068 $htmllink .= ($link ?
' '.$link :
'');
4071 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
4074 if (preg_match(
'/^https?:\/\//i', $link)) {
4075 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4077 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4079 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
4080 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
4081 if ($tmpvirginurl) {
4082 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
4083 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
4085 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
4086 if ($tmpvirginurl3) {
4087 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
4088 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
4091 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
4092 if ($tmpvirginurl2) {
4093 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
4094 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
4097 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
4098 if (preg_match(
'/^https?:\/\//i', $link)) {
4099 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4101 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
4107 $htmllink .=
'</div>';
4109 $langs->load(
"errors");
4110 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
4114 $parameters = array(
4119 'dictsocialnetworks' => $dictsocialnetworks,
4122 $reshook = $hookmanager->executeHooks(
'printSocialNetworks', $parameters);
4126 $htmllink .= $hookmanager->resPrint;
4141function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
4145 if (empty($profID) || empty($profIDtype)) {
4148 if (empty($countrycode)) {
4149 $countrycode = $mysoc->country_code;
4151 $newProfID = $profID;
4152 $id = substr($profIDtype, -1);
4154 if (strtoupper($countrycode) ==
'FR') {
4160 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
4164 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
4168 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
4170 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4172 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
4175 if (!empty($addcpButton)) {
4198function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'paddingright')
4200 global
$conf, $user, $langs, $mysoc, $hookmanager;
4203 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4204 if (empty($phone)) {
4210 if (empty($countrycode) && is_object($mysoc)) {
4211 $countrycode = $mysoc->country_code;
4215 if (!empty(
$conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4220 $newphonewa = $phone;
4221 if (strtoupper($countrycode) ==
"FR") {
4224 $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);
4226 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4228 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4230 $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);
4232 $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);
4234 $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);
4236 } elseif (strtoupper($countrycode) ==
"CA") {
4238 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4240 } elseif (strtoupper($countrycode) ==
"PT") {
4242 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4244 } elseif (strtoupper($countrycode) ==
"SR") {
4246 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4248 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4250 } elseif (strtoupper($countrycode) ==
"DE") {
4252 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4254 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4256 } elseif (strtoupper($countrycode) ==
"ES") {
4258 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4260 } elseif (strtoupper($countrycode) ==
"BF") {
4262 $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);
4264 } elseif (strtoupper($countrycode) ==
"RO") {
4266 $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);
4268 } elseif (strtoupper($countrycode) ==
"TR") {
4270 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4272 } elseif (strtoupper($countrycode) ==
"US") {
4274 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4276 } elseif (strtoupper($countrycode) ==
"MX") {
4278 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4280 $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);
4282 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4284 } elseif (strtoupper($countrycode) ==
"ML") {
4286 $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);
4288 } elseif (strtoupper($countrycode) ==
"TH") {
4290 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4292 $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);
4294 } elseif (strtoupper($countrycode) ==
"MU") {
4297 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4299 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4301 } elseif (strtoupper($countrycode) ==
"ZA") {
4303 $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);
4305 } elseif (strtoupper($countrycode) ==
"SY") {
4307 $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);
4309 $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);
4311 } elseif (strtoupper($countrycode) ==
"AE") {
4313 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4315 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4317 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4319 } elseif (strtoupper($countrycode) ==
"DZ") {
4321 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4323 } elseif (strtoupper($countrycode) ==
"BE") {
4325 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4327 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4329 } elseif (strtoupper($countrycode) ==
"PF") {
4331 $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);
4333 } elseif (strtoupper($countrycode) ==
"CO") {
4335 $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);
4337 } elseif (strtoupper($countrycode) ==
"JO") {
4339 $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);
4341 } elseif (strtoupper($countrycode) ==
"JM") {
4343 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4345 } elseif (strtoupper($countrycode) ==
"MG") {
4347 $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);
4349 } elseif (strtoupper($countrycode) ==
"GB") {
4351 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4353 } elseif (strtoupper($countrycode) ==
"CH") {
4355 $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);
4357 $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);
4359 } elseif (strtoupper($countrycode) ==
"TN") {
4361 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4363 } elseif (strtoupper($countrycode) ==
"GF") {
4365 $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);
4367 } elseif (strtoupper($countrycode) ==
"GP") {
4369 $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);
4371 } elseif (strtoupper($countrycode) ==
"MQ") {
4373 $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);
4375 } elseif (strtoupper($countrycode) ==
"IT") {
4377 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4379 $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);
4381 } elseif (strtoupper($countrycode) ==
"AU") {
4385 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4387 } elseif (strtoupper($countrycode) ==
"LU") {
4390 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4392 $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);
4394 $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);
4396 $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);
4398 } elseif (strtoupper($countrycode) ==
"PE") {
4401 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4403 $newphonewa =
'+51'.$newphone;
4404 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4406 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4408 $newphonewa = $newphone;
4409 $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);
4413 $newphoneastart = $newphoneaend =
'';
4414 if (!empty($addlink)) {
4415 if ($addlink ==
'tel' ||
$conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4416 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4417 $newphoneaend .=
'</a>';
4418 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4419 if (empty($user->clicktodial_loaded)) {
4420 $user->fetch_clicktodial();
4424 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4425 if (!empty($user->clicktodial_url)) {
4426 $urlmask = $user->clicktodial_url;
4429 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4430 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4431 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4433 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4435 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4436 '__PHONETO__' => urlencode($phone),
4437 '__LOGIN__' => $clicktodial_login,
4438 '__PASS__' => $clicktodial_password);
4442 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4443 $newphoneaend =
'</a>';
4446 $newphoneastart =
'<a href="'.$url.
'"';
4448 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4450 $newphoneastart .=
'>';
4451 $newphoneaend .=
'</a>';
4456 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4458 $addlinktoagenda =
'';
4459 if ($addlink ==
'AC_FAX') {
4463 $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>';
4465 if ($addlinktoagenda) {
4466 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4471 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4473 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4474 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4477 if (empty($titlealt)) {
4478 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4483 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4484 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4485 $rep .= $hookmanager->resPrint;
4487 if (empty($reshook)) {
4490 if ($withpicto ==
'fax') {
4491 $picto =
'phoning_fax';
4492 } elseif ($withpicto ==
'phone') {
4494 } elseif ($withpicto ==
'mobile') {
4495 $picto =
'phoning_mobile';
4500 if ($adddivfloat == 1) {
4501 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'">';
4502 } elseif (empty($adddivfloat)) {
4503 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
'>';
4506 $rep .= $newphoneastart;
4507 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4508 if ($separ !=
'hidenum') {
4509 $rep .= ($withpicto ?
' ' :
'').$newphone;
4511 $rep .= $newphoneaend;
4513 if ($adddivfloat == 1) {
4515 } elseif (empty($adddivfloat)) {
4543 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4544 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
4546 $ret .=
' ('.$countrycode.
')';
4566 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4567 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4568 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4569 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4571 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4574 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
4577 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
4593 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4595 } 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') {
4613 if (isModEnabled(
'geoipmaxmind')) {
4617 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4618 $geoip =
new DolGeoIP(
'country', $datafile);
4620 $countrycode = $geoip->getCountryCodeFromIP($ip);
4623 return $countrycode;
4635 global
$conf, $langs, $user;
4639 if (isModEnabled(
'geoipmaxmind')) {
4644 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4645 $geoip =
new DolGeoIP(
'country', $datafile);
4646 $countrycode = $geoip->getCountryCodeFromIP($ip);
4647 $ret = $countrycode;
4666 global
$conf, $user, $langs, $hookmanager;
4672 $parameters = array(
'element' => $element,
'id' =>
$id);
4673 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4674 $out .= $hookmanager->resPrint;
4676 if (empty($reshook)) {
4677 if (empty($charfornl)) {
4678 $out .= nl2br($address);
4680 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4684 $showgmap = $showomap = 0;
4685 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4688 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4691 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4694 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4697 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4700 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4703 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4706 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4711 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4714 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.
$id, 1);
4715 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4737function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4739 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4742 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4745 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4763 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4764 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4767 if (function_exists(
'getmxrr')) {
4770 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4771 if (count($mxhosts) > 1) {
4774 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
4811 $tmparray = explode(
' ', $s);
4812 foreach ($tmparray as $tmps) {
4827function dol_strlen($string, $stringencoding =
'UTF-8')
4829 if (is_null($string)) {
4833 if (function_exists(
'mb_strlen')) {
4834 return mb_strlen($string, $stringencoding);
4836 return strlen($string);
4850function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4854 if (empty($stringencoding)) {
4855 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
4859 if (empty($trunconbytes)) {
4860 if (function_exists(
'mb_substr')) {
4861 $ret = mb_substr($string, $start, $length, $stringencoding);
4863 $ret = substr($string, $start, $length);
4866 if (function_exists(
'mb_strcut')) {
4867 $ret = mb_strcut($string, $start, $length, $stringencoding);
4869 $ret = substr($string, $start, $length);
4889function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4897 if (empty($stringencoding)) {
4898 $stringencoding =
'UTF-8';
4901 if (!empty(
$conf->dol_optimize_smallscreen) &&
$conf->dol_optimize_smallscreen == 1 && $display == 1) {
4902 $size = round($size / 3);
4906 if ($trunc ==
'right') {
4908 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4910 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4915 } elseif ($trunc ==
'middle') {
4917 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4918 $size1 = (int) round($size / 2);
4919 $size2 = (int) round($size / 2);
4920 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4924 } elseif ($trunc ==
'left') {
4926 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4928 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4932 } elseif ($trunc ==
'wrap') {
4934 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4940 return 'BadParam3CallingDolTrunc';
4954 $type2picto = array(
4955 'varchar' =>
'font',
4958 'int' =>
'sort-numeric-down',
4959 'double' =>
'sort-numeric-down',
4960 'price' =>
'currency',
4961 'pricecy' =>
'multicurrency',
4962 'password' =>
'key',
4963 'boolean' =>
'check-square',
4964 'date' =>
'calendar',
4965 'datetime' =>
'calendar',
4966 'duration' =>
'hourglass',
4972 'sellist' =>
'list',
4973 'stars' =>
'fontawesome_star_fas',
4974 'radio' =>
'check-circle',
4975 'checkbox' =>
'list',
4976 'chkbxlst' =>
'list',
4978 'icon' =>
"question",
4979 'point' =>
"country",
4980 'multipts' =>
'country',
4981 'linestrg' =>
"country",
4982 'polygon' =>
"country",
4983 'separate' =>
'minus'
4986 if (!empty($type2picto[$key])) {
4987 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4990 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
5015function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
5020 $url = DOL_URL_ROOT;
5021 $theme = isset(
$conf->theme) ?
$conf->theme :
null;
5022 $path =
'theme/'.$theme;
5023 if (empty($picto)) {
5028 if ($pictoisfullpath) {
5030 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5033 $fullpathpicto = $picto;
5035 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5036 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5037 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5042 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
5043 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
5044 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
5047 $pictoconvertkey = array(
'facture' =>
'bill',
'shipping' =>
'shipment',
'fichinter' =>
'intervention',
'agenda' =>
'calendar',
'invoice_supplier' =>
'supplier_invoice',
'order_supplier' =>
'supplier_order');
5048 if (in_array($pictowithouttext, array_keys($pictoconvertkey))) {
5049 $pictowithouttext = $pictoconvertkey[$pictowithouttext];
5052 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
5054 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
5055 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
5058 if ($pictowithouttext ==
'file-o') {
5059 $pictowithouttext =
'file';
5062 $pictowithouttextarray = explode(
'_', $pictowithouttext);
5063 $marginleftonlyshort = 0;
5065 if (!empty($pictowithouttextarray[1])) {
5067 $fakey =
'fa-'.$pictowithouttextarray[0];
5068 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
5069 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
5070 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
5072 $fakey =
'fa-'.$pictowithouttext;
5082 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5083 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5084 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5086 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5087 $morestyle = $reg[1];
5088 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5090 $moreatt = trim($moreatt);
5092 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5093 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5097 $enabledisablehtml .=
'</span>';
5099 return $enabledisablehtml;
5102 if (empty($srconly) && in_array($pictowithouttext, array(
5103 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
5104 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
5105 'back',
'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
5106 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
'hourglass',
5107 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
5108 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
5109 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
5110 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
5111 'commercial',
'companies',
5112 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
5113 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
5114 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
5115 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
5116 'hands-helping',
'help',
'holiday',
5117 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
5118 'key',
'knowledgemanagement',
5119 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
5120 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
5121 'off',
'on',
'order',
5122 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
5123 'stock',
'resize',
'service',
'stats',
5124 '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',
5125 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
5126 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
5127 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
5128 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
5129 'technic',
'ticket',
5131 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
5132 'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
5133 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
5134 'uncheck',
'undo',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
5135 'conferenceorbooth',
'eventorganization',
5136 'stamp',
'signature',
5139 $fakey = $pictowithouttext;
5143 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'))) {
5146 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
5150 $arrayconvpictotofa = array(
5151 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
5152 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
5153 'back' =>
'arrow-left',
'bank_account' =>
'university',
5154 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
5155 'bookcal' =>
'calendar-check',
5156 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
5158 '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',
5159 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
5160 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
5161 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
5162 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
5163 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
5164 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
5165 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
5166 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
5167 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
5168 'info' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
5169 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
5170 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
5171 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
5172 'sign-out' =>
'sign-out-alt',
5173 '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',
5174 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
5175 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
5176 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
5177 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
5178 'other' =>
'square',
5179 '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',
5180 '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',
5181 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
5182 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
5183 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
5184 'service' =>
'concierge-bell',
5185 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
5186 'status' =>
'stop-circle',
5187 'stripe' =>
'stripe-s',
'supplier' =>
'building',
5188 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
5189 'title_agenda' =>
'calendar-alt',
5190 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
5191 'jabber' =>
'comment-o',
5192 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
5193 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
5194 'webportal' =>
'door-open'
5196 if (
$conf->currency ==
'EUR') {
5197 $arrayconvpictotofa[
'currency'] =
'euro-sign';
5198 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
5200 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
5201 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
5203 if ($pictowithouttext ==
'off') {
5204 $fakey =
'fa-square';
5206 } elseif ($pictowithouttext ==
'on') {
5207 $fakey =
'fa-check-square';
5209 } elseif ($pictowithouttext ==
'listlight') {
5210 $fakey =
'fa-download';
5211 $marginleftonlyshort = 1;
5212 } elseif ($pictowithouttext ==
'printer') {
5213 $fakey =
'fa-print';
5215 } elseif ($pictowithouttext ==
'note') {
5216 $fakey =
'fa-sticky-note';
5217 $marginleftonlyshort = 1;
5218 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5219 $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');
5220 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5221 if (preg_match(
'/selected/', $pictowithouttext)) {
5224 $marginleftonlyshort = 1;
5225 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5226 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5228 $fakey =
'fa-'.$pictowithouttext;
5231 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5232 $morecss .=
' em092';
5234 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
5235 $morecss .=
' em088';
5237 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5238 $morecss .=
' em080';
5242 $arrayconvpictotomarginleftonly = array(
5243 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5244 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_grey',
'switch_on_red',
'switch_off',
5245 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5247 if (!array_key_exists($pictowithouttext, $arrayconvpictotomarginleftonly)) {
5248 $marginleftonlyshort = 0;
5252 $arrayconvpictotomorcess = array(
5253 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5254 'bank_account' =>
'infobox-bank_account',
5255 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5256 'bookcal' =>
'infobox-action',
5257 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5258 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5259 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5260 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5261 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5262 'incoterm' =>
'infobox-supplier_proposal',
5263 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5264 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5265 'order' =>
'infobox-commande',
5266 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5267 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5268 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'invoice' =>
'infobox-commande',
5269 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5270 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5271 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5272 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5273 'resource' =>
'infobox-action',
5274 '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',
5275 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5276 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5277 'vat' =>
'infobox-bank_account',
5279 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode'
5281 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5282 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5286 $arrayconvpictotocolor = array(
5287 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5288 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5289 'dynamicprice' =>
'#a69944',
5290 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5292 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5293 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5294 'other' =>
'#ddd',
'world' =>
'#986c6a',
5295 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5297 'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5298 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5299 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5300 'website' =>
'#304',
'workstation' =>
'#a69944'
5302 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5303 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5310 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5311 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5312 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5314 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5315 $morestyle = $reg[1];
5316 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5318 $moreatt = trim($moreatt);
5320 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5321 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5325 $enabledisablehtml .=
'</span>';
5327 return $enabledisablehtml;
5334 } elseif (!empty(
$conf->modules_parts[
'theme']) && array_key_exists($theme,
$conf->modules_parts[
'theme'])) {
5335 $path = $theme.
'/theme/'.$theme;
5340 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5346 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5351 foreach (
$conf->file->dol_document_root as $type => $dirroot) {
5352 if ($type ==
'main') {
5356 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5357 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5363 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5367 return $fullpathpicto;
5371 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 :
'').
'"').
'>';
5387function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0)
5389 if (strpos($picto,
'^') === 0) {
5390 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
5392 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
5407function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5411 if (is_numeric($picto)) {
5414 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5415 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5419 $path = DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/weather/'.$picto;
5421 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5435function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5439 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5443 if ($pictoisfullpath) {
5446 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5449 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.
$conf->theme.
'/img/'.$picto;
5451 if (file_exists($themepath)) {
5457 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5473function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5477 if (empty($titlealt) || $titlealt ==
'default') {
5478 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5480 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5481 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5483 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5484 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5486 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5487 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5489 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5490 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5492 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5494 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5498 if (!is_numeric($numaction)) {
5502 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5512function img_pdf($titlealt =
'default', $size = 3)
5516 if ($titlealt ==
'default') {
5517 $titlealt = $langs->trans(
'Show');
5520 return img_picto($titlealt,
'pdf'.$size.
'.png');
5530function img_edit_add($titlealt =
'default', $other =
'')
5534 if ($titlealt ==
'default') {
5535 $titlealt = $langs->trans(
'Add');
5538 return img_picto($titlealt,
'edit_add.png', $other);
5551 if ($titlealt ==
'default') {
5552 $titlealt = $langs->trans(
'Remove');
5555 return img_picto($titlealt,
'edit_remove.png', $other);
5566function img_edit($titlealt =
'default', $float = 0, $other =
'')
5570 if ($titlealt ==
'default') {
5571 $titlealt = $langs->trans(
'Modify');
5574 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5585function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5589 if ($titlealt ==
'default') {
5590 $titlealt = $langs->trans(
'View');
5593 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5595 return img_picto($titlealt,
'eye', $moreatt);
5606function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5610 if ($titlealt ==
'default') {
5611 $titlealt = $langs->trans(
'Delete');
5614 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5624function img_printer($titlealt =
"default", $other =
'')
5627 if ($titlealt ==
"default") {
5628 $titlealt = $langs->trans(
"Print");
5630 return img_picto($titlealt,
'printer.png', $other);
5640function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5644 if ($titlealt ==
'default') {
5645 $titlealt = $langs->trans(
'Split');
5648 return img_picto($titlealt,
'split.png', $other);
5658function img_help($usehelpcursor = 1, $usealttitle = 1)
5663 if (is_string($usealttitle)) {
5666 $usealttitle = $langs->trans(
'Info');
5670 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5679function img_info($titlealt =
'default')
5683 if ($titlealt ==
'default') {
5684 $titlealt = $langs->trans(
'Informations');
5687 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5698function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5702 if ($titlealt ==
'default') {
5703 $titlealt = $langs->trans(
'Warning');
5707 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5716function img_error($titlealt =
'default')
5720 if ($titlealt ==
'default') {
5721 $titlealt = $langs->trans(
'Error');
5724 return img_picto($titlealt,
'error.png');
5734function img_next($titlealt =
'default', $moreatt =
'')
5738 if ($titlealt ==
'default') {
5739 $titlealt = $langs->trans(
'Next');
5743 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5753function img_previous($titlealt =
'default', $moreatt =
'')
5757 if ($titlealt ==
'default') {
5758 $titlealt = $langs->trans(
'Previous');
5762 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5773function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5777 if ($titlealt ==
'default') {
5778 $titlealt = $langs->trans(
'Down');
5781 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5792function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5796 if ($titlealt ==
'default') {
5797 $titlealt = $langs->trans(
'Up');
5800 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5811function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5815 if ($titlealt ==
'default') {
5816 $titlealt = $langs->trans(
'Left');
5819 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5830function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5834 if ($titlealt ==
'default') {
5835 $titlealt = $langs->trans(
'Right');
5838 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5848function img_allow($allow, $titlealt =
'default')
5852 if ($titlealt ==
'default') {
5853 $titlealt = $langs->trans(
'Active');
5857 return img_picto($titlealt,
'tick.png');
5872 if (is_null($morecss)) {
5876 if ($brand ==
'visa' || $brand ==
'Visa') {
5878 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5879 $brand =
'cc-mastercard';
5880 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5882 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5883 $brand =
'cc-discover';
5884 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5886 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5887 $brand =
'cc-diners-club';
5888 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5889 $brand =
'credit-card';
5892 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5903function img_mime($file, $titlealt =
'', $morecss =
'')
5905 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5911 if (empty($titlealt)) {
5912 $titlealt =
'Mime type: '.$mimetype;
5916 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5927function img_search($titlealt =
'default', $other =
'')
5931 if ($titlealt ==
'default') {
5932 $titlealt = $langs->trans(
'Search');
5935 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
5937 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5938 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5954 if ($titlealt ==
'default') {
5955 $titlealt = $langs->trans(
'Search');
5958 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
5960 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5961 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5978function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
5980 global
$conf, $langs;
5982 if ($infoonimgalt) {
5983 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5985 if (empty(
$conf->use_javascript_ajax)) {
5986 $textfordropdown =
'';
5989 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5990 $fa =
'info-circle';
5991 if ($picto ==
'warning') {
5992 $fa =
'exclamation-triangle';
5994 $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> ';
5996 $result .= ($nodiv ?
'' :
'</div>');
5998 if ($textfordropdown) {
5999 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
6000 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
6001 jQuery(document).ready(function() {
6002 jQuery(".'.$class.
'text").click(function() {
6003 console.log("toggle text");
6004 jQuery(".'.$class.
'").toggle();
6009 $result = $tmpresult.$result;
6030 global
$conf, $langs, $user, $argv;
6031 global $dolibarr_main_prod;
6038 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
6040 $langs->load(
"main");
6044 $langs->loadLangs(array(
'main',
'errors'));
6046 if ($_SERVER[
'DOCUMENT_ROOT']) {
6047 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
6049 $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";
6051 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
6053 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
6054 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
6055 if (isset(
$conf->global->MAIN_FEATURES_LEVEL)) {
6056 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
6058 if ($user instanceof
User) {
6059 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
6061 if (function_exists(
"phpversion")) {
6062 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
6064 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
6065 if (function_exists(
"php_uname")) {
6066 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
6068 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
6070 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
6071 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
6072 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset(
$conf->standard_menu) ?
dol_htmlentities(
$conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
6074 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
6075 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
6077 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
6078 $syslog .=
"pid=".dol_getmypid();
6081 if (!empty(
$conf->modules)) {
6082 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ',
$conf->modules).
"<br>\n";
6085 if (is_object($db)) {
6086 if ($_SERVER[
'DOCUMENT_ROOT']) {
6087 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
6088 $lastqueryerror = $db->lastqueryerror();
6090 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
6092 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6093 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6094 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
6098 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
6099 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6100 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6101 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
6103 $syslog .=
", sql=".$db->lastquery();
6104 $syslog .=
", db_error=".$db->lasterror();
6107 if ($error || $errors) {
6109 if (is_array($error) && is_array($errors)) {
6110 $errors = array_merge($error, $errors);
6111 } elseif (is_array($error)) {
6113 } elseif (is_array($errors) && !empty($error)) {
6114 $errors = array_merge(array($error), $errors);
6115 } elseif (!empty($error)) {
6116 $errors = array_merge(array($error), array($errors));
6119 $langs->load(
"errors");
6121 foreach ($errors as $msg) {
6125 if ($_SERVER[
'DOCUMENT_ROOT']) {
6128 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
6130 $syslog .=
", msg=".$msg;
6133 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
6134 xdebug_print_function_stack();
6135 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
6136 $out .=
'File: '.xdebug_call_file().
"<br>\n";
6137 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
6138 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
6143 if (!headers_sent()) {
6144 if (function_exists(
'top_httphead')) {
6148 http_response_code(202);
6151 if (empty($dolibarr_main_prod)) {
6154 if (empty($langs->defaultlang)) {
6155 $langs->setDefaultLang();
6157 $langs->loadLangs(array(
"main",
"errors"));
6159 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";
6160 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
6161 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6162 if (!defined(
"MAIN_CORE_ERROR")) {
6163 define(
"MAIN_CORE_ERROR", 1);
6180function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6184 if (empty($email)) {
6188 $langs->load(
"errors");
6191 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
6192 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
6193 if ($errormessage) {
6194 print
'<br><br>'.$errormessage;
6196 if (is_array($errormessages) && count($errormessages)) {
6197 foreach ($errormessages as $mesgtoshow) {
6198 print
'<br><br>'.$mesgtoshow;
6201 print
'</div></div>';
6220function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6222 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6243function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6245 global $langs, $form;
6248 if ($moreattrib ==
'class="right"') {
6249 $prefix .=
'right ';
6252 $sortorder = strtoupper($sortorder);
6261 $tmpsortfield = explode(
',', $sortfield);
6262 $sortfield1 = trim($tmpsortfield[0]);
6263 $tmpfield = explode(
',', $field);
6264 $field1 = trim($tmpfield[0]);
6266 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6267 $prefix =
'wrapcolumntitle '.$prefix;
6273 $liste_titre =
'liste_titre';
6274 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6275 $liste_titre =
'liste_titre_sel';
6278 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6283 if (empty($thead) && $field && empty($disablesortlink)) {
6284 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6285 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6286 $options = preg_replace(
'/&+/i',
'&', $options);
6287 if (!preg_match(
'/^&/', $options)) {
6288 $options =
'&'.$options;
6291 $sortordertouseinlink =
'';
6292 if ($field1 != $sortfield1) {
6293 if (preg_match(
'/^DESC/i', $sortorder)) {
6294 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6296 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6299 if (preg_match(
'/^ASC/i', $sortorder)) {
6300 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6302 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6305 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6306 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
6312 if (preg_match(
'/:\w+$/', $tooltip)) {
6313 $tmptooltip = explode(
':', $tooltip);
6315 $tmptooltip = array($tooltip);
6317 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6319 $out .= $langs->trans($name);
6322 if (empty($thead) && $field && empty($disablesortlink)) {
6326 if (empty($thead) && $field) {
6327 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6328 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6329 $options = preg_replace(
'/&+/i',
'&', $options);
6330 if (!preg_match(
'/^&/', $options)) {
6331 $options =
'&'.$options;
6334 if (!$sortorder || ($field1 != $sortfield1)) {
6338 if (preg_match(
'/^DESC/', $sortorder)) {
6341 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6343 if (preg_match(
'/^ASC/', $sortorder)) {
6346 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6351 $tagend =
'</'.$tag.
'>';
6353 $out = $tagstart.$sortimg.$out.$tagend;
6368 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6370 print
'<div class="titre">'.$title.
'</div>';
6384function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'')
6402function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0,
$id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6406 if ($picto ==
'setup') {
6411 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6412 $return .=
'<tr class="toptitle">';
6414 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6416 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6417 $return .=
'<div class="titre inline-block">';
6418 $return .=
'<span class="inline-block valignmiddle">'.$title.
'</span>';
6419 $return .=
'</div>';
6422 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6425 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6427 $return .=
'</tr></table>'.
"\n";
6455function 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 =
'')
6457 global
$conf, $langs;
6460 $savtotalnboflines = $totalnboflines;
6461 if (is_numeric($totalnboflines)) {
6462 $totalnboflines = abs($totalnboflines);
6467 $tmparray = preg_split(
'/<br>/i', $title, 2);
6468 if (!empty($tmparray[1])) {
6469 $title = $tmparray[0];
6470 $subtitle = $tmparray[1];
6473 $page = (int) $page;
6475 if ($picto ==
'setup') {
6476 $picto =
'title_setup.png';
6478 if ((
$conf->browser->name ==
'ie') && $picto ==
'generic') {
6479 $picto =
'title.gif';
6482 $limit =
$conf->liste_limit;
6485 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6493 print
"<!-- Begin print_barre_liste -->\n";
6494 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'">';
6495 print
'<tr class="toptitle">';
6499 if ($picto && $title) {
6500 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">';
6501 print
img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath);
6505 print
'<td class="nobordernopadding valignmiddle col-title">';
6506 print
'<div class="titre inline-block">';
6507 print
'<span class="inline-block valignmiddle print-barre-liste">'.$title.
'</span>';
6508 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'' && $totalnboflines > 0) {
6509 print
'<span class="opacitymedium colorblack marginleftonly totalnboflines valignmiddle" title="'.$langs->trans(
"NbRecordQualified").
'">('.$totalnboflines.
')</span>';
6512 if (!empty($subtitle)) {
6513 print
'<br><div class="subtitle inline-block hideonsmartphone">'.$subtitle.
'</div>';
6518 if ($morehtmlcenter && empty(
$conf->dol_optimize_smallscreen)) {
6519 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6523 print
'<td class="nobordernopadding valignmiddle right col-right">';
6524 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6526 $options .=
"&sortfield=".urlencode($sortfield);
6529 $options .=
"&sortorder=".urlencode($sortorder);
6533 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6534 if ($totalnboflines) {
6536 $maxnbofpage = (empty(
$conf->dol_optimize_smallscreen) ? 4 : 0);
6539 $nbpages = ceil($totalnboflines / $limit);
6543 $cpt = ($page - $maxnbofpage);
6549 if (empty($pagenavastextinput)) {
6550 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6552 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6553 } elseif ($cpt == 2) {
6554 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6560 if ($pagenavastextinput) {
6561 if ($cpt == $page) {
6562 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
6566 if ($cpt == $page) {
6567 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6569 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6573 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6575 if (empty($pagenavastextinput)) {
6576 if ($cpt < $nbpages) {
6577 if ($cpt < $nbpages - 2) {
6578 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6579 } elseif ($cpt == $nbpages - 2) {
6580 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6582 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6586 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6589 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6593 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6594 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $selectlimitsuffix, $morehtmlrightbeforearrow, $hidenavigation);
6598 if ($pagenavastextinput) {
6605 print
'</table>'.
"\n";
6608 if ($morehtmlcenter && !empty(
$conf->dol_optimize_smallscreen)) {
6609 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6612 print
"<!-- End title -->\n\n";
6631function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $selectlimitsuffix =
'', $beforearrows =
'', $hidenavigation = 0)
6633 global
$conf, $langs;
6635 print
'<div class="pagination"><ul>';
6636 if ($beforearrows) {
6637 print
'<li class="paginationbeforearrows">';
6638 print $beforearrows;
6642 if (empty($hidenavigation)) {
6643 if ((
int) $limit > 0 && (empty($selectlimitsuffix) || !is_numeric($selectlimitsuffix))) {
6644 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6645 $pagesizechoices .=
',5000:5000';
6655 print
'<li class="pagination">';
6656 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.
'">';
6657 print
'<datalist id="limitlist">';
6659 print
'<li class="paginationcombolimit valignmiddle">';
6660 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")).
'">';
6662 $tmpchoice = explode(
',', $pagesizechoices);
6663 $tmpkey = $limit.
':'.$limit;
6664 if (!in_array($tmpkey, $tmpchoice)) {
6665 $tmpchoice[$tmpkey] = $tmpkey;
6667 $tmpkey =
$conf->liste_limit.
':'.
$conf->liste_limit;
6668 if (!in_array($tmpkey, $tmpchoice)) {
6669 $tmpchoice[$tmpkey] = $tmpkey;
6671 asort($tmpchoice, SORT_NUMERIC);
6672 foreach ($tmpchoice as $val) {
6674 $tmp = explode(
':', $val);
6677 if ($key !=
'' && $val !=
'') {
6678 if ((
int) $key == (
int) $limit) {
6679 $selected =
' selected="selected"';
6681 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6685 print
'</datalist>';
6688 print
ajax_combobox(
"limit".(is_numeric($selectlimitsuffix) ?
'' : $selectlimitsuffix), array(), 0, 0,
'resolve',
'-1',
'limit');
6692 if (
$conf->use_javascript_ajax) {
6693 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6695 jQuery(document).ready(function () {
6696 jQuery(".selectlimit").change(function() {
6697 console.log("We change limit so we submit the form");
6698 $(this).parents(\'form:first\').submit();
6707 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>';
6709 if ($betweenarrows) {
6710 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6711 print $betweenarrows;
6712 print
'<!--</div>-->';
6714 if ($nextpage > 0) {
6715 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>';
6718 print
'<li class="paginationafterarrows">';
6723 print
'</ul></div>'.
"\n";
6738function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6742 if (preg_match(
'/%/', $rate)) {
6743 $rate = str_replace(
'%',
'', $rate);
6747 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6748 $morelabel =
' ('.$reg[1].
')';
6749 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6750 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6752 if (preg_match(
'/\*/', $rate)) {
6753 $rate = str_replace(
'*',
'', $rate);
6758 if (!preg_match(
'/\//', $rate)) {
6759 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6762 $ret = $rate.($addpercent ?
'%' :
'');
6764 if (($info_bits & 1) && $usestarfornpr >= 0) {
6787function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6789 global $langs,
$conf;
6792 if (empty($amount)) {
6795 $amount = (is_numeric($amount) ? $amount : 0);
6796 if ($rounding == -1) {
6799 $nbdecimal = $rounding;
6801 if ($outlangs ===
'none') {
6811 if (!($outlangs instanceof
Translate)) {
6815 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6816 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6818 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6819 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6821 if ($thousand ==
'None') {
6823 } elseif ($thousand ==
'Space') {
6830 $amount = str_replace(
',',
'.', $amount);
6832 $data = explode(
'.', $amount);
6833 $decpart = isset($data[1]) ? $data[1] :
'';
6834 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6844 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6845 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6846 $nbdecimal = $nbdecimalmaxshown;
6854 if ((
string) $forcerounding !=
'-1') {
6855 if ($forcerounding ===
'MU') {
6857 } elseif ($forcerounding ===
'MT') {
6859 } elseif ($forcerounding >= 0) {
6860 $nbdecimal = $forcerounding;
6865 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
6867 $output = preg_replace(
'/\s/',
' ', $output);
6868 $output = preg_replace(
'/\'/',
''', $output);
6871 $cursymbolbefore = $cursymbolafter =
'';
6872 if ($currency_code && is_object($outlangs)) {
6873 if ($currency_code ==
'auto') {
6874 $currency_code =
$conf->currency;
6877 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6878 $listoflanguagesbefore = array(
'nl_NL');
6879 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6880 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6882 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6883 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6886 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6915function price2num($amount, $rounding =
'', $option = 0)
6917 global $langs,
$conf;
6920 if (is_null($amount)) {
6929 if (is_null($langs)) {
6933 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6934 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6936 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6937 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6940 if ($thousand ==
'None') {
6942 } elseif ($thousand ==
'Space') {
6950 if (!is_numeric($amount)) {
6951 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6954 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6955 $amount = str_replace($thousand,
'', $amount);
6961 if (is_numeric($amount)) {
6963 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6964 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6966 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6971 if ($thousand !=
',' && $thousand !=
'.') {
6972 $amount = str_replace(
',',
'.', $amount);
6975 $amount = str_replace(
' ',
'', $amount);
6976 $amount = str_replace($thousand,
'', $amount);
6977 $amount = str_replace($dec,
'.', $amount);
6979 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6985 $nbofdectoround =
'';
6986 if ($rounding ==
'MU') {
6988 } elseif ($rounding ==
'MT') {
6990 } elseif ($rounding ==
'MS') {
6991 $nbofdectoround = isset(
$conf->global->MAIN_MAX_DECIMALS_STOCK) ?
$conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6992 } elseif ($rounding ==
'CU') {
6994 } elseif ($rounding ==
'CT') {
6996 } elseif (is_numeric($rounding)) {
6997 $nbofdectoround = (int) $rounding;
7002 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
7004 return 'ErrorBadParameterProvidedToFunction';
7010 if (is_numeric($amount)) {
7012 $temps = sprintf(
"%10.10F", $amount - intval($amount));
7013 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
7015 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
7021 if ($thousand !=
',' && $thousand !=
'.') {
7022 $amount = str_replace(
',',
'.', $amount);
7025 $amount = str_replace(
' ',
'', $amount);
7026 $amount = str_replace($thousand,
'', $amount);
7027 $amount = str_replace($dec,
'.', $amount);
7029 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
7047function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
7049 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
7051 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
7052 $dimension *= 1000000;
7054 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
7057 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
7058 $dimension /= 1000000;
7060 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
7077 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
7079 $ret .=
' '.measuringUnitString(0, $type, (
string) $unit, $use_short_label, $outputlangs);
7097function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
7099 global $db,
$conf, $mysoc;
7101 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
7102 $thirdparty_seller = $mysoc;
7105 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);
7107 $vatratecleaned = $vatrate;
7109 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
7110 $vatratecleaned = trim($reg[1]);
7111 $vatratecode = $reg[2];
7120 if ($mysoc->country_code ==
'ES') {
7122 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
7125 if ($thirdparty_seller->id == $mysoc->id) {
7126 if (!$thirdparty_buyer->localtax1_assuj) {
7130 if (!$thirdparty_seller->localtax1_assuj) {
7138 if (!$mysoc->localtax2_assuj) {
7141 if ($thirdparty_seller->id == $mysoc->id) {
7142 if (!$thirdparty_buyer->localtax2_assuj) {
7146 if (!$thirdparty_seller->localtax2_assuj) {
7152 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
7155 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
7161 if (in_array($mysoc->country_code, array(
'ES'))) {
7162 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
7168 if ($thirdparty_seller != $mysoc) {
7170 return $thirdparty_seller->localtax1_value;
7179 if ($thirdparty_seller != $mysoc) {
7182 return $thirdparty_seller->localtax2_value;
7185 if (in_array($mysoc->country_code, array(
'ES'))) {
7186 return $thirdparty_buyer->localtax2_value;
7195 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
7196 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7197 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
7198 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7199 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7200 if (!empty($vatratecode)) {
7201 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
7203 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
7206 $resql = $db->query($sql);
7209 $obj = $db->fetch_object($resql);
7212 return $obj->localtax1;
7213 } elseif ($local == 2) {
7214 return $obj->localtax2;
7235 $valors = explode(
":", $tax);
7237 if (count($valors) > 1) {
7254 $sql =
" SELECT t.localtax".$local.
" as localtax";
7255 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7256 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7257 $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";
7258 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7259 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7260 $sql .=
" ORDER BY t.rowid DESC";
7262 $resql = $db->query($sql);
7264 $obj = $db->fetch_object($resql);
7266 return $obj->localtax;
7287function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7291 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7294 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7295 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7296 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7297 if ($firstparamisid) {
7298 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7300 $vatratecleaned = $vatrate;
7303 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7304 $vatratecleaned = $reg[1];
7305 $vatratecode = $reg[2];
7308 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7311 $sql .=
" WHERE t.fk_pays = c.rowid";
7313 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
7315 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
7317 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7318 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7320 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7324 $resql = $db->query($sql);
7326 $obj = $db->fetch_object($resql);
7329 'rowid' => $obj->rowid,
7330 'code' => $obj->code,
7331 'rate' => $obj->rate,
7332 'localtax1' => $obj->localtax1,
7333 'localtax1_type' => $obj->localtax1_type,
7334 'localtax2' => $obj->localtax2,
7335 'localtax2_type' => $obj->localtax2_type,
7337 'accountancy_code_sell' => $obj->accountancy_code_sell,
7338 'accountancy_code_buy' => $obj->accountancy_code_buy
7370 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7373 $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";
7374 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7375 if ($firstparamisid) {
7376 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7378 $vatratecleaned = $vatrate;
7381 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7382 $vatratecleaned = $reg[1];
7383 $vatratecode = $reg[2];
7386 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7387 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7388 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7389 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7391 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7392 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7394 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7396 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7400 $resql = $db->query($sql);
7402 $obj = $db->fetch_object($resql);
7405 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7408 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7409 } elseif ($local == 2) {
7410 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7412 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);
7434 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7442 $product->fetch($idprod);
7444 if (($mysoc->country_code == $thirdpartytouse->country_code)
7445 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7446 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7449 if ($idprodfournprice > 0) {
7450 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
7452 $ret = $product->vatrate_supplier;
7453 if ($product->default_vat_code_supplier) {
7454 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7460 $ret = $product->tva_tx;
7461 if ($product->default_vat_code) {
7462 $ret .=
' ('.$product->default_vat_code.
')';
7475 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7476 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7477 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7478 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7479 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7480 $sql .= $db->plimit(1);
7482 $resql = $db->query($sql);
7484 $obj = $db->fetch_object($resql);
7486 $ret = $obj->vat_rate;
7487 if ($obj->default_vat_code) {
7488 $ret .=
' ('.$obj->default_vat_code.
')';
7512 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7529 if (!class_exists(
'Product')) {
7530 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7539 $result = $product->fetch($idprod);
7541 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7555 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7556 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7557 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7558 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7559 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7560 $sql .= $db->plimit(1);
7562 $resql = $db->query($sql);
7564 $obj = $db->fetch_object($resql);
7567 $ret = $obj->localtax1;
7568 } elseif ($local == 2) {
7569 $ret = $obj->localtax2;
7577 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7602 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7605 $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;
7607 $seller_country_code = $thirdparty_seller->country_code;
7608 $seller_in_cee =
isInEEC($thirdparty_seller);
7610 $buyer_country_code = $thirdparty_buyer->country_code;
7611 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7613 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 :
''));
7618 if ($seller_in_cee && $buyer_in_cee) {
7619 $isacompany = $thirdparty_buyer->isACompany();
7620 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7621 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7635 if (!$seller_use_vat) {
7641 if (!empty($thirdparty_buyer->state_id)) {
7642 $sql =
"SELECT d.rowid, t.taux as vat_default_rate, t.code as vat_default_code ";
7643 $sql .=
" FROM ".$db->prefix().
"c_tva as t";
7644 $sql .=
" INNER JOIN ".$db->prefix().
"c_departements as d ON t.fk_department_buyer = d.rowid";
7645 $sql .=
" WHERE d.rowid = ".((int) $thirdparty_buyer->state_id);
7646 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7648 $res = $db->query($sql);
7650 if ($db->num_rows($res)) {
7651 $obj = $db->fetch_object($res);
7652 return $obj->vat_default_rate.
' ('.$obj->vat_default_code.
')';
7659 if (($seller_country_code == $buyer_country_code)
7660 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7661 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7666 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7670 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
7672 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
7673 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
7675 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
7687 if (($seller_in_cee && $buyer_in_cee)) {
7688 $isacompany = $thirdparty_buyer->isACompany();
7689 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7690 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7707 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
7708 $isacompany = $thirdparty_buyer->isACompany();
7736 if ($idprodfournprice > 0) {
7737 if (!class_exists(
'ProductFournisseur')) {
7738 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7741 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7742 return $prodprice->fourn_tva_npr;
7743 } elseif ($idprod > 0) {
7744 if (!class_exists(
'Product')) {
7745 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7748 $prod->fetch($idprod);
7749 return $prod->tva_npr;
7772 if (!is_object($thirdparty_seller)) {
7775 if (!is_object($thirdparty_buyer)) {
7780 if ($mysoc->country_code ==
'ES') {
7781 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7786 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7789 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7793 } elseif ($local == 2) {
7795 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7798 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7803 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7818function yn($yesno, $format = 1, $color = 0)
7822 $result =
'unknown';
7824 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7825 $result = $langs->trans(
'yes');
7826 if ($format == 1 || $format == 3) {
7827 $result = $langs->trans(
"Yes");
7830 $result =
'<input type="checkbox" value="1" checked disabled>';
7833 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7835 if ($format == 4 || !is_numeric($format)) {
7836 $result =
img_picto(is_numeric($format) ?
'' : $format,
'check');
7840 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7841 $result = $langs->trans(
"no");
7842 if ($format == 1 || $format == 3) {
7843 $result = $langs->trans(
"No");
7846 $result =
'<input type="checkbox" value="0" disabled>';
7849 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7851 if ($format == 4 || !is_numeric($format)) {
7852 $result =
img_picto(is_numeric($format) ?
'' : $format,
'uncheck');
7858 $classname =
'error';
7862 return '<span class="'.$classname.
'">'.$result.
'</span>';
7885function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
7887 if (empty($modulepart) && is_object(
$object)) {
7888 if (!empty(
$object->module)) {
7889 $modulepart =
$object->module;
7890 } elseif (!empty(
$object->element)) {
7891 $modulepart =
$object->element;
7898 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
7900 $arrayforoldpath[
'product'] = 2;
7903 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7904 $level = $arrayforoldpath[$modulepart];
7907 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7909 if (empty($num) && is_object(
$object)) {
7912 if (empty($alpha)) {
7913 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7915 $num = preg_replace(
'/^.*\-/i',
'', $num);
7917 $num = substr(
"000".$num, -$level);
7919 $path = substr($num, 0, 1);
7922 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7925 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7935 if (empty($withoutslash) && !empty($path)) {
7950function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
7954 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7959 if (@is_dir($dir_osencoded)) {
7967 if (!empty($dataroot)) {
7969 $dir = str_replace($dataroot.
'/',
'', $dir);
7970 $ccdir = $dataroot.
'/';
7973 $cdir = explode(
"/", $dir);
7974 $num = count($cdir);
7975 for ($i = 0; $i < $num; $i++) {
7977 $ccdir .=
'/'.$cdir[$i];
7979 $ccdir .= $cdir[$i];
7982 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7990 if (!@is_dir($ccdir_osencoded)) {
7991 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7994 $dirmaskdec = octdec((
string) $newmask);
7995 if (empty($newmask)) {
7998 $dirmaskdec |= octdec(
'0111');
7999 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
8001 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
8004 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
8013 return ($nberr ? -$nberr : $nbcreated);
8024function dolChmod($filepath, $newmask =
'')
8028 if (!empty($newmask)) {
8029 @chmod($filepath, octdec($newmask));
8031 @chmod($filepath, octdec(
$conf->global->MAIN_UMASK));
8043 return '<span class="fieldrequired">*</span>';
8063function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
8065 if (is_null($stringtoclean)) {
8069 if ($removelinefeed == 2) {
8070 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
8072 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
8077 $temp = str_replace(
'< ',
'__ltspace__', $temp);
8078 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
8081 $temp = strip_tags($temp);
8084 $pattern =
"/<[^<>]+>/";
8091 $tempbis = str_replace(
'<>',
'', $temp);
8092 $tempbis = preg_replace($pattern,
'', $tempbis);
8094 }
while ($tempbis != $temp);
8099 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
8105 if ($removelinefeed == 1) {
8106 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
8110 if ($removedoublespaces) {
8111 while (strpos($temp,
" ")) {
8112 $temp = str_replace(
" ",
" ", $temp);
8116 $temp = str_replace(
'__ltspace__',
'< ', $temp);
8117 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
8140function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0, $allowscript = 0, $allowstyle = 0, $allowphp = 0)
8142 if (empty($allowed_tags)) {
8143 $allowed_tags = array(
8144 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
8145 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
8146 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8149 $allowed_tags[] =
"comment";
8151 if (!in_array(
'iframe', $allowed_tags)) {
8152 $allowed_tags[] =
"iframe";
8156 if (!in_array(
'link', $allowed_tags)) {
8157 $allowed_tags[] =
"link";
8161 if (!in_array(
'script', $allowed_tags)) {
8162 $allowed_tags[] =
"script";
8166 if (!in_array(
'style', $allowed_tags)) {
8167 $allowed_tags[] =
"style";
8171 $allowed_tags_string = implode(
"><", $allowed_tags);
8172 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
8174 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
8179 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
8182 $allowed_tags[] =
"commentphp";
8183 $stringtoclean = preg_replace(
'/^<\?php([^"]+)\?>$/i',
'<commentphp>\1__</commentphp>', $stringtoclean);
8184 $stringtoclean = preg_replace(
'/"<\?php([^"]+)\?>"/i',
'"<commentphp>\1</commentphp>"', $stringtoclean);
8187 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
8188 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
8191 $temp = strip_tags($stringtoclean, $allowed_tags_string);
8193 if ($cleanalsosomestyles) {
8194 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
8196 if ($removeclassattribute) {
8197 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
8202 if ($cleanalsojavascript) {
8203 $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);
8206 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
8209 $temp = preg_replace(
'/<commentphp>(.*)<\/commentphp>/',
'<?php\1?>', $temp);
8212 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
8233 if (is_null($allowed_attributes)) {
8234 $allowed_attributes = array(
8235 "allow",
"allowfullscreen",
"alt",
"async",
"class",
"content",
"contenteditable",
"crossorigin",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"property",
"rel",
"src",
"style",
"target",
"title",
"type",
"width",
8237 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8241 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
8242 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
8245 $dom =
new DOMDocument(
'',
'UTF-8');
8247 $savwarning = error_reporting();
8248 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
8249 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
8250 error_reporting($savwarning);
8252 if ($dom instanceof DOMDocument) {
8253 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
8254 $el = $els->item($i);
8255 if (!$el instanceof DOMElement) {
8258 $attrs = $el->attributes;
8259 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
8261 if (!empty($attrs->item($ii)->name)) {
8262 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
8264 $els->item($i)->removeAttribute($attrs->item($ii)->name);
8265 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
8267 $valuetoclean = $attrs->item($ii)->value;
8269 if (isset($valuetoclean)) {
8271 $oldvaluetoclean = $valuetoclean;
8272 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
8273 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
8274 if ($els->item($i)->tagName ==
'a') {
8275 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
8276 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
8277 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
8281 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
8282 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8283 }
while ($oldvaluetoclean != $valuetoclean);
8286 $attrs->item($ii)->value = $valuetoclean;
8293 $return = $dom->saveHTML();
8296 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
8297 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
8298 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
8299 return trim($return);
8301 return $stringtoclean;
8318 $temp = $stringtoclean;
8319 foreach ($disallowed_tags as $tagtoremove) {
8320 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8321 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8324 if ($cleanalsosomestyles) {
8325 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8343 if ($nboflines == 1) {
8345 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8346 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8349 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8354 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8358 $text = preg_replace(
'/\n/',
'', $text);
8360 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8362 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8365 $text = strtr($text, $repTable);
8366 if ($charset ==
'UTF-8') {
8367 $pattern =
'/(<br[^>]*>)/Uu';
8370 $pattern =
'/(<br[^>]*>)/U';
8372 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8377 $lastaddediscontent = 1;
8378 while ($countline < $nboflines && isset($a[$i])) {
8379 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8380 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8381 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8383 if (!$lastaddediscontent) {
8386 $lastaddediscontent = 0;
8389 $firstline .= $a[$i];
8390 $lastaddediscontent = 1;
8396 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8398 $ret = $firstline.($adddots ?
'...' :
'');
8416function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8418 if (is_null($stringtoencode)) {
8423 return nl2br($stringtoencode, $forxml);
8425 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8439function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8441 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8446 return $stringtoencode;
8448 $out = $stringtoencode;
8452 $oldstringtoclean = $out;
8454 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8456 libxml_use_internal_errors(
false);
8457 if (LIBXML_VERSION < 20900) {
8461 libxml_disable_entity_loader(
true);
8464 $dom =
new DOMDocument();
8470 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
8472 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
8475 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8476 $out = trim($dom->saveHTML());
8479 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
8480 $out = preg_replace(
'/<\/div>$/',
'', $out);
8484 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8488 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && !in_array($check, array(
'restricthtmlallowunvalid',
'restricthtmlallowlinkscript'))) {
8493 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8499 'quote-marks' =>
false,
8500 'doctype' =>
'strict',
8501 'show-body-only' =>
true,
8502 "indent-attributes" =>
false,
8503 "vertical-space" =>
false,
8515 $out = $tidy->repairString($out, $config,
'utf8');
8522 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8527 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8530 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8534 $out = preg_replace(
'/'/i',
''', $out);
8539 $out = preg_replace_callback(
8540 '/&#(x?[0-9][0-9a-f]+;?)/i',
8545 static function ($m) {
8552 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8555 if ($check ==
'restricthtmlallowlinkscript') {
8557 } elseif ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
8569 $out = preg_replace(
'/'/i',
"'", $out);
8573 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8574 $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);
8575 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus(in|out)?|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8576 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8577 $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);
8578 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8580 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8581 }
while ($oldstringtoclean != $out);
8588 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8589 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8590 $nblinks = count($reg[0]);
8591 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8592 $out =
'ErrorTooManyLinksIntoHTMLString';
8595 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8597 $out =
'ErrorHTMLLinksNotAllowed';
8599 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8602 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8605 if (preg_match_all($pattern, $out, $matches)) {
8607 $urls = $matches[1];
8610 foreach ($urls as $url) {
8612 echo
"Found url = ".$url .
"\n";
8615 $out =
'ErrorHTMLExternalLinksNotAllowed';
8644function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
8646 if (is_null($stringtoencode)) {
8650 $newstring = $stringtoencode;
8652 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
8653 if ($removelasteolbr) {
8654 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
8656 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
8657 $newstring = strtr($newstring, array(
'&' =>
'__and__',
'<' =>
'__lt__',
'>' =>
'__gt__',
'"' =>
'__dquot__'));
8659 $newstring = strtr($newstring, array(
'__and__' =>
'&',
'__lt__' =>
'<',
'__gt__' =>
'>',
'__dquot__' =>
'"'));
8661 if ($removelasteolbr) {
8662 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
8681 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
8682 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
8683 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
8684 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
8696 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
8697 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
8713 if ($keepsomeentities) {
8714 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
8716 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
8717 if ($keepsomeentities) {
8718 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
8734function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
8736 return htmlentities($string, $flags, $encoding, $double_encode);
8755 for ($scursor = 0; $scursor < $len; $scursor++) {
8756 $ordchar = ord($s[$scursor]);
8758 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
8761 } elseif ($ordchar > 126 && $ordchar < 160) {
8765 $out .= $s[$scursor];
8787 $arraystring = explode(
"\n", $s);
8788 $nb = count($arraystring);
8805 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8807 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8810 $text = strtr($text, $repTable);
8811 if ($charset ==
'UTF-8') {
8812 $pattern =
'/(<br[^>]*>)/Uu';
8815 $pattern =
'/(<br[^>]*>)/U';
8817 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8819 $nblines = (int) floor((count($a) + 1) / 2);
8822 foreach ($a as $line) {
8825 $line_dec = html_entity_decode($line);
8827 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8828 $nblines += substr_count($line_dec,
'\n');
8848 if (is_null($msg)) {
8853 if (preg_match(
'/<(html|link|script)/i', $msg)) {
8855 } elseif (preg_match(
'/<body/i', $msg)) {
8857 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8859 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8861 } elseif (preg_match(
'/<br/i', $msg)) {
8867 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8868 if (preg_match(
'/<(html|link|script|body)/i', $msg)) {
8870 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8872 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8874 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8876 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8878 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8880 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8882 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8884 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8886 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8889 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8911function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
8913 if (!empty($invert)) {
8921 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8943 global $db,
$conf, $mysoc, $user, $extrafields;
8945 $substitutionarray = array();
8947 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include)) && $user instanceof
User) {
8951 $emailsendersignature = $user->signature;
8952 $usersignature = $user->signature;
8953 $substitutionarray = array_merge($substitutionarray, array(
8954 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8958 if (is_object($user) && ($user instanceof
User)) {
8959 $substitutionarray = array_merge($substitutionarray, array(
8960 '__USER_ID__' => (
string) $user->id,
8961 '__USER_LOGIN__' => (
string) $user->login,
8962 '__USER_EMAIL__' => (
string) $user->email,
8963 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8964 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8965 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8966 '__USER_FAX__' => (
string) $user->office_fax,
8967 '__USER_LASTNAME__' => (
string) $user->lastname,
8968 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8969 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8970 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8971 '__USER_JOB__' => (string) $user->job,
8973 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8977 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8978 $substitutionarray = array_merge($substitutionarray, array(
8979 '__MYCOMPANY_NAME__' => $mysoc->name,
8980 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8981 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8982 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8983 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8984 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8985 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8986 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8987 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8988 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8989 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
8990 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
8991 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
8992 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
8993 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8994 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8995 '__MYCOMPANY_ADDRESS__' => $mysoc->
address,
8996 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8997 '__MYCOMPANY_TOWN__' => $mysoc->town,
8998 '__MYCOMPANY_STATE__' => $mysoc->state,
8999 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
9000 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
9001 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
9002 '__MYCOMPANY_CURRENCY_CODE__' =>
$conf->currency
9006 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
9008 $substitutionarray[
'__ID__'] =
'__ID__';
9009 $substitutionarray[
'__REF__'] =
'__REF__';
9010 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
9011 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
9012 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
9013 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
9014 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
9015 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
9016 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
9018 if (isModEnabled(
"societe")) {
9019 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
9020 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
9021 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
9022 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
9023 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
9024 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
9026 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
9027 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
9028 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
9029 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
9030 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
9031 $substitutionarray[
'__THIRDPARTY_STATE__'] =
'__THIRDPARTY_STATE__';
9032 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
9033 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
9034 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
9035 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
9036 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
9037 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
9038 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
9039 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
9040 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
9041 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
9042 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
9043 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
9044 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
9046 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
9047 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
9048 $substitutionarray[
'__MEMBER_TITLE__'] =
'__MEMBER_TITLE__';
9049 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
9050 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
9051 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
9056 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
9057 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
9058 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
9059 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
9060 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
9061 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
9062 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
9063 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
9064 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
9065 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
9068 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
9069 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
9070 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
9071 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
9073 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
9074 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
9075 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
9076 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
9080 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
9081 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
9082 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
9083 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
9084 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
9086 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
9087 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
9089 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
9090 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
9092 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
9093 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
9094 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
9095 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
9096 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
9097 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
9098 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
9100 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
9101 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
9102 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
9103 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
9104 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
9106 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
9107 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
9108 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
9109 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
9111 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
9112 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
9113 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
9116 '@phan-var-force Adherent|Delivery $object';
9117 $substitutionarray[
'__ID__'] =
$object->id;
9118 $substitutionarray[
'__REF__'] =
$object->ref;
9119 $substitutionarray[
'__NEWREF__'] =
$object->newref;
9121 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9122 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9123 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
9124 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
9125 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day',
false, $outputlangs) :
'');
9126 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day',
false, $outputlangs) :
'');
9127 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day',
false, $outputlangs) :
'');
9128 $substitutionarray[
'__DATE_DELIVERY__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
'day',
false, $outputlangs) :
'');
9130 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%A") :
'');
9132 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%b") :
'');
9139 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
9140 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
9141 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset(
$object->delivery_date) ?
dol_print_date(
$object->delivery_date,
'day',
false, $outputlangs) :
'');
9142 $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 :
'')) :
'');
9146 '@phan-var-force Adherent $object';
9149 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
9150 if (method_exists(
$object,
'getCivilityLabel')) {
9151 $substitutionarray[
'__MEMBER_TITLE__'] =
$object->getCivilityLabel();
9153 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
9154 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
9155 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
9156 if (method_exists(
$object,
'getFullName')) {
9157 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
9159 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
9160 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
9161 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
9162 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
9163 $substitutionarray[
'__MEMBER_STATE__'] = (isset(
$object->state) ?
$object->state :
'');
9164 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
9165 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
9166 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
9167 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
9168 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
9169 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
9173 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
9174 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
9176 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
9177 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
9178 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
9179 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
9180 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
9181 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
9182 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
9183 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
9184 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
9185 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
9186 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
9190 '@phan-var-force Societe $object';
9191 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object) ?
$object->id :
'');
9192 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object) ?
$object->name :
'');
9193 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object) ?
$object->name_alias :
'');
9194 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object) ?
$object->code_client :
'');
9195 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object) ?
$object->code_fournisseur :
'');
9196 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object) ?
$object->email :
'');
9197 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object) ?
$object->email :
'');
9200 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object) ?
$object->address :
'');
9201 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object) ?
$object->zip :
'');
9202 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object) ?
$object->town :
'');
9203 $substitutionarray[
'__THIRDPARTY_STATE__'] = (is_object(
$object) ?
$object->state :
'');
9204 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object) ?
$object->country_id :
'');
9205 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object) ?
$object->country_code :
'');
9206 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object) ?
$object->idprof1 :
'');
9207 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object) ?
$object->idprof2 :
'');
9208 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object) ?
$object->idprof3 :
'');
9209 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object) ?
$object->idprof4 :
'');
9210 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object) ?
$object->idprof5 :
'');
9211 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object) ?
$object->idprof6 :
'');
9212 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object) ?
$object->tva_intra :
'');
9215 } elseif (is_object(
$object->thirdparty)) {
9216 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->id :
'');
9217 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name :
'');
9218 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name_alias :
'');
9219 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_client :
'');
9220 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_fournisseur :
'');
9221 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9222 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9225 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->address :
'');
9226 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->zip :
'');
9227 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->town :
'');
9228 $substitutionarray[
'__THIRDPARTY_STATE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->state :
'');
9229 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_id :
'');
9230 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_code :
'');
9231 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof1 :
'');
9232 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof2 :
'');
9233 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof3 :
'');
9234 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof4 :
'');
9235 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof5 :
'');
9236 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof6 :
'');
9237 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->tva_intra :
'');
9242 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
9243 '@phan-var-force RecruitmentCandidature $object';
9244 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
9245 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9246 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9248 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
9249 '@phan-var-force ConferenceOrBoothAttendee $object';
9250 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
9251 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9252 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9256 '@phan-var-force Project $object';
9257 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
9258 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
9259 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
9260 } elseif (is_object(
$object)) {
9262 if (!empty(
$object->project)) {
9264 } elseif (!empty(
$object->projet)) {
9267 if (!is_null($project) && is_object($project)) {
9268 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
9269 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
9270 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
9275 $project_id =
$object->fk_project;
9276 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
9277 $project_id =
$object->fk_project;
9279 if ($project_id > 0) {
9281 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9282 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9283 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9289 '@phan-var-force Facture $object';
9290 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
9293 '@phan-var-force Expedition $object';
9294 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9295 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9296 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9299 '@phan-var-force Reception $object';
9300 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9301 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9305 '@phan-var-force Contrat $object';
9306 $dateplannedstart =
'';
9307 $datenextexpiration =
'';
9308 foreach (
$object->lines as $line) {
9309 if ($line->date_start > $dateplannedstart) {
9310 $dateplannedstart = $line->date_start;
9312 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9313 $datenextexpiration = $line->date_end;
9316 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9317 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9318 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9320 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9321 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9322 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9326 '@phan-var-force Ticket $object';
9327 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9328 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9329 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9330 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9331 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9332 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9333 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9334 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9335 $userstat =
new User($db);
9336 if (
$object->fk_user_assign > 0) {
9337 $userstat->fetch(
$object->fk_user_assign);
9338 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9341 if (
$object->fk_user_create > 0) {
9342 $userstat->fetch(
$object->fk_user_create);
9343 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9349 if (!is_object($extrafields)) {
9352 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9354 if (
$object->fetch_optionals() > 0) {
9355 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9356 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9357 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9358 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9359 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9360 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9361 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9362 $datetime =
$object->array_options[
'options_'.$key];
9363 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9364 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9365 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9366 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9367 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9368 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9369 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9370 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9371 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9372 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9373 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9374 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9382 if (empty($substitutionarray[
'__REF__'])) {
9386 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9387 $outputlangs->loadLangs(array(
'paypal',
'other'));
9390 $typeforonlinepayment =
'free';
9392 $typeforonlinepayment =
'order';
9395 $typeforonlinepayment =
'invoice';
9398 $typeforonlinepayment =
'member';
9399 if (!empty(
$object->last_subscription_amount)) {
9400 $amounttouse =
$object->last_subscription_amount;
9404 $typeforonlinepayment =
'contract';
9407 $typeforonlinepayment =
'ficheinter';
9410 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9415 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9416 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9420 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions_be.lib.php';
9425 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9427 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9430 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9432 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9435 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9437 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9440 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9442 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9445 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9447 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9450 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9452 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9456 '@phan-var-force Propal $object';
9457 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9458 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9459 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9462 '@phan-var-force Commande $object';
9463 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9466 '@phan-var-force Facture $object';
9467 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9470 '@phan-var-force Contrat $object';
9471 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9472 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9473 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9476 '@phan-var-force Fichinter $object';
9477 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9478 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9479 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9481 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9482 '@phan-var-force SupplierProposal $object';
9483 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9485 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9486 '@phan-var-force FactureFournisseur $object';
9487 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9490 '@phan-var-force Expedition $object';
9491 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9496 '@phan-var-force ActionComm $object';
9497 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9498 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9500 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9504 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9505 '@phan-var-force Facture|FactureRec $object';
9506 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9509 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day',
false, $outputlangs) : null) :
'';
9511 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext',
false, $outputlangs) : null) :
'';
9513 $already_payed_all = 0;
9518 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9522 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9526 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9528 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9532 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9533 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9535 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9536 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9540 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9541 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9542 $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) :
'';
9543 $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)) :
'';
9544 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9545 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9547 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9548 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1,
$conf->currency) : null) :
'';
9551 if ($onlykey != 2) {
9552 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9553 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9554 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9555 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9556 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9557 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9559 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9560 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9564 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9565 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9566 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9567 $substitutionarray[
'__MULTICURRENCY_CODE__'] = (is_object(
$object) && isset(
$object->multicurrency_code)) ?
$object->multicurrency_code :
'';
9571 if ($onlykey != 2) {
9572 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9573 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
9579 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
9580 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
9590 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
9592 $substitutionarray = array_merge($substitutionarray, array(
9593 '__NOW_TMS__' => (
string) $now,
9594 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
9595 '__DAY__' => (
string) $tmp[
'mday'],
9596 '__DAY_TEXT__' => $daytext,
9597 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
9598 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
9599 '__MONTH__' => (
string) $tmp[
'mon'],
9600 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
9601 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
9602 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
9603 '__YEAR__' => (
string) $tmp[
'year'],
9604 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
9605 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
9606 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
9607 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
9608 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
9609 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
9610 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
9611 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
9612 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
9616 if (isModEnabled(
'multicompany')) {
9617 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' =>
$conf->entity));
9619 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
9620 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
9621 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
9622 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
9623 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
9628 return $substitutionarray;
9647function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
9649 global
$conf, $db, $langs;
9651 if (!is_array($substitutionarray)) {
9652 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
9655 if (empty($outputlangs)) {
9656 $outputlangs = $langs;
9666 if (is_object($outputlangs)) {
9668 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
9670 $tmp = explode(
'|', $reg[1]);
9671 if (!empty($tmp[1])) {
9672 $outputlangs->load($tmp[1]);
9675 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
9677 if (empty($converttextinhtmlifnecessary)) {
9679 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9693 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
9701 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
9702 $keyfound = $reg[1];
9704 $value =
'*****forbidden*****';
9706 $value = empty(
$conf->global->$keyfound) ?
'' :
$conf->global->$keyfound;
9709 if (empty($converttextinhtmlifnecessary)) {
9711 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9724 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
9729 foreach ($substitutionarray as $key => $value) {
9730 if (!isset($value)) {
9734 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
9738 if (empty($converttextinhtmlifnecessary)) {
9739 $text = str_replace(
"$key",
"$value", $text);
9751 $text = str_replace(
"$key",
"$value", $text);
9767 $memory_object_list = array();
9768 foreach ($substitutionarray as $key => $value) {
9769 $lazy_load_arr = array();
9770 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
9771 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
9772 $key_to_substitute = $lazy_load_arr[1];
9773 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
9774 $param_arr = explode(
':', $value);
9776 if (count($param_arr) == 4) {
9777 $path = $param_arr[0];
9778 $class = $param_arr[1];
9779 $method = $param_arr[2];
9780 $id = (int) $param_arr[3];
9783 if (!isset($memory_object_list[$class])) {
9785 require_once DOL_DOCUMENT_ROOT . $path;
9786 if (class_exists($class)) {
9787 $memory_object_list[$class] = array(
9795 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
9796 if (method_exists($class, $method)) {
9797 if (!isset($memory_object_list[$class][
'list'][
$id])) {
9798 $tmpobj =
new $class($db);
9800 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute);
9801 $memory_object_list[$class][
'list'][
$id] = $tmpobj;
9804 $tmpobj = $memory_object_list[$class][
'list'][
$id];
9806 $valuetouseforsubstitution = $tmpobj->$method(
$id, $key_to_substitute,
true);
9809 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
9835 global
$conf, $user;
9837 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9842 $dirsubstitutions = array_merge(array(), (array)
$conf->modules_parts[
'substitutions']);
9844 foreach ($dirsubstitutions as $reldir) {
9852 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
9853 foreach ($substitfiles as $substitfile) {
9855 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
9858 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
9860 require_once $dir.$substitfile[
'name'];
9862 $function_name = $module.
"_".$callfunc;
9863 if (function_exists($function_name)) {
9864 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
9872 foreach ($substitutionarray as $key => $value) {
9873 $tags .=
'{'.$key.
'} => '.$value.
"\n";
9875 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9888function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
9890 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9903function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
9909 if (!is_object($outputlangs)) {
9910 $outputlangs = $langs;
9913 if ($date_start && $date_end) {
9914 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9916 if ($date_start && !$date_end) {
9917 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9919 if (!$date_start && $date_end) {
9920 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9940 if ($nameorder < 0) {
9943 if ($nameorder == 1) {
9945 if ($firstname && $lastname) {
9949 } elseif ($nameorder == 2 || $nameorder == 3) {
9951 if (empty($ret) && $nameorder == 3) {
9956 if (empty($ret) && $nameorder == 5) {
9959 if ($nameorder == 0) {
9960 if ($firstname && $lastname) {
9982function setEventMessage($mesgs, $style =
'mesgs', $noduplicate = 0, $attop = 0)
9985 if (!is_array($mesgs)) {
9986 $mesgs = trim((
string) $mesgs);
9989 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9993 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
9995 $_SESSION[
'dol_events'][$style][] = $mesgs;
10000 foreach ($mesgs as $mesg) {
10001 $mesg = trim((
string) $mesg);
10003 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
10007 array_unshift($_SESSION[
'dol_events'][$style], $mesgs);
10009 $_SESSION[
'dol_events'][$style][] = $mesg;
10029function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0, $attop = 0)
10031 if (empty($mesg) && empty($mesgs)) {
10039 if (empty($messagekey) || empty($_COOKIE[
"DOLUSER_HIDEMESSAGE".$messagekey])) {
10040 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
10041 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
10043 if (empty($mesgs)) {
10046 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
10067 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
10068 if (empty($disabledoutputofmessages)) {
10071 unset($_SESSION[
'dol_events'][
'mesgs']);
10074 if (isset($_SESSION[
'dol_events'][
'errors'])) {
10075 if (empty($disabledoutputofmessages)) {
10078 unset($_SESSION[
'dol_events'][
'errors']);
10082 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
10083 if (empty($disabledoutputofmessages)) {
10086 unset($_SESSION[
'dol_events'][
'warnings']);
10104function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
10106 global
$conf, $langs;
10111 $divstart = $divend =
'';
10114 if ((empty(
$conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
10115 $divstart =
'<div class="'.$style.
' clearboth">';
10116 $divend =
'</div>';
10119 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
10120 $langs->load(
"errors");
10122 if (is_array($mesgarray) && count($mesgarray)) {
10123 foreach ($mesgarray as $message) {
10125 $out .= $langs->trans($message);
10126 if ($ret < count($mesgarray)) {
10133 $out .= $langs->trans($mesgstring);
10139 if (!empty(
$conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
10140 $return =
'<script nonce="'.getNonce().
'">
10141 $(document).ready(function() {
10146 /* jnotify(message, preset of message type, keepmessage) */
10148 "'.($style ==
"ok" ? 3000 : $style).
'",
10149 '.($style ==
"ok" ?
"false" :
"true").
',
10150 { remove: function (){} } );
10191function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
10193 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
10199 if (is_array($mesgarray)) {
10200 foreach ($mesgarray as $val) {
10201 if ($val && preg_match(
'/class="error"/i', $val)) {
10205 if ($val && preg_match(
'/class="warning"/i', $val)) {
10210 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
10212 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
10215 if ($style ==
'error') {
10218 if ($style ==
'warning') {
10222 if ($iserror || $iswarning) {
10224 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
10225 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
10226 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
10228 if (is_array($mesgarray)) {
10229 $newmesgarray = array();
10230 foreach ($mesgarray as $val) {
10231 if (is_string($val)) {
10232 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
10233 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
10234 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
10235 $newmesgarray[] = $tmpmesgstring;
10237 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
10240 $mesgarray = $newmesgarray;
10242 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
10284function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
10287 $order = strtolower($order);
10289 if (is_array($array)) {
10290 $sizearray = count($array);
10291 if ($sizearray > 0) {
10293 foreach (array_keys($array) as $key) {
10294 if (is_object($array[$key])) {
10295 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
10298 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
10300 if ($natsort == -1) {
10301 $temp[$key] =
'___'.$temp[$key];
10305 if (empty($natsort) || $natsort == -1) {
10306 if ($order ==
'asc') {
10312 if ($case_sensitive) {
10315 natcasesort($temp);
10317 if ($order !=
'asc') {
10318 $temp = array_reverse($temp,
true);
10324 foreach (array_keys($temp) as $key) {
10325 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10344 $str = (string) $str;
10347 $strLength = strlen($str);
10348 for ($i = 0; $i < $strLength; $i++) {
10349 if (ord($str[$i]) < 0x80) {
10351 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10353 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10355 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10357 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10359 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10364 for ($j = 0; $j < $n; $j++) {
10365 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10386 return preg_match(
'//u', $str) ? true :
false;
10398 if (function_exists(
'mb_check_encoding')) {
10400 if (!mb_check_encoding($str,
'ASCII')) {
10404 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10422 $tmp = ini_get(
"unicode.filesystem_encoding");
10423 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10424 $tmp =
'iso-8859-1';
10433 if ($tmp ==
'iso-8859-1') {
10434 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10454function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
10464 if (isset(
$conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10465 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10468 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10470 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10471 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10472 if ($fieldkey ==
'id' || $fieldkey ==
'rowid') {
10473 $sql .=
" WHERE ".$fieldkey.
" = ".((int) $key);
10475 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10477 if (!empty($entityfilter)) {
10478 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10484 $resql = $db->query($sql);
10486 $obj = $db->fetch_object($resql);
10488 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $obj->valuetoget;
10490 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10494 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10511 if ($matchrule == 1) {
10512 if ($var ==
'mainmenu') {
10514 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10515 } elseif ($var ==
'leftmenu') {
10517 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10519 return 'This variable is not accessible with dol_eval';
10522 return 'This value for matchrule is not implemented';
10536function verifCond($strToEvaluate, $onlysimplestring =
'1')
10540 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10543 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10544 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10564function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10568 global $db, $langs, $user, $website, $websitepage;
10569 global $action, $mainmenu, $leftmenu;
10571 global $objectoffield;
10577 $isObBufferActive =
false;
10578 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
10579 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
10584 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
10590 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
10591 if ($onlysimplestring ==
'2') {
10592 $specialcharsallowed .=
'<[]';
10595 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
10597 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
10598 if ($returnvalue) {
10599 return 'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): '.$s;
10601 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple one line clean eval string): '.$s, LOG_WARNING);
10607 if (preg_match(
'/<=?[^\s]/', $s)) {
10608 if ($returnvalue) {
10609 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a < or <= without space before and after): '.$s;
10611 dol_syslog(
'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found a < or <= without space before and after): '.$s, LOG_WARNING);
10617 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
10618 if ($returnvalue) {
10619 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;
10621 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);
10630 while ($scheck && $savescheck != $scheck) {
10631 $savescheck = $scheck;
10632 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10633 $scheck = preg_replace(
'/::[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10634 $scheck = preg_replace(
'/^\(+/',
'__PARENTHESIS__ ', $scheck);
10635 $scheck = preg_replace(
'/\&\&\s+\(/',
'__ANDPARENTHESIS__ ', $scheck);
10636 $scheck = preg_replace(
'/\|\|\s+\(/',
'__ORPARENTHESIS__ ', $scheck);
10637 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10638 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10639 $scheck = preg_replace(
'/^!\(/',
'__NOTANDPARENTHESIS__', $scheck);
10640 $scheck = preg_replace(
'/\s!\(/',
'__NOTANDPARENTHESIS__', $scheck);
10641 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
10646 if (strpos($scheck,
'(') !==
false) {
10647 if ($returnvalue) {
10648 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
10650 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);
10659 if (is_array($s) || $s ===
'Array') {
10660 if ($returnvalue) {
10661 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
10663 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
10667 if (strpos($s,
'::') !==
false) {
10668 if ($returnvalue) {
10669 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
10671 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s, LOG_WARNING);
10675 if (strpos($s,
'`') !==
false) {
10676 if ($returnvalue) {
10677 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
10679 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
10683 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
10684 if ($returnvalue) {
10685 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
10687 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
10693 $forbiddenphpstrings = array(
'$$',
'$_',
'}[');
10694 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
10697 $forbiddenphpfunctions = array();
10699 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
10700 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
10701 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
10702 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
10703 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
10704 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
10705 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
10706 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
10707 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
10708 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
10709 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
10711 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
10713 $forbiddenphpregex =
'global\s*\$';
10714 $forbiddenphpregex .=
'|';
10715 $forbiddenphpregex .=
'\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
10717 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
10720 $oldstringtoclean = $s;
10721 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
10722 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
10723 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
10725 }
while ($oldstringtoclean != $s);
10728 if (strpos($s,
'__forbiddenstring__') !==
false) {
10729 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
10730 if ($returnvalue) {
10731 return 'Bad string syntax to evaluate: '.$s;
10733 dol_syslog(
'Bad string syntax to evaluate: '.$s);
10739 if ($returnvalue) {
10741 $isObBufferActive =
true;
10742 $tmps = $hideerrors ? @eval(
'return ' . $s .
';') : eval(
'return ' . $s .
';');
10743 $tmpo = ob_get_clean();
10744 $isObBufferActive =
false;
10746 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: ' . $s;
10750 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
10758 }
catch (Error $e) {
10759 if ($isObBufferActive) {
10761 $tmpo = ob_get_clean();
10762 $isObBufferActive =
false;
10764 $error =
'dol_eval try/catch error : ';
10765 $error .= $e->getMessage();
10767 if ($returnvalue) {
10768 return 'Exception during evaluation: '.$s;
10784 return (trim($element) !=
'');
10797 if (empty($codelang)) {
10801 if ($codelang ==
'auto') {
10802 return '<span class="fa fa-language"></span>';
10805 $langtocountryflag = array(
10807 'ca_ES' =>
'catalonia',
10811 'sw_SW' =>
'unknown',
10821 if (isset($langtocountryflag[$codelang])) {
10822 $flagImage = $langtocountryflag[$codelang];
10824 $tmparray = explode(
'_', $codelang);
10825 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
10830 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
10831 $morecss = $reg[1];
10836 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
10850 if (empty($countrycode)) {
10854 if (strtoupper($countrycode) ==
'MQ') {
10857 if (strtoupper($countrycode) ==
'SE') {
10860 if (strtoupper($countrycode) ==
'CH') {
10861 if ($mysoc->country_code ==
'FR') {
10864 if ($mysoc->country_code ==
'DE') {
10867 if ($mysoc->country_code ==
'IT') {
11049 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
11050 if (in_array($buildprimarykeytotest, $locales)) {
11051 return strtolower($countrycode).
'_'.strtoupper($countrycode);
11054 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
11055 foreach ($locales as $locale) {
11056 $locale_language = locale_get_primary_language($locale);
11057 $locale_region = locale_get_region($locale);
11058 if (strtoupper($countrycode) == $locale_region) {
11060 return strtolower($locale_language).
'_'.strtoupper($locale_region);
11064 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
11102 global $hookmanager, $db;
11104 if (isset(
$conf->modules_parts[
'tabs'][$type]) && is_array(
$conf->modules_parts[
'tabs'][$type])) {
11105 foreach (
$conf->modules_parts[
'tabs'][$type] as $value) {
11106 $values = explode(
':', $value);
11109 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
11114 $posstart = strpos($str,
'(');
11115 if ($posstart > 0) {
11116 $posend = strpos($str,
')');
11117 if ($posstart > 0) {
11118 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
11119 if (is_numeric($res1)) {
11120 $postab = (int) $res1;
11121 $values[1] =
'+' . substr($str, $posend + 1);
11125 if (count($values) == 6) {
11129 if ($values[0] != $type) {
11135 if ($filterorigmodule) {
11136 if (strpos($values[3],
'@')) {
11137 if ($filterorigmodule !=
'external') {
11141 if ($filterorigmodule !=
'core') {
11146 $langs->load($values[3]);
11148 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11150 $substitutionarray = array();
11155 $labeltemp = explode(
',', $values[2]);
11156 $label = $langs->trans($labeltemp[0]);
11158 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
11160 $classtoload = $labeltemp[1];
11161 if (class_exists($classtoload)) {
11162 $obj =
new $classtoload($db);
11163 $function = $labeltemp[3];
11164 if ($obj && $function && method_exists($obj, $function)) {
11166 $nbrec = $obj->$function(
$object->id, $obj);
11167 if (!empty($nbrec)) {
11168 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
11176 $newtab[1] = $label;
11177 $newtab[2] = str_replace(
'+',
'', $values[1]);
11182 } elseif (count($values) == 5) {
11183 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
11185 if ($values[0] != $type) {
11189 if ($filterorigmodule) {
11190 if (strpos($values[3],
'@')) {
11191 if ($filterorigmodule !=
'external') {
11195 if ($filterorigmodule !=
'core') {
11200 $langs->load($values[3]);
11202 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
11203 $substitutionarray = array();
11207 $label = $langs->trans($values[2]);
11211 $newtab[1] = $label;
11212 $newtab[2] = str_replace(
'+',
'', $values[1]);
11216 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
11217 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
11218 if ($values[0] != $type) {
11221 $tabname = str_replace(
'-',
'', $values[1]);
11222 foreach ($head as $key => $val) {
11223 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
11225 if ($head[$key][2] == $tabname && $condition) {
11226 unset($head[$key]);
11235 if (!empty($hookmanager)) {
11236 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
11237 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
11238 if ($reshook > 0) {
11239 $head = $hookmanager->resArray;
11241 $head = array_merge($head, $hookmanager->resArray);
11260 global
$conf, $hookmanager, $user, $langs;
11263 global $micro_start_time;
11265 if ($zone ==
'private') {
11266 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
11268 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
11272 print
"\n<!-- A div to store page_y POST parameter -->\n";
11273 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
11275 $parameters = array();
11276 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
11277 if (empty($reshook)) {
11283 if (!empty(
$conf->use_javascript_ajax)) {
11284 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
11285 print
'<script>'.
"\n";
11286 print
'jQuery(document).ready(function() {'.
"\n";
11288 if ($zone ==
'private' && empty(
$conf->dol_use_jmobile)) {
11290 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
11291 print
'jQuery("li.menuhider").click(function(event) {';
11292 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
11293 print
' console.log("We click on .menuhider");'.
"\n";
11294 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
11299 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"])))) {
11300 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
11301 $relativepathstring = $_SERVER[
"PHP_SELF"];
11303 if (constant(
'DOL_URL_ROOT')) {
11304 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
11306 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
11307 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
11310 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
11311 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
11313 if ($defkey !=
'_noquery_') {
11314 $tmpqueryarraytohave = explode(
'&', $defkey);
11316 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11317 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
11319 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
11323 if (!$foundintru) {
11332 print
'console.log("set the focus by executing jQuery(...).focus();")'.
"\n";
11333 foreach ($defval as $paramkey => $paramval) {
11335 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
11336 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // TODO KO with ckeditor
11337 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
11342 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
11343 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
11345 if ($defkey != '_noquery_') {
11346 $tmpqueryarraytohave = explode('&', $defkey);
11348 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11349 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
11350 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
11351 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
11355 if (!$foundintru) {
11358 //var_dump($defkey.'-'.$qualified);
11364 print 'console.log("set the js code to manage fields that are
set as mandatory
");'."\n
";
11366 foreach ($defval as $paramkey => $paramval) {
11367 // Solution 1: Add handler on submit to check if mandatory fields are empty
11368 print 'var form = $(\'#'.dol_escape_js($paramkey).'\').closest("form
");'."\n
";
11369 print "form.on(
'submit',
function(event) {
11370 var submitter =
event.originalEvent.submitter;
11372 var buttonName = $(submitter).attr(
'name');
11373 if (buttonName ==
'cancel') {
11374 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
11379 console.log(
'We did not click on cancel button but on something else, we check that field #".dol_escape_js($paramkey)." is not empty');
11381 var tmpvalue = jQuery(
'#".dol_escape_js($paramkey)."').val();
11382 let tmptypefield = jQuery(
'#".dol_escape_js($paramkey)."').prop(
'nodeName').toLowerCase();
11384 if (tmptypefield ==
'textarea') {
11386 var tmpeditor = CKEDITOR.instances[
'".dol_escape_js($paramkey)."'];
11388 tmpvalue = tmpeditor.getData();
11389 console.log(
'For textarea tmpvalue is '+tmpvalue);
11393 let tmpvalueisempty =
false;
11394 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'' || tmpvalue === -1) {
11395 tmpvalueisempty =
true;
11397 if (tmpvalue ===
'0' && tmptypefield ==
'select') {
11398 tmpvalueisempty =
true;
11400 if (tmpvalueisempty) {
11401 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
11402 event.preventDefault();
11403 event.stopPropagation();
11404 alert(
'".dol_escape_js($langs->trans("ErrorFieldRequired", $paramkey).' (
'.$langs->trans("CustomMandatoryFieldRule").')
')."');
11407 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
11412 // Solution 2: Add property 'required' on input
11413 // so browser will check value and try to focus on it when submitting the form.
11414 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
11415 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11416 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11417 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
11418 //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
";
11419 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
11425 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");'.
"\n";
11430 print
'jQuery("input[name=\'cancel\']").click(function() {
11431 console.log("We click on cancel button so removed all required attribute");
11432 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
11442 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
11444 print
"/* JS CODE TO ENABLE to add memory info */\n";
11445 print
'window.console && console.log("';
11450 if (!empty($micro_start_time)) {
11451 $micro_end_time = microtime(
true);
11452 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
11455 if (function_exists(
"memory_get_usage")) {
11456 print
' - Mem: '.memory_get_usage();
11458 if (function_exists(
"memory_get_peak_usage")) {
11459 print
' - Real mem peak: '.memory_get_peak_usage(
true);
11461 if (function_exists(
"zend_loader_file_encoded")) {
11462 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
11467 print
"\n".
'</script>'.
"\n";
11473 foreach ($tmptagarray as $tmptag) {
11475 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
11477 <!-- Global site tag (gtag.js) - Google Analytics -->
11478 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
11480 window.dataLayer = window.dataLayer || [];
11481 function gtag(){dataLayer.push(arguments);}
11482 gtag(\'js\', new Date());
11484 gtag(\'config\', \''.trim($tmptag).
'\');
11491 // Add Xdebug coverage of code
11492 if (defined('XDEBUGCOVERAGE
')) {
11493 print_r(xdebug_get_code_coverage());
11496 // Add DebugBar data
11497 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
11498 if (isset($debugbar['time
'])) {
11499 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
11500 $debugbar['time
']->stopMeasure('pageaftermaster
');
11502 print '<!-- Output debugbar data -->
'."\n";
11503 $renderer = $debugbar->getJavascriptRenderer();
11504 print $renderer->render();
11505 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
11507 print "<!-- Start of log output\n";
11508 //print '<div
class=
"hidden">
'."\n";
11509 foreach ($conf->logbuffer as $logline) {
11510 print $logline."<br>\n";
11512 //print '</div>
'."\n";
11513 print "End of log output -->\n";
11527function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
11529 if (is_null($string)) {
11533 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
11534 // This is a regex string
11535 $newdelimiter = $delimiter;
11537 // This is a simple string
11538 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
11539 $newdelimiter = preg_quote($delimiter, '/
');
11542 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
11544 foreach ($a as $s) { // each part
11546 if ($pos = strpos($s, $kv)) { // key/value delimiter
11547 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
11548 } else { // key delimiter not found
11566function dol_set_focus($selector)
11568 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
11569 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
11580function dol_getmypid()
11582 if (!function_exists('getmypid
')) {
11583 return mt_rand(99900000, 99965535);
11585 return getmypid(); // May be a number on 64 bits (depending on OS)
11611function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
11613 global $db, $langs;
11615 $value = trim($value);
11618 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
11621 $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
11624 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
11626 $crits = explode(' ', $value);
11628 if (!is_array($fields)) {
11629 $fields = array($fields);
11632 $i1 = 0; // count the nb of and criteria added (all fields / criteria)
11633 foreach ($crits as $crit) { // Loop on each AND criteria
11634 $crit = trim($crit);
11635 $i2 = 0; // count the nb of valid criteria added for this this first criteria
11637 foreach ($fields as $field) {
11639 $tmpcrits = explode('|
', $crit);
11640 $i3 = 0; // count the nb of valid criteria added for this current field
11641 foreach ($tmpcrits as $tmpcrit) {
11642 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11645 $tmpcrit = trim($tmpcrit);
11647 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11650 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
11653 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
11654 if (!empty($reg[1])) {
11655 $operator = $reg[1];
11657 if ($newcrit != '') {
11658 $numnewcrit = price2num($newcrit);
11659 if (is_numeric($numnewcrit)) {
11660 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
11662 $newres .= '1 = 2
'; // force false, we received a corrupted data
11664 $i3++; // a criteria was added to string
11667 $i2++; // a criteria for 1 more field was added to string
11668 } elseif ($mode == 2 || $mode == -2) {
11669 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
11670 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
11671 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
11673 $newres .= ' OR
'.$field.' IS NULL
';
11675 $i2++; // a criteria for 1 more field was added to string
11676 } elseif ($mode == 3 || $mode == -3) {
11677 $tmparray = explode(',
', $crit);
11678 if (count($tmparray)) {
11680 foreach ($tmparray as $val) {
11683 $listofcodes .= ($listofcodes ? ',
' : '');
11684 $listofcodes .= "'".$db->escape($val)."'";
11687 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
11688 $i2++; // a criteria for 1 more field was added to string
11691 $newres .= ' OR
'.$field.' IS NULL
';
11693 } elseif ($mode == 4) {
11694 $tmparray = explode(',
', $crit);
11695 if (count($tmparray)) {
11697 foreach ($tmparray as $val) {
11700 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
11701 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
11702 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
11703 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
11705 $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)
11709 } else { // $mode=0
11710 $tmpcrits = explode('|
', $crit);
11711 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
11712 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
11713 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11716 $tmpcrit = trim($tmpcrit);
11718 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
11719 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
11721 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11724 if (preg_match('/\.(
id|rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
11725 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
11727 $tmpcrit2 = $tmpcrit;
11732 if (preg_match('/^!/
', $tmpcrit)) {
11733 $tmps .= $field." NOT LIKE "; // ! as exclude character
11734 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
11736 $tmps .= $field." LIKE ";
11740 if (preg_match('/^[\^\$]/', $tmpcrit)) {
11742 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
11744 if (preg_match('/[\^\$]$/', $tmpcrit)) {
11746 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
11749 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
11753 $newres .= $tmpbefore;
11754 $newres .= $db->escape($tmpcrit2);
11755 $newres .= $tmpafter;
11757 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
11758 $newres .= " OR ".$field." IS NULL)";
11765 $i2++; // a criteria for 1 more field was added to string
11770 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
11774 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
11785function showDirectDownloadLink($object)
11790 $url = $object->getLastMainDocLink($object->element);
11792 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
11794 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
11795 $out .= ajax_autoselect("directdownloadlink", '');
11797 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
11811function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
11813 $dirName = dirname($file);
11814 if ($dirName == '.
') {
11818 if (!in_array($extName, array('', '_small
', '_mini
'))) {
11819 return 'Bad parameter extName
';
11822 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove image extension, whatever is its case
11823 $fileName = basename($fileName);
11825 if (empty($extImgTarget)) {
11826 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
11828 if (empty($extImgTarget)) {
11829 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
11831 if (empty($extImgTarget)) {
11832 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
11834 if (empty($extImgTarget)) {
11835 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
11837 if (empty($extImgTarget)) {
11838 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
11840 if (empty($extImgTarget)) {
11841 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
11844 if (!$extImgTarget) {
11850 $subdir = 'thumbs/
';
11853 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
11866function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
11868 global $conf, $langs;
11870 if (empty($conf->use_javascript_ajax)) {
11874 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
11876 if ($alldata == 1) {
11877 if ($isAllowedForPreview) {
11878 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));
11884 // old behavior, return a string
11885 if ($isAllowedForPreview) {
11886 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
11887 $title = $langs->transnoentities("Preview");
11888 //$title = '%27-alert(document.domain)-%27
'; // An example of js injection into a corrupted title string, that should be blocked by the dol_escape_uri().
11889 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg"); // An example of tmpurl that should be blocked by the dol_escape_uri()
11891 // We need to do a dol_escape_uri() on the full string after the javascript: because such parts are the URI and when we click on such links, a RFC3986 decode is done,
11892 // by the browser, converting the %27 (like when having param file=abc%27def), or when having a corrupted title), into a ', BEFORE interpreting the content that can be a js code.
11906function getLabelSpecialCode($idcode)
11910 $arrayspecialines = array(1 => 'Transport
', 2 => 'EcoTax
', 3 => 'Option
');
11911 if ($idcode > 10) {
11912 return 'Module ID
'.$idcode;
11914 if (!empty($arrayspecialines[$idcode])) {
11915 return $langs->trans($arrayspecialines[$idcode]);
11928function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
11931 $out = '<script nonce=
"'.getNonce().'">
11932 jQuery(document).ready(
function () {
11933 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
11937 if ($textonlink === 'image
') {
11938 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
11940 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
11953function dolIsAllowedForPreview($file)
11955 // Check .noexe extension in filename
11956 if (preg_match('/\.noexe$/i
', $file)) {
11960 // Check mime types
11961 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
11962 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
11963 $mime_preview[] = 'svg+xml
';
11965 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
11966 //$mime_preview[]='archive
';
11967 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
11968 if ($num_mime !== false) {
11972 // By default, not allowed for preview
11986function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
11989 $imgmime = 'other.png
';
11990 $famime = 'file-o
';
11993 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
11995 // Plain text files
11996 if (preg_match('/\.txt$/i
', $tmpfile)) {
11997 $mime = 'text/plain
';
11998 $imgmime = 'text.png
';
11999 $famime = 'file-alt
';
12000 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
12001 $mime = 'text/richtext
';
12002 $imgmime = 'text.png
';
12003 $famime = 'file-alt
';
12004 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
12005 $mime = 'text/csv
';
12006 $imgmime = 'text.png
';
12007 $famime = 'file-csv
';
12008 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
12009 $mime = 'text/tab-separated-values
';
12010 $imgmime = 'text.png
';
12011 $famime = 'file-alt
';
12012 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
12013 $mime = 'text/plain
';
12014 $imgmime = 'text.png
';
12015 $famime = 'file-alt
';
12016 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
12017 $mime = 'text/plain
';
12018 $imgmime = 'text.png
';
12020 $famime = 'file-alt
';
12021 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
12022 $mime = 'text/plain
';
12023 $imgmime = 'text.png
';
12025 $famime = 'file-alt
';
12026 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
12027 $mime = 'text/css
';
12028 $imgmime = 'css.png
';
12030 $famime = 'file-alt
';
12031 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
12032 $mime = 'text/plain
';
12033 $imgmime = 'text.png
';
12035 $famime = 'file-alt
';
12036 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
12037 $mime = 'text/plain
';
12038 $imgmime = 'text.png
';
12039 $famime = 'file-alt
';
12040 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
12041 $mime = 'text/html
';
12042 $imgmime = 'html.png
';
12044 $famime = 'file-alt
';
12045 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
12046 $mime = 'text/xml
';
12047 $imgmime = 'other.png
';
12049 $famime = 'file-alt
';
12050 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
12051 $mime = 'text/xml
';
12052 $imgmime = 'other.png
';
12054 $famime = 'file-alt
';
12055 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
12056 $mime = 'text/plain
';
12057 $imgmime = 'text.png
';
12059 $famime = 'file-code
';
12060 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
12061 $mime = 'text/plain
';
12062 $imgmime = 'text.png
';
12064 $famime = 'file-code
';
12065 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
12066 $mime = 'text/plain
';
12067 $imgmime = 'text.png
';
12069 $famime = 'file-code
';
12070 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
12071 $mime = 'text/plain
';
12072 $imgmime = 'text.png
';
12074 $famime = 'file-code
';
12075 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
12076 $mime = 'text/plain
';
12077 $imgmime = 'text.png
';
12079 $famime = 'file-code
';
12080 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
12081 $mime = 'text/plain
';
12082 $imgmime = 'text.png
';
12084 $famime = 'file-code
';
12085 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
12086 $mime = 'text/plain
';
12087 $imgmime = 'php.png
';
12089 $famime = 'file-code
';
12090 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
12091 $mime = 'text/plain
';
12092 $imgmime = 'php.png
';
12094 $famime = 'file-code
';
12095 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
12096 $mime = 'text/plain
';
12097 $imgmime = 'pl.png
';
12099 $famime = 'file-code
';
12100 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
12101 $mime = 'text/plain
';
12102 $imgmime = 'text.png
';
12104 $famime = 'file-code
';
12105 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
12106 $mime = 'text/x-javascript
';
12107 $imgmime = 'jscript.png
';
12109 $famime = 'file-code
';
12110 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
12111 $mime = 'application/vnd.oasis.opendocument.presentation
';
12112 $imgmime = 'ooffice.png
';
12113 $famime = 'file-powerpoint
';
12114 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
12115 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
12116 $imgmime = 'ooffice.png
';
12117 $famime = 'file-excel
';
12118 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
12119 $mime = 'application/vnd.oasis.opendocument.text
';
12120 $imgmime = 'ooffice.png
';
12121 $famime = 'file-word
';
12122 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
12123 $mime = 'application/msaccess
';
12124 $imgmime = 'mdb.png
';
12126 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
12127 $mime = 'application/msword
';
12128 $imgmime = 'doc.png
';
12129 $famime = 'file-word
';
12130 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
12131 $mime = 'application/msword
';
12132 $imgmime = 'doc.png
';
12133 $famime = 'file-word
';
12134 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
12135 $mime = 'application/vnd.ms-excel
';
12136 $imgmime = 'xls.png
';
12137 $famime = 'file-excel
';
12138 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
12139 $mime = 'application/vnd.ms-excel
';
12140 $imgmime = 'xls.png
';
12141 $famime = 'file-excel
';
12142 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
12143 $mime = 'application/vnd.ms-excel
';
12144 $imgmime = 'xls.png
';
12145 $famime = 'file-excel
';
12146 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
12147 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
12148 $imgmime = 'xls.png
';
12149 $famime = 'file-excel
';
12150 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
12151 $mime = 'application/vnd.ms-powerpoint
';
12152 $imgmime = 'ppt.png
';
12153 $famime = 'file-powerpoint
';
12154 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
12155 $mime = 'application/x-mspowerpoint
';
12156 $imgmime = 'ppt.png
';
12157 $famime = 'file-powerpoint
';
12158 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
12159 $mime = 'application/pdf
';
12160 $imgmime = 'pdf.png
';
12161 $famime = 'file-pdf
';
12162 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
12163 $mime = 'text/x-bat
';
12164 $imgmime = 'script.png
';
12166 $famime = 'file-code
';
12167 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
12168 $mime = 'text/x-sh
';
12169 $imgmime = 'script.png
';
12171 $famime = 'file-code
';
12172 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
12173 $mime = 'text/x-ksh
';
12174 $imgmime = 'script.png
';
12176 $famime = 'file-code
';
12177 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
12178 $mime = 'text/x-bash
';
12179 $imgmime = 'script.png
';
12181 $famime = 'file-code
';
12182 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
12183 $mime = 'image/x-icon
';
12184 $imgmime = 'image.png
';
12185 $famime = 'file-image
';
12186 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
12187 $mime = 'image/jpeg
';
12188 $imgmime = 'image.png
';
12189 $famime = 'file-image
';
12190 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
12191 $mime = 'image/png
';
12192 $imgmime = 'image.png
';
12193 $famime = 'file-image
';
12194 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
12195 $mime = 'image/gif
';
12196 $imgmime = 'image.png
';
12197 $famime = 'file-image
';
12198 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
12199 $mime = 'image/bmp
';
12200 $imgmime = 'image.png
';
12201 $famime = 'file-image
';
12202 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
12203 $mime = 'image/tiff
';
12204 $imgmime = 'image.png
';
12205 $famime = 'file-image
';
12206 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
12207 $mime = 'image/svg+xml
';
12208 $imgmime = 'image.png
';
12209 $famime = 'file-image
';
12210 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
12211 $mime = 'image/webp
';
12212 $imgmime = 'image.png
';
12213 $famime = 'file-image
';
12214 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
12215 $mime = 'text/calendar
';
12216 $imgmime = 'other.png
';
12217 $famime = 'file-alt
';
12218 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
12219 $mime = 'text/calendar
';
12220 $imgmime = 'other.png
';
12221 $famime = 'file-alt
';
12222 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
12223 $mime = 'application/x-bittorrent
';
12224 $imgmime = 'other.png
';
12225 $famime = 'file-o
';
12226 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
12228 $imgmime = 'audio.png
';
12229 $famime = 'file-audio
';
12230 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
12231 $mime = 'video/mp4
';
12232 $imgmime = 'video.png
';
12233 $famime = 'file-video
';
12234 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
12235 $mime = 'video/ogg
';
12236 $imgmime = 'video.png
';
12237 $famime = 'file-video
';
12238 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
12239 $mime = 'video/webm
';
12240 $imgmime = 'video.png
';
12241 $famime = 'file-video
';
12242 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
12243 $mime = 'video/x-msvideo
';
12244 $imgmime = 'video.png
';
12245 $famime = 'file-video
';
12246 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
12247 $mime = 'video/divx
';
12248 $imgmime = 'video.png
';
12249 $famime = 'file-video
';
12250 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
12251 $mime = 'video/xvid
';
12252 $imgmime = 'video.png
';
12253 $famime = 'file-video
';
12254 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
12256 $imgmime = 'video.png
';
12257 $famime = 'file-video
';
12258 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
12259 // application/xxx where zzz is zip, ...
12261 $imgmime = 'archive.png
';
12262 $famime = 'file-archive
';
12263 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
12264 $mime = 'application/octet-stream
';
12265 $imgmime = 'other.png
';
12266 $famime = 'file-o
';
12267 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
12269 $imgmime = 'library.png
';
12270 $famime = 'file-o
';
12271 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
12273 $imgmime = 'error.png
';
12274 $famime = 'file-alt
';
12277 // Return mimetype string
12278 switch ((int) $mode) {
12280 $tmp = explode('/
', $mime);
12281 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
12303function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = 'rowid
')
12307 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
12309 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
12311 if (is_null($dictvalues)) {
12312 $dictvalues = array();
12314 $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
12315 if ($checkentity) {
12316 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
12319 $resql = $db->query($sql);
12321 while ($obj = $db->fetch_object($resql)) {
12322 $dictvalues[$obj->$rowidfield] = $obj;
12328 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
12331 if (!empty($dictvalues[
$id])) {
12333 $tmp = $dictvalues[
$id];
12334 return (property_exists($tmp, $field) ? $tmp->$field :
'');
12349 $stringcolor = str_replace(
'#',
'', $stringcolor);
12351 if (!empty($stringcolor)) {
12353 $tmp = explode(
',', $stringcolor);
12354 if (count($tmp) > 1) {
12359 $hexr = $stringcolor[0].$stringcolor[1];
12360 $hexg = $stringcolor[2].$stringcolor[3];
12361 $hexb = $stringcolor[4].$stringcolor[5];
12362 $r = hexdec($hexr);
12363 $g = hexdec($hexg);
12364 $b = hexdec($hexb);
12366 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
12367 if ($bright > 0.6) {
12388 if (empty($menuentry[
'enabled'])) {
12391 if ($type_user && $menuentry[
'module']) {
12392 $tmploops = explode(
'|', $menuentry[
'module']);
12394 foreach ($tmploops as $tmploop) {
12395 if (in_array($tmploop, $listofmodulesforexternal)) {
12404 if (!$menuentry[
'perms'] && $type_user) {
12410 if (!$menuentry[
'perms']) {
12425 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
12426 return (
int) $result;
12440function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
12442 $csstouse =
'badge';
12443 $csstouse .= (!empty($mode) ?
' badge-'.$mode :
'');
12444 $csstouse .= (!empty($type) ?
' badge-'.$type :
'');
12445 $csstouse .= (empty($params[
'css']) ?
'' :
' '.$params[
'css']);
12448 'class' => $csstouse
12451 if (empty($html)) {
12455 if (!empty($url)) {
12456 $attr[
'href'] = $url;
12459 if ($mode ===
'dot') {
12460 $attr[
'class'] .=
' classfortooltip';
12461 $attr[
'title'] = $html;
12462 $attr[
'aria-label'] = $label;
12467 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12468 foreach ($params[
'attr'] as $key => $value) {
12469 if ($key ==
'class') {
12470 $attr[
'class'] .=
' '.$value;
12471 } elseif ($key ==
'classOverride') {
12472 $attr[
'class'] = $value;
12474 $attr[$key] = $value;
12482 $attr = array_map(
'dol_escape_htmltag', $attr);
12484 $TCompiledAttr = array();
12485 foreach ($attr as $key => $value) {
12486 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12489 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
12491 $tag = !empty($url) ?
'a' :
'span';
12493 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
12509function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
12514 $dolGetBadgeParams = array();
12516 if (!empty($params[
'badgeParams'])) {
12517 $dolGetBadgeParams = $params[
'badgeParams'];
12521 if ($displayMode == 0) {
12522 $return = !empty($html) ? $html : (empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
12523 } elseif ($displayMode == 1) {
12524 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12528 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
12529 $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>' :
'');
12532 if (!empty(
$conf->dol_optimize_smallscreen)) {
12533 if ($displayMode == 0) {
12535 } elseif ($displayMode == 4) {
12537 } elseif ($displayMode == 6) {
12543 $statusImg = array(
12544 'status0' =>
'statut0',
12545 'status1' =>
'statut1',
12546 'status2' =>
'statut2',
12547 'status3' =>
'statut3',
12548 'status4' =>
'statut4',
12549 'status5' =>
'statut5',
12550 'status6' =>
'statut6',
12551 'status7' =>
'statut7',
12552 'status8' =>
'statut8',
12553 'status9' =>
'statut9'
12556 if (!empty($statusImg[$statusType])) {
12557 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
12559 $htmlImg =
img_picto($statusLabel, $statusType);
12562 if ($displayMode === 2) {
12563 $return = $htmlImg.
' '.$htmlLabelShort;
12564 } elseif ($displayMode === 3) {
12565 $return = $htmlImg;
12566 } elseif ($displayMode === 4) {
12567 $return = $htmlImg.
' '.$htmlLabel;
12568 } elseif ($displayMode === 5) {
12569 $return = $htmlLabelShort.
' '.$htmlImg;
12571 $return = $htmlLabel.
' '.$htmlImg;
12575 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12577 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
12578 if (empty($dolGetBadgeParams[
'attr'][
'title'])) {
12579 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
12581 $dolGetBadgeParams[
'attr'][
'class'] .=
' classfortooltip';
12583 $dolGetBadgeParams[
'attr'][
'title'] =
dol_htmlentitiesbr($dolGetBadgeParams[
'attr'][
'title'], 1);
12586 if ($displayMode == 3) {
12587 $return =
dolGetBadge((empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
12588 } elseif ($displayMode === 5) {
12589 $return =
dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
12591 $return =
dolGetBadge((empty(
$conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
12637function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'',
$id =
'', $userRight = 1, $params = array())
12639 global $hookmanager, $action,
$object, $langs;
12642 if (is_array($url)) {
12644 foreach ($url as $key => $subbutton) {
12645 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
12652 if (array_key_exists(
'areDropdownButtons', $params) && $params[
"areDropdownButtons"] ===
false) {
12653 foreach ($url as $button) {
12654 if (!empty($button[
'lang'])) {
12655 $langs->load($button[
'lang']);
12657 $label = $langs->trans($button[
'label']);
12658 $text = $button[
'text'] ??
'';
12659 $actionType = $button[
'actionType'] ??
'';
12660 $tmpUrl = DOL_URL_ROOT.$button[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12661 $id = $button[
'id'] ??
'';
12662 $userRight = $button[
'perm'] ?? 1;
12663 $button[
'params'] = $button[
'params'] ?? [];
12665 $out .=
dolGetButtonAction($label, $text, $actionType, $tmpUrl,
$id, $userRight, $button[
'params']);
12670 if (count($url) > 1) {
12671 $out .=
'<div class="dropdown inline-block dropdown-holder">';
12672 $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>';
12673 $out .=
'<div class="dropdown-content">';
12674 foreach ($url as $subbutton) {
12675 if (!empty($subbutton[
'lang'])) {
12676 $langs->load($subbutton[
'lang']);
12679 if (!empty($subbutton[
'urlraw'])) {
12680 $tmpurl = $subbutton[
'urlraw'];
12682 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12686 $subbuttonparam = array();
12687 if (!empty($subbutton[
'attr'])) {
12688 $subbuttonparam[
'attr'] = $subbutton[
'attr'];
12690 $subbuttonparam[
'isDropDown'] = (empty($params[
'isDropDown']) ? ($subbutton[
'isDropDown'] ??
false) : $params[
'isDropDown']);
12692 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl, $subbutton[
'id'] ??
'', $subbutton[
'perm'], $subbuttonparam);
12697 foreach ($url as $subbutton) {
12698 if (!empty($subbutton[
'lang'])) {
12699 $langs->load($subbutton[
'lang']);
12702 if (!empty($subbutton[
'urlraw'])) {
12703 $tmpurl = $subbutton[
'urlraw'];
12705 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12709 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], $params);
12718 if (!empty($params[
'isDropdown']) || !empty($params[
'isDropDown'])) {
12719 $class =
"dropdown-item";
12721 $class =
'butAction';
12722 if ($actionType ==
'danger' || $actionType ==
'delete') {
12723 $class =
'butActionDelete';
12724 if (!empty($url) && strpos($url,
'token=') ===
false) {
12725 $url .=
'&token='.newToken();
12731 'href' => empty($url) ?
'' : $url,
12735 if (empty($text)) {
12737 $attr[
'title'] =
'';
12739 $attr[
'title'] = $label;
12740 $attr[
'aria-label'] = $label;
12743 if (empty($userRight)) {
12744 $attr[
'class'] =
'butActionRefused';
12745 $attr[
'href'] =
'';
12746 $attr[
'title'] = (($label && $text && $label != $text) ? $label :
'');
12747 $attr[
'title'] = ($attr[
'title'] ? $attr[
'title'].
'<br>' :
'').$langs->trans(
'NotEnoughPermissions');
12755 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12756 foreach ($params[
'attr'] as $key => $value) {
12757 if ($key ==
'class') {
12758 $attr[
'class'] .=
' '.$value;
12759 } elseif ($key ==
'classOverride') {
12760 $attr[
'class'] = $value;
12762 $attr[$key] = $value;
12768 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12769 $attr[
'class'] .=
' classfortooltip';
12773 if ($userRight && !empty($params[
'confirm'])) {
12774 if (!is_array($params[
'confirm'])) {
12775 $params[
'confirm'] = array();
12778 if (empty($params[
'confirm'][
'url'])) {
12779 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
12783 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
12784 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
12785 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
12786 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
12787 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
12788 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
12789 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
12791 $attr[
'class'] .=
' butActionConfirm';
12794 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12795 unset($attr[
'href']);
12799 $attr = array_map(
'dol_escape_htmltag', $attr);
12801 $TCompiledAttr = array();
12802 foreach ($attr as $key => $value) {
12803 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
12806 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
12808 $tag = !empty($attr[
'href']) ?
'a' :
'span';
12811 $parameters = array(
12812 'TCompiledAttr' => $TCompiledAttr,
12813 'compiledAttributes' => $compiledAttributes,
12818 'actionType' => $actionType,
12821 'userRight' => $userRight,
12822 'params' => $params
12825 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters,
$object, $action);
12826 if ($reshook < 0) {
12830 if (empty($reshook)) {
12832 return '<' . $tag .
' ' . $compiledAttributes .
'><span class="textbutton">' . $text .
'</span></' . $tag .
'>';
12834 return '<' . $tag .
' ' . $compiledAttributes .
'><span class="textbutton">' .
dol_escape_htmltag($text) .
'</span></' . $tag .
'>';
12837 return $hookmanager->resPrint;
12856 $parsedUrl = parse_url($url);
12857 if ((isset($parsedUrl[
'scheme']) && in_array($parsedUrl[
'scheme'], [
'javascript',
'mailto',
'tel'])) || strpos($url,
'#') === 0) {
12861 if (!empty($parsedUrl[
'query'])) {
12863 parse_str($parsedUrl[
'query'], $urlQuery);
12864 if (!isset($urlQuery[
'backtopage']) && isset($params[
'backtopage'])) {
12865 $url .=
'&backtopage='.urlencode($params[
'backtopage']);
12869 if (!isset($parsedUrl[
'scheme']) && $addDolUrlRoot) {
12870 $url = DOL_URL_ROOT.$url;
12885 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
12897 if (!empty($fieldValidationErrorMsg)) {
12898 $out .=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
12899 $out .=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
12918function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'',
$id =
'', $status = 1, $params = array())
12920 global $langs,
$conf, $user;
12923 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
12927 $class =
'btnTitle';
12928 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
12929 $class .=
' btnTitlePlus';
12931 $useclassfortooltip = 1;
12933 if (!empty($params[
'morecss'])) {
12934 $class .=
' '.$params[
'morecss'];
12939 'href' => empty($url) ?
'' : $url
12942 if (!empty($helpText)) {
12944 } elseif ($label) {
12945 $attr[
'title'] = $label;
12946 $useclassfortooltip = 0;
12949 if ($status == 2) {
12950 $attr[
'class'] .=
' btnTitleSelected';
12951 } elseif ($status <= 0) {
12952 $attr[
'class'] .=
' refused';
12954 $attr[
'href'] =
'';
12956 if ($status == -1) {
12957 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
12958 } elseif ($status == 0) {
12959 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
12963 if (!empty($attr[
'title']) && $useclassfortooltip) {
12964 $attr[
'class'] .=
' classfortooltip';
12972 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12973 foreach ($params[
'attr'] as $key => $value) {
12974 if ($key ==
'class') {
12975 $attr[
'class'] .=
' '.$value;
12976 } elseif ($key ==
'classOverride') {
12977 $attr[
'class'] = $value;
12979 $attr[$key] = $value;
12984 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12985 unset($attr[
'href']);
12990 $TCompiledAttr = array();
12991 foreach ($attr as $key => $value) {
12995 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
12997 $tag = (empty($attr[
'href']) ?
'span' :
'a');
12999 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
13000 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
13001 if (!empty($params[
'forcenohideoftext'])) {
13002 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
13004 $button .=
'</'.$tag.
'>';
13020 global
$conf, $db, $hookmanager;
13026 $classfile = $classname = $classpath = $subdir = $dir_output = $dir_temp = $parent_element =
'';
13029 $module = $elementType;
13030 $element = $elementType;
13031 $subelement = $elementType;
13032 $table_element = $elementType;
13035 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $elementType, $regs)) {
13036 $element = $subelement = $regs[1];
13037 $module = $regs[2];
13042 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
13043 $module = $element = $regs[1];
13044 $subelement = $regs[2];
13048 if (substr($elementType, -3) ==
'det') {
13049 $module = preg_replace(
'/det$/',
'', $element);
13050 $subelement = preg_replace(
'/det$/',
'', $subelement);
13051 $classpath = $module.
'/class';
13052 $classfile = $module;
13053 $classname = preg_replace(
'/det$/',
'Line', $element);
13054 if (in_array($module, array(
'expedition',
'propale',
'facture',
'contrat',
'fichinter',
'commandefournisseur'))) {
13055 $classname = preg_replace(
'/det$/',
'Ligne', $element);
13059 if ($elementType ==
"action" || $elementType ==
"actioncomm") {
13060 $classpath =
'comm/action/class';
13061 $subelement =
'Actioncomm';
13062 $module =
'agenda';
13063 $table_element =
'actioncomm';
13064 } elseif ($elementType ==
'cronjob') {
13065 $classpath =
'cron/class';
13067 $table_element =
'cron';
13068 } elseif ($elementType ==
'adherent_type') {
13069 $classpath =
'adherents/class';
13070 $classfile =
'adherent_type';
13071 $module =
'adherent';
13072 $subelement =
'adherent_type';
13073 $classname =
'AdherentType';
13074 $table_element =
'adherent_type';
13075 } elseif ($elementType ==
'bank_account') {
13076 $classpath =
'compta/bank/class';
13078 $classfile =
'account';
13079 $classname =
'Account';
13080 } elseif ($elementType ==
'category') {
13081 $classpath =
'categories/class';
13082 $module =
'categorie';
13083 $subelement =
'categorie';
13084 $table_element =
'categorie';
13085 } elseif ($elementType ==
'contact') {
13086 $classpath =
'contact/class';
13087 $classfile =
'contact';
13088 $module =
'societe';
13089 $subelement =
'contact';
13090 $table_element =
'socpeople';
13091 } elseif ($elementType ==
'inventory') {
13092 $module =
'product';
13093 $classpath =
'product/inventory/class';
13094 } elseif ($elementType ==
'inventoryline') {
13095 $module =
'product';
13096 $classpath =
'product/inventory/class';
13097 $table_element =
'inventorydet';
13098 $parent_element =
'inventory';
13099 } elseif ($elementType ==
'stock' || $elementType ==
'entrepot') {
13101 $classpath =
'product/stock/class';
13102 $classfile =
'entrepot';
13103 $classname =
'Entrepot';
13104 $table_element =
'entrepot';
13105 } elseif ($elementType ==
'project') {
13106 $classpath =
'projet/class';
13107 $module =
'projet';
13108 $table_element =
'projet';
13109 } elseif ($elementType ==
'project_task') {
13110 $classpath =
'projet/class';
13111 $module =
'projet';
13112 $subelement =
'task';
13113 $table_element =
'projet_task';
13114 } elseif ($elementType ==
'facture' || $elementType ==
'invoice') {
13115 $classpath =
'compta/facture/class';
13116 $module =
'facture';
13117 $subelement =
'facture';
13118 $table_element =
'facture';
13119 } elseif ($elementType ==
'facturedet') {
13120 $classpath =
'compta/facture/class';
13121 $classfile =
'facture';
13122 $classname =
'FactureLigne';
13123 $module =
'facture';
13124 $table_element =
'facturedet';
13125 $parent_element =
'facture';
13126 } elseif ($elementType ==
'facturerec') {
13127 $classpath =
'compta/facture/class';
13128 $module =
'facture';
13129 $classname =
'FactureRec';
13130 } elseif ($elementType ==
'commande' || $elementType ==
'order') {
13131 $classpath =
'commande/class';
13132 $module =
'commande';
13133 $subelement =
'commande';
13134 $table_element =
'commande';
13135 } elseif ($elementType ==
'commandedet') {
13136 $classpath =
'commande/class';
13137 $classfile =
'commande';
13138 $classname =
'OrderLine';
13139 $module =
'commande';
13140 $table_element =
'commandedet';
13141 $parent_element =
'commande';
13142 } elseif ($elementType ==
'propal') {
13143 $classpath =
'comm/propal/class';
13144 $table_element =
'propal';
13145 } elseif ($elementType ==
'propaldet') {
13146 $classpath =
'comm/propal/class';
13147 $classfile =
'propal';
13148 $subelement =
'propaleligne';
13149 $module =
'propal';
13150 $table_element =
'propaldet';
13151 $parent_element =
'propal';
13152 } elseif ($elementType ==
'shipping') {
13153 $classpath =
'expedition/class';
13154 $classfile =
'expedition';
13155 $classname =
'Expedition';
13156 $module =
'expedition';
13157 $table_element =
'expedition';
13158 } elseif ($elementType ==
'expeditiondet' || $elementType ==
'shippingdet') {
13159 $classpath =
'expedition/class';
13160 $classfile =
'expedition';
13161 $classname =
'ExpeditionLigne';
13162 $module =
'expedition';
13163 $table_element =
'expeditiondet';
13164 $parent_element =
'expedition';
13165 } elseif ($elementType ==
'delivery_note') {
13166 $classpath =
'delivery/class';
13167 $subelement =
'delivery';
13168 $module =
'expedition';
13169 } elseif ($elementType ==
'delivery') {
13170 $classpath =
'delivery/class';
13171 $subelement =
'delivery';
13172 $module =
'expedition';
13173 } elseif ($elementType ==
'deliverydet') {
13175 } elseif ($elementType ==
'supplier_proposal') {
13176 $classpath =
'supplier_proposal/class';
13177 $module =
'supplier_proposal';
13178 $element =
'supplierproposal';
13179 $classfile =
'supplier_proposal';
13180 $subelement =
'supplierproposal';
13181 } elseif ($elementType ==
'supplier_proposaldet') {
13182 $classpath =
'supplier_proposal/class';
13183 $module =
'supplier_proposal';
13184 $classfile =
'supplier_proposal';
13185 $table_element =
'supplier_proposaldet';
13186 $parent_element =
'supplier_proposal';
13187 } elseif ($elementType ==
'contract') {
13188 $classpath =
'contrat/class';
13189 $module =
'contrat';
13190 $subelement =
'contrat';
13191 $table_element =
'contract';
13192 } elseif ($elementType ==
'contratdet') {
13193 $classpath =
'contrat/class';
13194 $module =
'contrat';
13195 $table_element =
'contratdet';
13196 $parent_element =
'contrat';
13197 } elseif ($elementType ==
'mailing') {
13198 $classpath =
'comm/mailing/class';
13199 $module =
'mailing';
13200 $classfile =
'mailing';
13201 $classname =
'Mailing';
13203 } elseif ($elementType ==
'member' || $elementType ==
'adherent') {
13204 $classpath =
'adherents/class';
13205 $module =
'adherent';
13206 $subelement =
'adherent';
13207 $table_element =
'adherent';
13208 } elseif ($elementType ==
'usergroup') {
13209 $classpath =
'user/class';
13211 } elseif ($elementType ==
'mo') {
13212 $classpath =
'mrp/class';
13217 $table_element =
'mrp_mo';
13218 } elseif ($elementType ==
'mrp_production') {
13219 $classpath =
'mrp/class';
13221 $classname =
'MoLine';
13224 $table_element =
'mrp_production';
13225 $parent_element =
'mo';
13226 } elseif ($elementType ==
'cabinetmed_cons') {
13227 $classpath =
'cabinetmed/class';
13228 $module =
'cabinetmed';
13229 $subelement =
'cabinetmedcons';
13230 $table_element =
'cabinetmedcons';
13231 } elseif ($elementType ==
'fichinter') {
13232 $classpath =
'fichinter/class';
13233 $module =
'ficheinter';
13234 $subelement =
'fichinter';
13235 $table_element =
'fichinter';
13236 } elseif ($elementType ==
'dolresource' || $elementType ==
'resource') {
13237 $classpath =
'resource/class';
13238 $module =
'resource';
13239 $subelement =
'dolresource';
13240 $table_element =
'resource';
13241 } elseif ($elementType ==
'opensurvey_sondage') {
13242 $classpath =
'opensurvey/class';
13243 $module =
'opensurvey';
13244 $subelement =
'opensurveysondage';
13245 } elseif ($elementType ==
'order_supplier' || $elementType ==
'commande_fournisseur') {
13246 $classpath =
'fourn/class';
13247 $module =
'fournisseur';
13248 $classfile =
'fournisseur.commande';
13249 $element =
'order_supplier';
13251 $classname =
'CommandeFournisseur';
13252 $table_element =
'commande_fournisseur';
13253 } elseif ($elementType ==
'commande_fournisseurdet') {
13254 $classpath =
'fourn/class';
13255 $module =
'fournisseur';
13256 $classfile =
'fournisseur.commande';
13257 $element =
'commande_fournisseurdet';
13259 $classname =
'CommandeFournisseurLigne';
13260 $table_element =
'commande_fournisseurdet';
13261 $parent_element =
'commande_fournisseur';
13262 } elseif ($elementType ==
'invoice_supplier') {
13263 $classpath =
'fourn/class';
13264 $module =
'fournisseur';
13265 $classfile =
'fournisseur.facture';
13266 $element =
'invoice_supplier';
13268 $classname =
'FactureFournisseur';
13269 $table_element =
'facture_fourn';
13270 } elseif ($elementType ==
'facture_fourn_det') {
13271 $classpath =
'fourn/class';
13272 $module =
'fournisseur';
13273 $classfile =
'fournisseur.facture';
13274 $element =
'facture_fourn_det';
13276 $classname =
'SupplierInvoiceLine';
13277 $table_element =
'facture_fourn_det';
13278 $parent_element =
'invoice_supplier';
13279 } elseif ($elementType ==
"service") {
13280 $classpath =
'product/class';
13281 $subelement =
'product';
13282 $table_element =
'product';
13283 } elseif ($elementType ==
'salary') {
13284 $classpath =
'salaries/class';
13285 $module =
'salaries';
13286 } elseif ($elementType ==
'payment_salary') {
13287 $classpath =
'salaries/class';
13288 $classfile =
'paymentsalary';
13289 $classname =
'PaymentSalary';
13290 $module =
'salaries';
13291 } elseif ($elementType ==
'productlot') {
13292 $module =
'productbatch';
13293 $classpath =
'product/stock/class';
13294 $classfile =
'productlot';
13295 $classname =
'Productlot';
13296 $element =
'productlot';
13298 $table_element =
'product_lot';
13299 } elseif ($elementType ==
'societeaccount') {
13300 $classpath =
'societe/class';
13301 $classfile =
'societeaccount';
13302 $classname =
'SocieteAccount';
13303 $module =
'societe';
13304 } elseif ($elementType ==
'websitepage') {
13305 $classpath =
'website/class';
13306 $classfile =
'websitepage';
13307 $classname =
'Websitepage';
13308 $module =
'website';
13309 $subelement =
'websitepage';
13310 $table_element =
'website_page';
13311 } elseif ($elementType ==
'fiscalyear') {
13312 $classpath =
'core/class';
13313 $module =
'accounting';
13314 $subelement =
'fiscalyear';
13315 } elseif ($elementType ==
'chargesociales') {
13316 $classpath =
'compta/sociales/class';
13318 $table_element =
'chargesociales';
13319 } elseif ($elementType ==
'tva') {
13320 $classpath =
'compta/tva/class';
13323 $table_element =
'tva';
13324 } elseif ($elementType ==
'emailsenderprofile') {
13326 $classpath =
'core/class';
13327 $classfile =
'emailsenderprofile';
13328 $classname =
'EmailSenderProfile';
13329 $table_element =
'c_email_senderprofile';
13331 } elseif ($elementType ==
'conferenceorboothattendee') {
13332 $classpath =
'eventorganization/class';
13333 $classfile =
'conferenceorboothattendee';
13334 $classname =
'ConferenceOrBoothAttendee';
13335 $module =
'eventorganization';
13336 } elseif ($elementType ==
'conferenceorbooth') {
13337 $classpath =
'eventorganization/class';
13338 $classfile =
'conferenceorbooth';
13339 $classname =
'ConferenceOrBooth';
13340 $module =
'eventorganization';
13341 } elseif ($elementType ==
'ccountry') {
13343 $classpath =
'core/class';
13344 $classfile =
'ccountry';
13345 $classname =
'Ccountry';
13346 $table_element =
'c_country';
13348 } elseif ($elementType ==
'ecmfiles') {
13350 $classpath =
'ecm/class';
13351 $classfile =
'ecmfiles';
13352 $classname =
'Ecmfiles';
13353 $table_element =
'ecmfiles';
13355 } elseif ($elementType ==
'knowledgerecord') {
13357 $classpath =
'knowledgemanagement/class';
13358 $classfile =
'knowledgerecord';
13359 $classname =
'KnowledgeRecord';
13360 $table_element =
'knowledgemanagement_knowledgerecord';
13364 if (empty($classfile)) {
13365 $classfile = strtolower($subelement);
13367 if (empty($classname)) {
13368 $classname = ucfirst($subelement);
13370 if (empty($classpath)) {
13371 $classpath = $module.
'/class';
13377 if ($module && isset(
$conf->$module)) {
13378 if (!empty(
$conf->$module->multidir_output[
$conf->entity])) {
13379 $dir_output =
$conf->$module->multidir_output[
$conf->entity];
13380 } elseif (!empty(
$conf->$module->output[
$conf->entity])) {
13381 $dir_output =
$conf->$module->output[
$conf->entity];
13382 } elseif (!empty(
$conf->$module->dir_output)) {
13383 $dir_output =
$conf->$module->dir_output;
13385 if (!empty(
$conf->$module->multidir_temp[
$conf->entity])) {
13386 $dir_temp =
$conf->$module->multidir_temp[
$conf->entity];
13387 } elseif (!empty(
$conf->$module->temp[
$conf->entity])) {
13388 $dir_temp =
$conf->$module->temp[
$conf->entity];
13389 } elseif (!empty(
$conf->$module->dir_temp)) {
13390 $dir_temp =
$conf->$module->dir_temp;
13395 if ($element ==
'order_supplier') {
13396 $dir_output =
$conf->fournisseur->commande->dir_output;
13397 $dir_temp =
$conf->fournisseur->commande->dir_temp;
13398 } elseif ($element ==
'invoice_supplier') {
13399 $dir_output =
$conf->fournisseur->facture->dir_output;
13400 $dir_temp =
$conf->fournisseur->facture->dir_temp;
13402 $dir_output .= $subdir;
13403 $dir_temp .= $subdir;
13405 $elementProperties = array(
13406 'module' => $module,
13407 'element' => $element,
13408 'table_element' => $table_element,
13409 'subelement' => $subelement,
13410 'classpath' => $classpath,
13411 'classfile' => $classfile,
13412 'classname' => $classname,
13413 'dir_output' => $dir_output,
13414 'dir_temp' => $dir_temp,
13415 'parent_element' => $parent_element,
13420 if (!is_object($hookmanager)) {
13421 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
13424 $hookmanager->initHooks(array(
'elementproperties'));
13428 $parameters = array(
13429 'elementType' => $elementType,
13430 'elementProperties' => $elementProperties
13433 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
13436 $elementProperties = $hookmanager->resArray;
13437 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
13438 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
13442 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
13443 unset($hookmanager->contextarray[$key]);
13446 return $elementProperties;
13461function fetchObjectByElement($element_id, $element_type, $element_ref =
'', $useCache = 0, $maxCacheByType = 10)
13469 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
13474 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
13475 } elseif ($element_prop[
'module'] ==
'societeaccount') {
13476 $ismodenabled = isModEnabled(
'website') || isModEnabled(
'webportal');
13478 $ismodenabled = isModEnabled($element_prop[
'module']);
13483 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
13484 if ($useCache === 1
13485 && !empty(
$conf->cache[
'fetchObjectByElement'][$element_type])
13486 && !empty(
$conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13487 && is_object(
$conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13489 return $conf->cache[
'fetchObjectByElement'][$element_type][$element_id];
13492 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13494 if (class_exists($element_prop[
'classname'])) {
13495 $className = $element_prop[
'classname'];
13496 $objecttmp =
new $className($db);
13497 '@phan-var-force CommonObject $objecttmp';
13499 if ($element_id > 0 || !empty($element_ref)) {
13500 $ret = $objecttmp->fetch($element_id, $element_ref);
13502 if (empty($objecttmp->module)) {
13503 $objecttmp->module = $element_prop[
'module'];
13506 if ($useCache > 0) {
13507 if (!isset(
$conf->cache[
'fetchObjectByElement'][$element_type])) {
13508 $conf->cache[
'fetchObjectByElement'][$element_type] = [];
13512 if (! empty(
$conf->cache[
'fetchObjectByElement'][$element_type]) && is_array(
$conf->cache[
'fetchObjectByElement'][$element_type]) && count(
$conf->cache[
'fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
13513 array_shift(
$conf->cache[
'fetchObjectByElement'][$element_type]);
13516 $conf->cache[
'fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
13525 dol_syslog($element_prop[
'classname'].
' doesn\'t exists in /'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13541 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)) {
13557 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
13569 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
13581 if (empty(
$conf->cache[
'nonce'])) {
13585 return $conf->cache[
'nonce'];
13602function startSimpleTable($header, $link =
"", $arguments =
"", $emptyColumns = 0, $number = -1, $pictofulllist =
'')
13606 print
'<div class="div-table-responsive-no-min">';
13607 print
'<table class="noborder centpercent">';
13608 print
'<tr class="liste_titre">';
13610 print ($emptyColumns < 1) ?
'<th>' :
'<th colspan="'.($emptyColumns + 1).
'">';
13612 print
'<span class="valignmiddle">'.$langs->trans($header).
'</span>';
13614 if (!empty($link)) {
13615 if (!empty($arguments)) {
13616 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
13618 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
13622 if ($number > -1) {
13623 print
'<span class="badge marginleftonlyshort">'.$number.
'</span>';
13624 } elseif (!empty($link)) {
13625 print
'<span class="badge marginleftonlyshort">...</span>';
13628 if (!empty($link)) {
13634 if ($number < 0 && !empty($link)) {
13635 print
'<th class="right">';
13655 if ($addLineBreak) {
13671function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
13676 print
'<tr class="oddeven">';
13677 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
13682 if ($nbofloop === 0) {
13692 if ($num > $nbofloop) {
13693 $colspan = $tableColumnCount;
13695 $colspan = $tableColumnCount - 1;
13698 if ($extraRightColumn) {
13702 print
'<tr class="liste_total">';
13704 if ($nbofloop > 0 && $num > $nbofloop) {
13705 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
13707 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
13708 print
'<td class="right centpercent">'.price($total).
'</td>';
13711 if ($extraRightColumn) {
13728 if ($method == -1) {
13739 while (ob_get_level()) {
13744 if ($method == 0) {
13745 readfile($fullpath_original_file_osencoded);
13746 } elseif ($method == 1) {
13748 $handle = fopen($fullpath_original_file_osencoded,
"rb");
13749 while (!feof($handle)) {
13750 print fread($handle, 8192);
13753 } elseif ($method == 2) {
13755 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
13756 $handle2 = fopen(
"php://output",
"wb");
13757 stream_copy_to_stream($handle1, $handle2);
13778 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'">';
13779 if ($texttoshow ===
'none') {
13780 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13781 $result .=
'<span class="clipboardCPValueToPrint"></span>';
13782 } elseif ($texttoshow) {
13783 $result .=
'<'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13784 $result .=
'<span class="clipboardCPValueToPrint">'.dol_escape_htmltag($texttoshow, 1, 1).
'</span>';
13786 $result .=
'<'.$tag.
' class="clipboardCPValue">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'>';
13788 $result .=
'<span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft pictomodule" title="'.dolPrintHTML($langs->trans(
"ClickToCopyToClipboard")).
'"></span>';
13789 $result .=
img_picto(
'',
'tick',
'class="clipboardCPTick hidden paddingleft pictomodule"');
13790 $result .=
'<span class="clipboardCPText"></span>';
13791 $result .=
'</span>';
13805 $result = json_decode($stringtodecode);
13806 if ($result ===
null) {
13807 $result = unserialize($stringtodecode);
13834 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
13837 if (!preg_match(
'/^\(.*\)$/', $filter)) {
13838 $filter =
'(' . $filter .
')';
13841 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
13842 $firstandlastparenthesis = 0;
13844 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
13848 return 'Filter syntax error - '.$errorstr;
13853 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
13854 $t = str_ireplace(array(
'and',
'or',
' '),
'', $t);
13857 if (preg_match(
'/[^\(\)]/', $t)) {
13858 $tmperrorstr =
'Bad syntax of the search string';
13859 $errorstr =
'Bad syntax of the search string: '.$filter;
13863 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - ".$errorstr, LOG_WARNING);
13864 return 'Filter error - '.$tmperrorstr;
13868 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeSQLCriteriaCallback', $filter).($nopar ?
"" :
')');
13870 if (is_object($db)) {
13871 $ret = str_replace(
'__NOW__', $db->idate(
dol_now()), $ret);
13873 if (is_object($user)) {
13874 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
13889 $arrayofandtags = array();
13893 $parenthesislevel = 0;
13898 if ($parenthesislevel >= 1) {
13899 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
13904 $countparenthesis = 0;
13905 while ($i < $nbofchars) {
13908 if ($char ==
'(') {
13909 $countparenthesis++;
13910 } elseif ($char ==
')') {
13911 $countparenthesis--;
13914 if ($countparenthesis == 0) {
13915 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
13916 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
13917 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
13920 if (!preg_match(
'/^\(.*\)$/', $s)) {
13923 $arrayofandtags[] = $s;
13936 if (!preg_match(
'/^\(.*\)$/', $s)) {
13939 $arrayofandtags[] = $s;
13942 return $arrayofandtags;
13954function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
13958 $tmp = $sqlfilters;
13962 $parenthesislevel = 0;
13970 if ($char ==
'(') {
13971 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
13973 $parenthesislevel++;
13976 } elseif ($char ==
')') {
13977 $nbcharremaining = ($nb - $i - 1);
13978 if ($nbcharremaining >= $counter) {
13979 $parenthesislevel = min($parenthesislevel, $counter - 1);
13981 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
13982 $parenthesislevel = $counter;
13987 if ($counter < 0) {
13988 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13989 $parenthesislevel = 0;
13997 if ($counter > 0) {
13998 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13999 $parenthesislevel = 0;
14017 if (empty($matches[1])) {
14020 $tmp = explode(
':', $matches[1]);
14021 if (count($tmp) < 3) {
14041 if (empty($matches[1])) {
14044 $tmp = explode(
':', $matches[1], 3);
14045 if (count($tmp) < 3) {
14049 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
14051 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
14054 'NOTLIKE' =>
'NOT LIKE',
14055 'ISNOT' =>
'IS NOT',
14056 'NOTIN' =>
'NOT IN',
14060 if (array_key_exists($operator, $realOperator)) {
14061 $operator = $realOperator[$operator];
14064 $tmpescaped = $tmp[2];
14070 if ($operator ==
'IN' || $operator ==
'NOT IN') {
14072 $tmpescaped2 =
'(';
14074 $tmpelemarray = explode(
',', $tmpescaped);
14075 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
14077 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
14078 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
14080 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
14083 $tmpescaped2 .= implode(
',', $tmpelemarray);
14084 $tmpescaped2 .=
')';
14086 $tmpescaped = $tmpescaped2;
14087 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
14088 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
14089 $tmpescaped = $regbis[1];
14092 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
14093 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
14096 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
14098 if (strtoupper($tmpescaped) ==
'NULL') {
14099 $tmpescaped =
'NULL';
14100 } elseif (ctype_digit((
string) $tmpescaped)) {
14101 $tmpescaped = (int) $tmpescaped;
14103 $tmpescaped = (float) $tmpescaped;
14107 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
14124 $out =
'<!-- timeline icon -->'.
"\n";
14125 $iconClass =
'fa fa-comments';
14130 if ($histo[$key][
'percent'] == -1) {
14131 $colorClass =
'timeline-icon-not-applicble';
14132 $pictoTitle = $langs->trans(
'StatusNotApplicable');
14133 } elseif ($histo[$key][
'percent'] == 0) {
14134 $colorClass =
'timeline-icon-todo';
14135 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
14136 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
14137 $colorClass =
'timeline-icon-in-progress';
14138 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
14139 } elseif ($histo[$key][
'percent'] >= 100) {
14140 $colorClass =
'timeline-icon-done';
14141 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
14144 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
14145 $iconClass =
'fa fa-ticket';
14146 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
14147 $iconClass =
'fa fa-pencilxxx';
14148 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14149 $iconClass =
'fa fa-comments';
14150 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14151 $iconClass =
'fa fa-mask';
14153 if ($actionstatic->type_picto) {
14154 $img_picto =
img_picto(
'', $actionstatic->type_picto);
14156 if ($actionstatic->type_code ==
'AC_RDV') {
14157 $iconClass =
'fa fa-handshake';
14158 } elseif ($actionstatic->type_code ==
'AC_TEL') {
14159 $iconClass =
'fa fa-phone';
14160 } elseif ($actionstatic->type_code ==
'AC_FAX') {
14161 $iconClass =
'fa fa-fax';
14162 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
14163 $iconClass =
'fa fa-envelope';
14164 } elseif ($actionstatic->type_code ==
'AC_INT') {
14165 $iconClass =
'fa fa-shipping-fast';
14166 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
14167 $iconClass =
'fa fa-robot';
14168 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
14169 $iconClass =
'fa fa-robot';
14174 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
14188 $documents = array();
14190 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
14191 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
14192 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
14194 $sql .=
' ORDER BY ecm.position ASC';
14196 $resql = $db->query($sql);
14198 if ($db->num_rows($resql)) {
14199 while ($obj = $db->fetch_object($resql)) {
14200 $documents[$obj->id] = $obj;
14226function show_actions_messaging(
$conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
14228 global $user,
$conf;
14231 global $param, $massactionbutton;
14233 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
14236 if (!is_object($filterobj) && !is_object($objcon)) {
14241 '@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';
14246 $sortfield_list = explode(
',', $sortfield);
14247 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
14248 $sortfield_new_list = array();
14249 foreach ($sortfield_list as $sortfield_value) {
14250 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
14252 $sortfield_new = implode(
',', $sortfield_new_list);
14257 if (isModEnabled(
'agenda')) {
14259 if (is_object($objcon) && $objcon->id > 0) {
14260 $sql =
"SELECT DISTINCT a.id, a.label as label,";
14262 $sql =
"SELECT a.id, a.label as label,";
14264 $sql .=
" a.datep as dp,";
14265 $sql .=
" a.note as message,";
14266 $sql .=
" a.datep2 as dp2,";
14267 $sql .=
" a.percent as percent, 'action' as type,";
14268 $sql .=
" a.fk_element, a.elementtype,";
14269 $sql .=
" a.fk_contact,";
14270 $sql .=
" a.email_from as msg_from,";
14271 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
14272 $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";
14273 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14274 $sql .=
", sp.lastname, sp.firstname";
14275 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14276 $sql .=
", m.lastname, m.firstname";
14277 } elseif (is_object($filterobj) && in_array(get_class($filterobj), array(
'Commande',
'CommandeFournisseur',
'Product',
'Ticket',
'BOM',
'Contrat',
'Facture',
'FactureFournisseur'))) {
14280 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
14281 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
14282 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
14284 $force_filter_contact = $filterobj instanceof
User;
14286 if (is_object($objcon) && $objcon->id > 0) {
14287 $force_filter_contact =
true;
14288 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
14289 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
14292 if ((is_object($filterobj) && get_class($filterobj) ==
'Societe') || (is_object($filterobj) && get_class($filterobj) ==
'Contact')) {
14293 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
14294 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
14295 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
14296 $sql .=
" ON er.resource_type = 'dolresource'";
14297 $sql .=
" AND er.element_id = a.id";
14298 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
14299 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14300 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
14301 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14302 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
14303 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14304 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
14305 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14306 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
14307 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14308 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
14309 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14310 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
14311 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
14312 $sql .=
", ".MAIN_DB_PREFIX.
"facture as o";
14313 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
14314 $sql .=
", ".MAIN_DB_PREFIX.
"facture_fourn as o";
14317 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
14318 if (!$force_filter_contact) {
14319 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
14320 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
14321 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
14322 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
14323 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14324 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
14325 if ($filterobj->id) {
14326 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14328 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Commande') {
14329 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order'";
14330 if ($filterobj->id) {
14331 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14333 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14334 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
14335 if ($filterobj->id) {
14336 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14338 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14339 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
14340 if ($filterobj->id) {
14341 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14343 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14344 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
14345 if ($filterobj->id) {
14346 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14348 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14349 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
14350 if ($filterobj->id) {
14351 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14353 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14354 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
14355 if ($filterobj->id) {
14356 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14358 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contact' && $filterobj->id) {
14359 $sql .=
" AND a.fk_contact = sp.rowid";
14360 if ($filterobj->id) {
14361 $sql .=
" AND a.fk_contact = ".((int) $filterobj->id);
14363 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Facture') {
14364 $sql .=
" AND a.fk_element = o.rowid";
14365 if ($filterobj->id) {
14366 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice'";
14368 } elseif (is_object($filterobj) && get_class($filterobj) ==
'FactureFournisseur') {
14369 $sql .=
" AND a.fk_element = o.rowid";
14370 if ($filterobj->id) {
14371 $sql .=
" AND a.fk_element = ".((int) $filterobj->id).
" AND a.elementtype = 'invoice_supplier'";
14375 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
14379 if (!empty($actioncode) && $actioncode !=
'-1') {
14381 if ($actioncode ==
'AC_NON_AUTO') {
14382 $sql .=
" AND c.type != 'systemauto'";
14383 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14384 $sql .=
" AND c.type = 'systemauto'";
14386 if ($actioncode ==
'AC_OTH') {
14387 $sql .=
" AND c.type != 'systemauto'";
14388 } elseif ($actioncode ==
'AC_OTH_AUTO') {
14389 $sql .=
" AND c.type = 'systemauto'";
14393 if ($actioncode ==
'AC_NON_AUTO') {
14394 $sql .=
" AND c.type != 'systemauto'";
14395 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14396 $sql .=
" AND c.type = 'systemauto'";
14398 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
14402 if ($donetodo ==
'todo') {
14403 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
14404 } elseif ($donetodo ==
'done') {
14405 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
14407 if (is_array($filters) && $filters[
'search_agenda_label']) {
14408 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
14413 if (isModEnabled(
'mailing') && !empty($objcon->email)
14414 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
14415 $langs->load(
"mails");
14417 $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";
14418 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
14419 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
14420 $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";
14421 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14422 $sql2 .=
", '' as lastname, '' as firstname";
14423 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14424 $sql2 .=
", '' as lastname, '' as firstname";
14425 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14426 $sql2 .=
", '' as ref";
14427 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14428 $sql2 .=
", '' as ref";
14429 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14430 $sql2 .=
", '' as ref";
14432 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
14433 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
14434 $sql2 .=
" AND mc.statut = 1";
14435 $sql2 .=
" AND u.rowid = m.fk_user_valid";
14436 $sql2 .=
" AND mc.fk_mailing=m.rowid";
14439 if ($sql || $sql2) {
14440 if (!empty($sql) && !empty($sql2)) {
14441 $sql = $sql.
" UNION ".$sql2;
14442 } elseif (empty($sql) && !empty($sql2)) {
14451 $sql .= $db->order($sortfield_new, $sortorder);
14453 $sql .= $db->plimit($limit + 1, $offset);
14456 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
14457 $resql = $db->query($sql);
14460 $num = $db->num_rows($resql);
14462 $imaxinloop = ($limit ? min($num, $limit) : $num);
14463 while ($i < $imaxinloop) {
14464 $obj = $db->fetch_object($resql);
14466 if ($obj->type ==
'action') {
14468 $contactaction->id = $obj->id;
14469 $result = $contactaction->fetchResources();
14472 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
14478 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
14479 $tododone =
'todo';
14482 $histo[$numaction] = array(
14483 'type' => $obj->type,
14484 'tododone' => $tododone,
14486 'datestart' => $db->jdate($obj->dp),
14487 'dateend' => $db->jdate($obj->dp2),
14488 'note' => $obj->label,
14490 'percent' => $obj->percent,
14492 'userid' => $obj->user_id,
14493 'login' => $obj->user_login,
14494 'userfirstname' => $obj->user_firstname,
14495 'userlastname' => $obj->user_lastname,
14496 'userphoto' => $obj->user_photo,
14497 'msg_from' => $obj->msg_from,
14499 'contact_id' => $obj->fk_contact,
14500 'socpeopleassigned' => $contactaction->socpeopleassigned,
14501 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
14502 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
14503 'fk_element' => $obj->fk_element,
14504 'elementtype' => $obj->elementtype,
14506 'acode' => $obj->acode,
14507 'alabel' => $obj->alabel,
14508 'libelle' => $obj->alabel,
14509 'apicto' => $obj->apicto
14512 $histo[$numaction] = array(
14513 'type' => $obj->type,
14514 'tododone' =>
'done',
14516 'datestart' => $db->jdate($obj->dp),
14517 'dateend' => $db->jdate($obj->dp2),
14518 'note' => $obj->label,
14520 'percent' => $obj->percent,
14521 'acode' => $obj->acode,
14523 'userid' => $obj->user_id,
14524 'login' => $obj->user_login,
14525 'userfirstname' => $obj->user_firstname,
14526 'userlastname' => $obj->user_lastname,
14527 'userphoto' => $obj->user_photo
14542 if (!isModEnabled(
'agenda')) {
14543 $langs->loadLangs(array(
"admin",
"errors"));
14544 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
14547 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
14548 $delay_warning =
getDolGlobalInt(
'MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
14550 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
14551 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
14552 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
14553 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
14558 $userstatic =
new User($db);
14559 $contactstatic =
new Contact($db);
14560 $userGetNomUrlCache = array();
14561 $contactGetNomUrlCache = array();
14563 $out .=
'<div class="filters-container" >';
14564 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
14565 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
14567 if ($objcon && get_class($objcon) ==
'Contact' &&
14568 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
14569 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
14571 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
14573 if (($filterobj && get_class($filterobj) ==
'Societe')) {
14574 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
14576 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
14581 $out .=
'<div class="div-table-responsive-no-min">';
14582 $out .=
'<table class="noborder borderbottom centpercent">';
14584 $out .=
'<tr class="liste_titre">';
14588 $out .=
'<th class="liste_titre width50 middle">';
14589 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14590 $out .= $searchpicto;
14595 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'nowraponall nopaddingleftimp ').
"\n";
14597 $out .=
'<th class="liste_titre hideonsmartphone"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
14599 $out .=
'<th class="liste_titre"></th>';
14602 $out .=
'<th class="liste_titre">';
14603 $out .=
'<span class="fas fa-square inline-block fawidth30 hideonsmartphone" style="color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
14604 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'',
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? -1 : 1, 0, 0, 1,
'selecttype minwidth100', $langs->trans(
"Type"));
14607 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
14608 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
14613 $out .=
'<th class="liste_titre width50 middle">';
14614 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14615 $out .= $searchpicto;
14621 $out .=
'</table>';
14628 $out .=
'<ul class="timeline">';
14632 if ($filterobj instanceof
Societe) {
14633 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14635 if ($filterobj instanceof
User) {
14636 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14638 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
14639 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
14640 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
14642 if ($filterobj instanceof
Societe) {
14645 if ($filterobj instanceof
User) {
14651 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
14653 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
14655 $actualCycleDate =
false;
14658 foreach ($histo as $key => $value) {
14659 $actionstatic->fetch($histo[$key][
'id']);
14661 $actionstatic->type_picto = $histo[$key][
'apicto'];
14662 $actionstatic->type_code = $histo[$key][
'acode'];
14664 $labeltype = $actionstatic->type_code;
14665 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
14666 $labeltype =
'AC_OTH';
14668 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14669 $labeltype = $langs->trans(
"Message");
14671 if (!empty($arraylist[$labeltype])) {
14672 $labeltype = $arraylist[$labeltype];
14674 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
14675 $labeltype .=
' - '.$arraylist[$actionstatic->code];
14679 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
14681 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
14683 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
14684 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
14685 $out .=
'<!-- timeline time label -->';
14686 $out .=
'<li class="time-label">';
14687 $out .=
'<span class="timeline-badge-date">';
14688 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
14691 $out .=
'<!-- /.timeline-label -->';
14695 $out .=
'<!-- timeline item -->'.
"\n";
14696 $out .=
'<li class="timeline-code-'.(!empty($actionstatic->code) ? strtolower($actionstatic->code) :
"none").
'">';
14699 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
14704 $out .=
'<div class="timeline-item">'.
"\n";
14706 $out .=
'<span class="time timeline-header-action2">';
14708 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
14709 $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").
' ';
14710 $out .= $histo[$key][
'id'];
14713 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
14716 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
14717 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
14718 $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).
'">';
14720 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
14727 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
14728 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
14729 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
14730 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
14731 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
14732 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
14733 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
14735 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
14739 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14742 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14745 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
14748 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14754 $out .=
"</span></span>\n";
14757 $out .=
'<h3 class="timeline-header">';
14760 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
14761 if ($histo[$key][
'userid'] > 0) {
14762 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
14763 $userstatic->fetch($histo[$key][
'userid']);
14764 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
14766 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
14767 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
14768 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
14769 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
14770 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
14772 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
14775 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
14780 $out .=
' <div class="messaging-title inline-block">';
14782 if (empty(
$conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
14783 $out .= $labeltype.
' - ';
14787 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14788 $out .= $langs->trans(
'TicketNewMessage');
14789 } elseif (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14790 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
14791 } elseif (isset($histo[$key][
'type'])) {
14792 if ($histo[$key][
'type'] ==
'action') {
14793 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14794 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
14795 $libelle = $histo[$key][
'note'];
14796 $actionstatic->id = $histo[$key][
'id'];
14798 } elseif ($histo[$key][
'type'] ==
'mailing') {
14799 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
14800 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14801 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
14804 $libelle .= $histo[$key][
'note'];
14809 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
14810 if (isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
14811 $link =
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
14813 if (!isset(
$conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
14814 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
14816 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
14817 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
14820 $out .=
' - '.$link;
14829 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
14830 && $actionstatic->code !=
'AC_TICKET_CREATE'
14831 && $actionstatic->code !=
'AC_TICKET_MODIFY'
14833 $out .=
'<div class="timeline-body wordbreak small">';
14834 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
14836 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
14837 $out .=
'<div class="readmore-block --closed" >';
14838 $out .=
' <div class="readmore-block__excerpt">';
14840 $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>';
14842 $out .=
' <div class="readmore-block__full-text" >';
14844 $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>';
14858 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
14860 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
14861 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14863 $contact->fetch($cid);
14864 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14866 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
14870 $contactList .= !empty($contactList) ?
', ' :
'';
14871 $contactList .= $contact->getNomUrl(1);
14872 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14873 if (!empty($contact->phone_pro)) {
14874 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
14880 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
14881 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
14882 if (empty(
$conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14884 $result = $contact->fetch($histo[$key][
'contact_id']);
14885 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14887 $contact =
$conf->cache[
'contact'][$histo[$key][
'contact_id']];
14888 $result = ($contact instanceof
Contact) ? $contact->id : 0;
14892 $footer .= $contact->getNomUrl(1);
14893 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14894 if (!empty($contact->phone_pro)) {
14895 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
14902 if (!empty($documents)) {
14903 $footer .=
'<div class="timeline-documents-container">';
14904 foreach ($documents as $doc) {
14905 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
14906 $footer .=
' data-id="'.$doc->id.
'" ';
14907 $footer .=
' data-path="'.$doc->filepath.
'"';
14908 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
14911 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
14913 $file = $actionstatic->id.
'/'.$doc->filename;
14914 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
14915 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.
$conf->entity;
14916 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.
$conf->entity;
14918 $mimeAttr =
' mime="'.$mime.
'" ';
14920 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
14921 $class .=
' documentpreview';
14924 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
14925 $footer .=
img_mime($filePath).
' '.$doc->filename;
14928 $footer .=
'</span>';
14930 $footer .=
'</div>';
14933 if (!empty($footer)) {
14934 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
14937 $out .=
'</div>'.
"\n";
14940 $out .=
'<!-- END timeline item -->';
14946 jQuery(document).ready(function () {
14947 $(document).on("click", "[data-read-more-action]", function(e){
14948 let readMoreBloc = $(this).closest(".readmore-block");
14949 if(readMoreBloc.length > 0){
14950 e.preventDefault();
14951 if($(this).attr("data-read-more-action") == "close"){
14952 readMoreBloc.addClass("--closed").removeClass("--open");
14953 $("html, body").animate({
14954 scrollTop: readMoreBloc.offset().top - 200
14957 readMoreBloc.addClass("--open").removeClass("--closed");
14965 if (empty($histo)) {
14966 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
14989function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
14991 if ($timestamp ===
null) {
14992 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
14999 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
15000 $TParam = array_merge($TParam, array(
15007 return '&' . http_build_query($TParam);
15028function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
15030 global
$conf, $db, $langs, $hookmanager;
15033 if (!is_object($langs)) {
15034 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
15036 $langs->setDefaultLang();
15039 $langs->load(
"errors");
15041 if ($printheader) {
15042 if (function_exists(
"llxHeader")) {
15044 } elseif (function_exists(
"llxHeaderVierge")) {
15049 print
'<div class="error">';
15050 if (empty($message)) {
15051 print $langs->trans(
"ErrorRecordNotFound");
15053 print $langs->trans($message);
15058 if (empty($showonlymessage)) {
15059 if (empty($hookmanager)) {
15060 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
15063 $hookmanager->initHooks(array(
'main'));
15066 $parameters = array(
'message' => $message,
'params' => $params);
15067 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
15068 print $hookmanager->resPrint;
15071 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....
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage agenda events (actions)
Class to manage different types of events.
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_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_escape_uri($stringtoescape)
Returns text escaped by RFC 3986 for inclusion into a clicable link.
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_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0, $allowscript=0, $allowstyle=0, $allowphp=0)
Clean a string to keep only desirable HTML tags.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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, $filecache=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid, $filecache=0)
Read a memory area shared by all users, all sessions on server.
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.