48include_once DOL_DOCUMENT_ROOT.
'/core/lib/json.lib.php';
51if (!function_exists(
'utf8_encode')) {
59 function utf8_encode($elements)
61 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
65if (!function_exists(
'utf8_decode')) {
73 function utf8_decode($elements)
75 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
78if (!function_exists(
'str_starts_with')) {
87 function str_starts_with($haystack, $needle)
89 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
92if (!function_exists(
'str_ends_with')) {
101 function str_ends_with($haystack, $needle)
103 return $needle !==
'' && substr($haystack, -strlen($needle)) === (string) $needle;
106if (!function_exists(
'str_contains')) {
115 function str_contains($haystack, $needle)
117 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
137 if (!is_object(
$object) && empty($module)) {
140 if (empty($module) && !empty(
$object->element)) {
145 if ($module ==
'fichinter') {
146 $module =
'ficheinter';
147 } elseif ($module ==
'invoice_supplier') {
148 $module =
'supplier_invoice';
149 } elseif ($module ==
'order_supplier') {
150 $module =
'supplier_order';
154 if ($mode ==
'output' || $mode ==
'outputrel' || $mode ==
'version') {
155 if (isset($conf->$module) && property_exists($conf->$module,
'multidir_output')) {
157 if ($mode !=
'outputrel') {
158 $s = $conf->$module->multidir_output[(empty(
$object->entity) ? $conf->entity :
$object->entity)];
160 if ($forobject &&
$object->id > 0) {
165 return 'error-diroutput-not-defined-for-this-object='.$module;
167 } elseif ($mode ==
'temp') {
168 if (isset($conf->$module) && property_exists($conf->$module,
'multidir_temp')) {
169 return $conf->$module->multidir_temp[(empty(
$object->entity) ? $conf->entity :
$object->entity)];
171 return 'error-dirtemp-not-defined-for-this-object='.$module;
174 return 'error-bad-value-for-mode';
218 return (
string) (isset($conf->global->$key) ? $conf->global->$key : $default);
233 return (
int) (isset($conf->global->$key) ? $conf->global->$key : $default);
247 if (empty($tmpuser)) {
252 return (
string) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key : $default);
265 if (empty($tmpuser)) {
270 return (
int) (isset($tmpuser->conf->$key) ? $tmpuser->conf->$key: $default);
287 'adherent' =>
'member',
288 'member_type' =>
'adherent_type',
290 'contrat' =>
'contract',
291 'entrepot' =>
'stock',
292 'projet' =>
'project',
293 'categorie' =>
'category',
294 'commande' =>
'order',
295 'expedition' =>
'shipping',
296 'facture' =>
'invoice',
297 'fichinter' =>
'intervention',
298 'ficheinter' =>
'intervention',
299 'propale' =>
'propal',
300 'socpeople' =>
'contact',
301 'fournisseur' =>
'supplier',
303 'actioncomm' =>
'agenda',
304 'product_price' =>
'productprice',
305 'product_fournisseur_price' =>
'productsupplierprice',
315function isModEnabled($module)
325 $arrayconv[
'supplier_order'] =
'fournisseur';
326 $arrayconv[
'supplier_invoice'] =
'fournisseur';
331 if ($module ==
'delivery_note') {
335 $module =
'shipping';
339 $module_alt = $module;
340 if (!empty($arrayconv[$module])) {
341 $module_alt = $arrayconv[$module];
343 $module_bis = $module;
344 if (!empty($arrayconvbis[$module])) {
345 $module_bis = $arrayconvbis[$module];
348 return !empty($conf->modules[$module]) || !empty($conf->modules[$module_alt]) || !empty($conf->modules[$module_bis]);
360 if ($timestamp ===
'') {
361 dol_syslog(
'Using empty string for a timestamp is deprecated, prefer use of null when calling page '.$_SERVER[
"PHP_SELF"], LOG_NOTICE);
364 if (is_null($timestamp) || !is_numeric($timestamp)) {
384 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
386 $class =
'DoliDB'.ucfirst($type);
387 $db =
new $class($type, $host, $user, $pass, $name, $port);
408function getEntity($element, $shared = 1, $currentobject =
null)
410 global $conf, $mc, $hookmanager,
$object, $action, $db;
412 if (!is_object($hookmanager)) {
413 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
420 $element =
'project';
423 $element =
'contract';
425 case 'order_supplier':
426 $element =
'supplier_order';
428 case 'invoice_supplier':
429 $element =
'supplier_invoice';
433 if (is_object($mc)) {
434 $out = $mc->getEntity($element, $shared, $currentobject);
437 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
439 $addzero[] =
'c_holiday_types';
441 if (in_array($element, $addzero)) {
444 $out .= ((int) $conf->entity);
449 'element' => $element,
452 'currentobject' => $currentobject,
455 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
457 if (is_numeric($reshook)) {
458 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
459 $out .=
','.$hookmanager->resPrint;
460 } elseif ($reshook == 1) {
461 $out = $hookmanager->resPrint;
478 if (is_object($mc) && method_exists($mc,
'setEntity')) {
479 return $mc->setEntity($currentobject);
481 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity : $conf->entity);
493 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
505 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
506 $r = chr($n % 26 + 0x41) . $r;
530 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
537 $user_agent = substr($user_agent, 0, 512);
539 $detectmobile =
new Mobile_Detect(
null, $user_agent);
540 $tablet = $detectmobile->isTablet();
542 if ($detectmobile->isMobile()) {
546 if ($detectmobile->is(
'AndroidOS')) {
547 $os = $phone =
'android';
548 } elseif ($detectmobile->is(
'BlackBerryOS')) {
549 $os = $phone =
'blackberry';
550 } elseif ($detectmobile->is(
'iOS')) {
553 } elseif ($detectmobile->is(
'PalmOS')) {
554 $os = $phone =
'palm';
555 } elseif ($detectmobile->is(
'SymbianOS')) {
557 } elseif ($detectmobile->is(
'webOS')) {
559 } elseif ($detectmobile->is(
'MaemoOS')) {
561 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
567 if (preg_match(
'/linux/i', $user_agent)) {
569 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
571 } elseif (preg_match(
'/windows/i', $user_agent)) {
577 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
579 $version = empty($reg[2]) ?
'' : $reg[2];
580 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
582 $version = empty($reg[2]) ?
'' : $reg[2];
583 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
585 $version = empty($reg[2]) ?
'' : $reg[2];
586 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
589 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
591 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
593 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
595 $version = empty($reg[2]) ?
'' : $reg[2];
596 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
599 $version = empty($reg[2]) ?
'' : $reg[2];
600 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
602 $version = end($reg);
603 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
606 $version = end($reg);
607 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
609 $name =
'textbrowser';
610 $version = empty($reg[3]) ?
'' : $reg[3];
611 } elseif (preg_match(
'/w3m\/([\d\.]+)/i', $user_agent, $reg)) {
613 $name =
'textbrowser';
614 $version = empty($reg[1]) ?
'' : $reg[1];
626 'browsername' => $name,
627 'browserversion' => $version,
629 'browserua' => $user_agent,
644 $disconnectdone =
false;
646 if (is_object($db) && !empty($db->connected)) {
647 $depth = $db->transaction_opened;
648 $disconnectdone = $db->close();
650 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));
662function GETPOSTISSET($paramname)
666 $relativepathstring = $_SERVER[
"PHP_SELF"];
668 if (constant(
'DOL_URL_ROOT')) {
669 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
671 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
672 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
678 if (!empty($_GET[
'restore_lastsearch_values'])) {
679 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
680 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
681 if (is_array($tmp)) {
682 foreach ($tmp as $key => $val) {
683 if ($key == $paramname) {
691 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
693 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
695 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
697 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
701 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
718 if (empty($method)) {
719 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
720 } elseif ($method == 1) {
721 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
722 } elseif ($method == 2) {
723 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
724 } elseif ($method == 3) {
725 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
727 $val =
'BadFirstParameterForGETPOST';
730 return is_array($val);
762function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
764 global $mysoc, $user, $conf;
766 if (empty($paramname)) {
767 return 'BadFirstParameterForGETPOST';
770 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);
775 if (empty($method)) {
776 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
777 } elseif ($method == 1) {
778 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
779 } elseif ($method == 2) {
780 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
781 } elseif ($method == 3) {
782 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
784 return 'BadThirdParameterForGETPOST';
787 $relativepathstring =
'';
789 if (empty($method) || $method == 3 || $method == 4) {
790 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
792 if (constant(
'DOL_URL_ROOT')) {
793 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
795 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
796 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
802 if (!empty($_GET[
'restore_lastsearch_values'])) {
803 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
804 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
805 if (is_array($tmp)) {
806 foreach ($tmp as $key => $val) {
807 if ($key == $paramname) {
815 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
816 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
817 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
818 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
819 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
820 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
821 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
822 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
824 } elseif (!isset($_GET[
'sortfield'])) {
827 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
830 '@phan-var-force CommonObject $object';
831 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
833 $out =
$object->fields[$paramname][
'default'];
837 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
839 if (!empty($user->default_values)) {
840 if (isset($user->default_values[$relativepathstring][
'createform'])) {
841 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
843 if ($defkey !=
'_noquery_') {
844 $tmpqueryarraytohave = explode(
'&', $defkey);
847 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
848 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
861 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
862 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
869 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
871 if (!empty($user->default_values)) {
874 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
876 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
878 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
880 if ($defkey !=
'_noquery_') {
881 $tmpqueryarraytohave = explode(
'&', $defkey);
884 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
885 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
898 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
899 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
903 if ($paramname ==
'sortfield') {
906 if ($paramname ==
'sortorder') {
914 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
915 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
916 if (!empty($_GET[
'disabledefaultvalues'])) {
920 if ($defkey !=
'_noquery_') {
921 $tmpqueryarraytohave = explode(
'&', $defkey);
924 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
925 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
937 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
939 if (isset($_POST[
'sall']) || isset($_POST[
'search_all']) || isset($_GET[
'sall']) || isset($_GET[
'search_all'])) {
942 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
943 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
946 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
947 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
962 '@phan-var-force string $paramname';
963 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
967 while (preg_match(
'/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) {
971 if ($reg[1] ==
'DAY') {
973 $newout = $tmp[
'mday'];
974 } elseif ($reg[1] ==
'MONTH') {
976 $newout = $tmp[
'mon'];
977 } elseif ($reg[1] ==
'YEAR') {
979 $newout = $tmp[
'year'];
980 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
983 $newout = $tmp2[
'day'];
984 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
987 $newout = $tmp2[
'month'];
988 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
990 $newout = ($tmp[
'year'] - 1);
991 } elseif ($reg[1] ==
'NEXT_DAY') {
994 $newout = $tmp2[
'day'];
995 } elseif ($reg[1] ==
'NEXT_MONTH') {
998 $newout = $tmp2[
'month'];
999 } elseif ($reg[1] ==
'NEXT_YEAR') {
1001 $newout = ($tmp[
'year'] + 1);
1002 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1003 $newout = $mysoc->country_id;
1004 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1005 $newout = $user->id;
1006 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1007 $newout = $user->fk_user;
1008 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1009 $newout = $conf->entity;
1010 } elseif ($reg[1] ==
'ID') {
1016 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1021 if (preg_match(
'/^array/', $check)) {
1022 if (!is_array($out) || empty($out)) {
1025 $tmparray = explode(
':', $check);
1026 if (!empty($tmparray[1])) {
1027 $tmpcheck = $tmparray[1];
1029 $tmpcheck =
'alphanohtml';
1031 foreach ($out as $outkey => $outval) {
1032 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1038 if (strpos($paramname,
'search_') === 0) {
1039 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1043 $out =
sanitizeVal($out, $check, $filter, $options);
1048 if (preg_match(
'/backtopage/', $paramname) || $paramname ==
'backtolist' || $paramname ==
'backtourl') {
1049 $out = str_replace(
'\\',
'/', $out);
1050 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1052 $oldstringtoclean = $out;
1053 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1054 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1055 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1056 }
while ($oldstringtoclean != $out);
1061 if (empty($method) || $method == 3 || $method == 4) {
1062 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1069 if ($out !=
'' && isset($user)) {
1070 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1089 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1118function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1120 return sanitizeVal($out, $check, $filter, $options);
1132function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1140 if (!is_numeric($out)) {
1145 if (is_array($out)) {
1146 $out = implode(
',', $out);
1148 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1153 $out = filter_var($out, FILTER_SANITIZE_STRING);
1156 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1159 if (!is_array($out)) {
1161 if (preg_match(
'/[^a-z]+/i', $out)) {
1167 if (!is_array($out)) {
1169 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1175 if (!is_array($out)) {
1177 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1183 if (!is_array($out)) {
1185 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1192 if (!is_array($out)) {
1195 $oldstringtoclean = $out;
1199 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1206 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1207 }
while ($oldstringtoclean != $out);
1211 case 'alphawithlgt':
1212 if (!is_array($out)) {
1215 $oldstringtoclean = $out;
1219 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1226 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1227 }
while ($oldstringtoclean != $out);
1233 case 'restricthtmlnolink':
1234 case 'restricthtml':
1235 case 'restricthtmlallowclass':
1236 case 'restricthtmlallowunvalid':
1241 if (empty($filter)) {
1242 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1244 if (is_null($options)) {
1247 $out = filter_var($out, $filter, $options);
1251 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1252 $out =
GETPOST($out,
'alphanohtml');
1260if (!function_exists(
'dol_getprefix')) {
1271 function dol_getprefix($mode =
'')
1274 if ($mode ==
'email') {
1279 return $conf->global->MAIL_PREFIX_FOR_EMAIL_ID;
1280 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1281 return $_SERVER[
"SERVER_NAME"];
1286 if (!empty($conf->file->instance_unique_id)) {
1287 return sha1(
'dolibarr'.$conf->file->instance_unique_id);
1291 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1295 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1296 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1299 if (!empty($tmp_instance_unique_id)) {
1300 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1304 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1305 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1307 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1324 global $conf, $langs, $user, $mysoc;
1328 if (!file_exists($fullpath)) {
1329 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1333 if (!empty($classname) && !class_exists($classname)) {
1334 return include $fullpath;
1336 return include_once $fullpath;
1354function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1358 $path = preg_replace(
'/^\//',
'', $path);
1361 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1362 if (is_array($conf->file->dol_document_root)) {
1363 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1364 if ($key ==
'main') {
1368 if (@file_exists($dirroot.
'/'.$path)) {
1369 $res = $dirroot.
'/'.$path;
1374 if ($returnemptyifnotfound) {
1376 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1388 $res = DOL_URL_ROOT.
'/'.$path;
1391 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1394 $res = DOL_URL_ROOT.
'/'.$path;
1397 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1398 if ($key ==
'main') {
1403 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1404 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1407 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1412 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1413 if (!empty($regs[1])) {
1416 if (@file_exists($dirroot.
'/'.$regs[1])) {
1418 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1419 } elseif ($type == 2) {
1420 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1421 } elseif ($type == 3) {
1425 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1426 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1429 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).$conf->file->dol_url_root[$key].
'/'.$path;
1453 if (empty($properties)) {
1454 return get_object_vars($obj);
1457 $existingProperties = [];
1458 $realProperties = get_object_vars($obj);
1461 foreach ($properties as $property) {
1462 if (array_key_exists($property, $realProperties)) {
1464 $existingProperties[$property] = $obj->{$property};
1465 } elseif (property_exists($obj, $property)) {
1467 $existingProperties[$property] = $obj->{$property};
1471 return $existingProperties;
1499 $myclone = unserialize(serialize(
$object));
1501 if (!empty($tmpsavdb)) {
1504 } elseif ($native == 2) {
1507 $tmparray = get_object_vars(
$object);
1509 if (is_array($tmparray)) {
1510 foreach ($tmparray as $propertykey => $propertyval) {
1511 if (is_scalar($propertyval) || is_array($propertyval)) {
1512 $myclone->$propertykey = $propertyval;
1532function dol_size($size, $type =
'')
1535 if (empty($conf->dol_optimize_smallscreen)) {
1538 if ($type ==
'width' && $size > 250) {
1563 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1565 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1566 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1567 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1568 $tmp = str_replace(
'..',
'', $tmp);
1589 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1591 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1592 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1593 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1594 $tmp = str_replace(
'..',
'', $tmp);
1609 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1611 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1613 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1617 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1621 $oldstringtoclean = $stringtoclean;
1624 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1625 }
while ($oldstringtoclean != $stringtoclean);
1629 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1632 return $stringtoclean;
1644 $oldstringtoclean = $stringtoclean;
1645 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1646 }
while ($oldstringtoclean != $stringtoclean);
1648 return $stringtoclean;
1663 if (is_null($str)) {
1668 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1669 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1670 return $transliterator->transliterate($str);
1673 $string = rawurlencode($str);
1674 $replacements = array(
1675 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1677 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1678 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1680 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1682 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1683 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1684 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1686 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1687 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1689 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1691 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1692 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1694 $string = strtr($string, $replacements);
1695 return rawurldecode($string);
1700 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1701 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1702 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1703 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1704 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1705 \xF9\xFA\xFB\xFC\xFD\xFF",
1713 $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"));
1731function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1733 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1734 if (empty($keepspaces)) {
1735 $forbidden_chars_to_replace[] =
" ";
1737 $forbidden_chars_to_remove = array();
1740 if (is_array($badcharstoreplace)) {
1741 $forbidden_chars_to_replace = $badcharstoreplace;
1743 if (is_array($badcharstoremove)) {
1744 $forbidden_chars_to_remove = $badcharstoremove;
1748 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1767 if ($removetabcrlf) {
1768 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1770 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1782function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
1784 if (is_null($stringtoescape)) {
1789 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
1791 if (empty($noescapebackslashn)) {
1792 $substitjs[
"\n"] =
'\\n';
1793 $substitjs[
'\\'] =
'\\\\';
1796 $substitjs[
"'"] =
"\\'";
1797 $substitjs[
'"'] =
"\\'";
1798 } elseif ($mode == 1) {
1799 $substitjs[
"'"] =
"\\'";
1800 } elseif ($mode == 2) {
1801 $substitjs[
'"'] =
'\\"';
1802 } elseif ($mode == 3) {
1803 $substitjs[
"'"] =
"\\'";
1804 $substitjs[
'"'] =
"\\\"";
1806 return strtr($stringtoescape, $substitjs);
1820 return rawurlencode($stringtoescape);
1831 return str_replace(
'"',
'\"', $stringtoescape);
1843 if (is_null($stringtoescape)) {
1847 if ($stringforquotes == 2) {
1848 return str_replace(
'"',
"'", $stringtoescape);
1849 } elseif ($stringforquotes == 1) {
1855 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
1856 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1859 return 'Bad parameter for stringforquotes in dol_escape_php';
1870 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
1881 return $stringtoescape;
1921 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
1945 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
1965function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1967 if ($noescapetags ==
'common') {
1968 $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';
1970 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
1972 if ($cleanalsojavascript) {
1977 if ($escapeonlyhtmltags) {
1978 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1980 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1981 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE', $tmp);
1984 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
1987 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
1988 } elseif ($keepn == -1) {
1989 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
1992 if ($escapeonlyhtmltags) {
1993 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
1996 $tmparrayoftags = array();
1997 if ($noescapetags) {
1998 $tmparrayoftags = explode(
',', $noescapetags);
2000 if (count($tmparrayoftags)) {
2002 $tmp = str_ireplace(
'__DOUBLEQUOTE',
'', $tmp);
2004 foreach ($tmparrayoftags as $tagtoreplace) {
2005 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2006 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2007 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2013 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)>/', $tmp, $reg)) {
2015 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2016 $tmpattributes = str_ireplace(
'href="http:',
'__HREFHTTPA', $tmpattributes);
2017 $tmpattributes = str_ireplace(
'href="https:',
'__HREFHTTPSA', $tmpattributes);
2018 $tmpattributes = str_ireplace(
'src="http:',
'__SRCHTTPIMG', $tmpattributes);
2019 $tmpattributes = str_ireplace(
'src="https:',
'__SRCHTTPSIMG', $tmpattributes);
2020 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2021 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2027 $tmp = str_replace(
'<'.$tagtoreplace.$reg[1].$reg[2].
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2030 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)(\s+)\/>/', $tmp, $reg)) {
2032 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2033 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2034 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2037 $tmp = str_replace(
'<'.$tagtoreplace.$reg[1].$reg[2].$reg[3].
'/>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2040 $diff = strcmp($tmpold, $tmp);
2045 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2049 if (count($tmparrayoftags)) {
2050 foreach ($tmparrayoftags as $tagtoreplace) {
2051 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2052 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2053 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2054 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2055 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2058 $result = str_ireplace(
'__HREFHTTPA',
'href="http:', $result);
2059 $result = str_ireplace(
'__HREFHTTPSA',
'href="https:', $result);
2060 $result = str_ireplace(
'__SRCHTTPIMG',
'src="http:', $result);
2061 $result = str_ireplace(
'__SRCHTTPSIMG',
'src="https:', $result);
2062 $result = str_ireplace(
'__DOUBLEQUOTE',
'"', $result);
2065 $result = str_ireplace(
'__SIMPLEQUOTE',
''', $result);
2082 if (function_exists(
'mb_strtolower')) {
2083 return mb_strtolower($string, $encoding);
2085 return strtolower($string);
2099 if (function_exists(
'mb_strtoupper')) {
2100 return mb_strtoupper($string, $encoding);
2102 return strtoupper($string);
2116 if (function_exists(
'mb_substr')) {
2117 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2119 return ucfirst($string);
2133 if (function_exists(
'mb_convert_case')) {
2134 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2136 return ucwords($string);
2162function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2164 global $conf, $user, $debugbar;
2167 if (!isModEnabled(
'syslog')) {
2172 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2173 global $website, $websitekey;
2174 if (is_object($website) && !empty($website->ref)) {
2175 $suffixinfilename .=
'_website_'.$website->ref;
2176 } elseif (!empty($websitekey)) {
2177 $suffixinfilename .=
'_website_'.$websitekey;
2182 if (defined(
'USESUFFIXINLOG')) {
2183 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2187 foreach ($conf->loghandlers as $loghandlerinstance) {
2188 $loghandlerinstance->setIdent($ident);
2192 if (!empty($message)) {
2195 $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');
2197 if (!array_key_exists($level, $logLevels)) {
2198 dol_syslog(
'Error Bad Log Level '.$level, LOG_ERR);
2199 $level = $logLevels[LOG_ERR];
2206 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2210 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2211 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2212 $ospid = sprintf(
"%7s",
dol_trunc(getmypid(), 7,
'right',
'UTF-8', 1));
2213 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2215 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2221 print
"\n\n<!-- Log start\n";
2223 print
"Log end -->\n";
2227 'message' => $message,
2228 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') : false),
2230 'user' => ((is_object($user) && $user->id) ? $user->login : false),
2232 'osuser' => function_exists(
'posix_getuid') ? posix_getuid() : false,
2233 'ospid' => getmypid()
2237 if (!empty($remoteip)) {
2238 $data[
'ip'] = $remoteip;
2240 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
2241 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
2242 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
2243 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
2245 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2247 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
2248 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2250 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'];
2252 $data[
'ip'] =
'???';
2255 if (!empty($_SERVER[
'USERNAME'])) {
2257 $data[
'osuser'] = $_SERVER[
'USERNAME'];
2258 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2260 $data[
'osuser'] = $_SERVER[
'LOGNAME'];
2264 foreach ($conf->loghandlers as $loghandlerinstance) {
2265 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2268 $loghandlerinstance->export($data, $suffixinfilename);
2274 foreach ($conf->loghandlers as $loghandlerinstance) {
2275 $loghandlerinstance->setIdent($ident);
2295 $form =
new Form($db);
2297 $templatenameforexport = $website->name_template;
2298 if (empty($templatenameforexport)) {
2299 $templatenameforexport =
'website_'.$website->ref;
2303 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2306 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2307 $out .=
'jQuery(document).ready(function () {';
2308 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2309 $out .=
' var dialogHtml = \'';
2311 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2312 $dialogcontent .=
' <div style="margin-top: 20px;">';
2313 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2314 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2315 $dialogcontent .=
' </div>';
2316 $dialogcontent .=
' <br>';
2317 $dialogcontent .=
' <div style="margin-top: 20px;">';
2318 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2319 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2320 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2321 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2322 $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>';
2323 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2324 $dialogcontent .=
' </form>';
2325 $dialogcontent .=
' </div>';
2326 $dialogcontent .=
' </div>';
2333 // Add the content of the dialog to the body of the page
2334 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2335 $out .= ' if ($dialog.length > 0) {
2338 jQuery(
"body").append(dialogHtml);
';
2340 // Configuration of popup
2341 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2342 $out .= ' autoOpen:
false,
';
2343 $out .= ' modal:
true,
';
2344 $out .= ' height: 290,
';
2345 $out .= ' width:
"40%",
';
2346 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2349 // Simulate a click on the original "submit" input to export the site.
2350 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2351 $out .= ' console.log(
"Clic on exportsite.");
';
2352 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2353 $out .= ' console.log(
"element founded:", target.length > 0);
';
2354 $out .= ' if (target.length > 0) { target.click(); }
';
2355 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2359 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2360 $out .= ' return false;
';
2363 $out .= '</script>
';
2385function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $backtopagejsfields = '', $accesskey = '')
2389 if (strpos($url, '?
') > 0) {
2390 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2392 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2397 $backtopagejsfieldsid = '';
2398 $backtopagejsfieldslabel = '';
2399 if ($backtopagejsfields) {
2400 $tmpbacktopagejsfields = explode(':
', $backtopagejsfields);
2401 if (empty($tmpbacktopagejsfields[1])) { // If the part 'keyforpopupid:
' is missing, we add $name for it.
2402 $backtopagejsfields = $name.":".$backtopagejsfields;
2403 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[0]);
2405 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[1]);
2407 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ? '' : $tmp2backtopagejsfields[0];
2408 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ? '' : $tmp2backtopagejsfields[1];
2409 $url .= '&backtopagejsfields=
'.urlencode($backtopagejsfields);
2412 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2413 $out .= '<!-- a link
for button to open url into a dialog popup with backtopagejsfields =
'.$backtopagejsfields.' -->
';
2414 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2415 if (empty($conf->use_javascript_ajax)) {
2416 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2417 } elseif ($jsonopen) {
2418 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2420 $out .= ' href=
"#"';
2422 $out .= '>
'.$buttonstring.'</a>
';
2424 if (!empty($conf->use_javascript_ajax)) {
2425 // Add code to open url using the popup. Add also hidden field to retrieve the returned variables
2426 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2427 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2428 $out .= '<div
id=
"varforreturndialogid'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned
id' : '').'</div>
';
2429 $out .= '<div
id=
"varforreturndialoglabel'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned label
' : '').'</div>
';
2431 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2432 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2433 jQuery(document).ready(
function () {
2434 jQuery(
".button_'.$name.'").click(
function () {
2435 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2436 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2437 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2441 height: (window.innerHeight - 150),
2444 open: function (event, ui) {
2445 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2447 close:
function (event, ui) {
2448 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2449 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2450 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2451 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2452 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2454 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2455 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2460 $tmpdialog.dialog(\
'open\');
2485function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2487 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2506function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2508 global $conf, $langs, $hookmanager;
2512 if (!empty($conf->dol_optimize_smallscreen)) {
2516 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2518 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2519 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2523 if ($morehtmlright) {
2524 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2528 if (!empty($title) && $showtitle && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
2530 $out .=
'<a class="tabTitle">';
2532 $noprefix = $pictoisfullpath;
2533 if (strpos($picto,
'fontawesome_') !==
false) {
2536 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2538 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2546 if (is_array($links) && !empty($links)) {
2547 $keys = array_keys($links);
2549 $maxkey = max($keys);
2555 if (empty($limittoshow)) {
2556 $limittoshow = (!
getDolGlobalString(
'MAIN_MAXTABS_IN_CARD') ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2558 if (!empty($conf->dol_optimize_smallscreen)) {
2566 for ($i = 0; $i <= $maxkey; $i++) {
2567 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2569 if ($i >= $limittoshow) {
2575 for ($i = 0; $i <= $maxkey; $i++) {
2576 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2582 if ($i < $limittoshow || $isactive) {
2584 $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])).
' -->';
2586 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2587 if (!empty($links[$i][0])) {
2588 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2590 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2592 } elseif (!empty($links[$i][1])) {
2594 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2595 if (!empty($links[$i][0])) {
2596 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2597 $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).
'">';
2599 $out .= $links[$i][1];
2600 if (!empty($links[$i][0])) {
2601 $out .=
'</a>'.
"\n";
2603 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2612 $outmore .=
'<div class="popuptabset wordwrap">';
2614 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2615 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2616 if (!empty($links[$i][0])) {
2617 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2619 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2621 } elseif (!empty($links[$i][1])) {
2622 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2623 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2624 $outmore .=
'</a>'.
"\n";
2626 $outmore .=
'</div>';
2633 $outmore .=
'</div>';
2637 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2638 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2639 $widthofpopup = 200;
2641 $tabsname = $moretabssuffix;
2642 if (empty($tabsname)) {
2643 $tabsname = str_replace(
"@",
"", $picto);
2645 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2647 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2649 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2652 $out .=
'<div></div>';
2655 $out .=
'<script nonce="'.getNonce().
'">';
2656 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2657 var x = this.offsetLeft, y = this.offsetTop;
2658 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2659 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2660 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2662 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2665 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2666 $out .=
"</script>";
2669 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2673 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2674 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom')));
2677 if (!empty($dragdropfile)) {
2678 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2681 $parameters = array(
'tabname' => $active,
'out' => $out);
2682 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2684 $out = $hookmanager->resPrint;
2710 if (!$notab || $notab == -1) {
2711 return "\n</div>\n";
2736function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2738 global $conf, $form, $user, $langs, $hookmanager, $action;
2742 $maxvisiblephotos = 1;
2744 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
2746 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
2747 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2750 $modulepart =
'unknown';
2752 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
2753 $modulepart =
$object->element;
2754 } elseif (
$object->element ==
'member') {
2755 $modulepart =
'memberphoto';
2756 } elseif (
$object->element ==
'user') {
2757 $modulepart =
'userphoto';
2760 if (class_exists(
"Imagick")) {
2761 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
2762 $modulepart =
$object->element;
2763 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
2764 $modulepart =
'ficheinter';
2765 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2766 $modulepart =
'contract';
2767 } elseif (
$object->element ==
'order_supplier') {
2768 $modulepart =
'supplier_order';
2769 } elseif (
$object->element ==
'invoice_supplier') {
2770 $modulepart =
'supplier_invoice';
2774 if (
$object->element ==
'product') {
2776 '@phan-var-force Product $object';
2778 $cssclass =
'photowithmargin photoref';
2779 $showimage =
$object->is_photo_available($conf->product->multidir_output[$entity]);
2781 if ($conf->browser->layout ==
'phone') {
2782 $maxvisiblephotos = 1;
2785 $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>';
2789 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2791 $nophoto =
'/public/theme/common/nophoto.png';
2792 $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>';
2795 } elseif (
$object->element ==
'category') {
2797 '@phan-var-force Categorie $object';
2799 $cssclass =
'photowithmargin photoref';
2800 $showimage =
$object->isAnyPhotoAvailable($conf->categorie->multidir_output[$entity]);
2802 if ($conf->browser->layout ==
'phone') {
2803 $maxvisiblephotos = 1;
2806 $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>';
2810 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2812 $nophoto =
'/public/theme/common/nophoto.png';
2813 $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>';
2816 } elseif (
$object->element ==
'bom') {
2818 '@phan-var-force Bom $object';
2820 $cssclass =
'photowithmargin photoref';
2821 $showimage =
$object->is_photo_available($conf->bom->multidir_output[$entity]);
2823 if ($conf->browser->layout ==
'phone') {
2824 $maxvisiblephotos = 1;
2827 $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>';
2831 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2833 $nophoto =
'/public/theme/common/nophoto.png';
2834 $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>';
2837 } elseif (
$object->element ==
'ticket') {
2839 $cssclass =
'photoref';
2841 '@phan-var-force Ticket $object';
2842 $showimage =
$object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
2844 if ($conf->browser->layout ==
'phone') {
2845 $maxvisiblephotos = 1;
2849 $showphoto =
$object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2851 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2859 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2861 $nophoto =
img_picto(
'No photo',
'object_ticket');
2862 $morehtmlleft .=
'<!-- No photo to show -->';
2863 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2864 $morehtmlleft .= $nophoto;
2865 $morehtmlleft .=
'</div></div>';
2870 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
2873 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2875 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2876 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2878 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2882 if (empty($subdir)) {
2883 $subdir =
'errorgettingsubdirofobject';
2886 $filepath = $dir_output.$subdir.
"/";
2888 $filepdf = $filepath.$objectref.
".pdf";
2889 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2892 $fileimage = $filepdf.
'_preview.png';
2893 $relativepathimage = $relativepath.
'_preview.png';
2895 $pdfexists = file_exists($filepdf);
2900 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2902 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2911 if ($pdfexists && !$error) {
2912 $heightforphotref = 80;
2913 if (!empty($conf->dol_optimize_smallscreen)) {
2914 $heightforphotref = 60;
2917 if (file_exists($fileimage)) {
2918 $phototoshow =
'<div class="photoref">';
2919 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2920 $phototoshow .=
'</div>';
2923 } elseif (!$phototoshow) {
2924 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2928 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2929 $morehtmlleft .= $phototoshow;
2930 $morehtmlleft .=
'</div>';
2934 if (empty($phototoshow)) {
2935 if (
$object->element ==
'action') {
2937 $cssclass =
'photorefcenter';
2938 $nophoto =
img_picto(
'No photo',
'title_agenda');
2941 $cssclass =
'photorefcenter';
2943 $prefix =
'object_';
2947 if (strpos($picto,
'fontawesome_') !==
false) {
2950 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2952 $morehtmlleft .=
'<!-- No photo to show -->';
2953 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2954 $morehtmlleft .= $nophoto;
2955 $morehtmlleft .=
'</div></div>';
2962 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
2965 if (
$object->element ==
'societe') {
2966 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2969 $morehtmlstatus .=
$object->getLibStatut(6);
2971 } elseif (
$object->element ==
'product') {
2973 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2974 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2976 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2978 $morehtmlstatus .=
' ';
2980 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2981 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2983 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2985 } elseif (in_array(
$object->element, array(
'salary'))) {
2987 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2990 $morehtmlstatus .= $tmptxt;
2991 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
2992 $totalallpayments =
$object->getSommePaiement(0);
2993 $totalallpayments +=
$object->getSumCreditNotesUsed(0);
2994 $totalallpayments +=
$object->getSumDepositsUsed(0);
2995 $tmptxt =
$object->getLibStatut(6, $totalallpayments);
2996 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2997 $tmptxt =
$object->getLibStatut(5, $totalallpayments);
2999 $morehtmlstatus .= $tmptxt;
3000 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3002 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3005 $morehtmlstatus .= $tmptxt;
3006 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3008 $morehtmlstatus .=
$object->getLibStatut(5);
3010 $morehtmlstatus .=
$object->getLibStatut(4);
3012 } elseif (
$object->element ==
'facturerec') {
3013 '@phan-var-force FactureRec $object';
3014 if (
$object->frequency == 0) {
3015 $morehtmlstatus .=
$object->getLibStatut(2);
3017 $morehtmlstatus .=
$object->getLibStatut(5);
3019 } elseif (
$object->element ==
'project_task') {
3024 if (
$object->progress >= 100) {
3027 $tmptxt =
$object->getLibStatut(5);
3028 $morehtmlstatus .= $tmptxt;
3029 } elseif (method_exists(
$object,
'getLibStatut')) {
3030 $tmptxt =
$object->getLibStatut(6);
3031 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3032 $tmptxt =
$object->getLibStatut(5);
3034 $morehtmlstatus .= $tmptxt;
3038 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3040 if (method_exists(
$object,
'getVentilExportCompta')) {
3041 $accounted =
$object->getVentilExportCompta();
3042 $langs->load(
"accountancy");
3043 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
3048 if (!empty(
$object->name_alias)) {
3049 '@phan-var-force Societe $object';
3050 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3054 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3056 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3060 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3063 $morehtmlref .=
'<div class="refidno refaddress">';
3064 $morehtmlref .= $moreaddress;
3065 $morehtmlref .=
'</div>';
3069 $morehtmlref .=
'<div style="clear: both;"></div>';
3070 $morehtmlref .=
'<div class="refidno opacitymedium">';
3071 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3072 $morehtmlref .=
'</div>';
3075 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3076 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3079 } elseif (empty($reshook)) {
3080 $morehtmlref .= $hookmanager->resPrint;
3081 } elseif ($reshook > 0) {
3082 $morehtmlref = $hookmanager->resPrint;
3090 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3091 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3093 print
'<div class="underrefbanner clearboth"></div>';
3105function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3109 if ($fieldrequired) {
3110 $ret .=
'<span class="fieldrequired">';
3112 $ret .=
'<label for="'.$fieldkey.
'">';
3113 $ret .= $langs->trans($langkey);
3115 if ($fieldrequired) {
3128function dol_bc($var, $moreclass =
'')
3131 $ret =
' '.$bc[$var];
3133 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
3153 global $langs, $hookmanager;
3156 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3161 $ret .= ($extralangcode ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->address)));
3164 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3166 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3167 $ret .= (($ret && $town) ? $sep :
'').$town;
3170 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3173 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3175 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3177 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3178 $ret .= ($ret ? $sep :
'').$town;
3180 $ret .= ($ret ?
", " :
'').
$object->state;
3183 $ret .= ($ret ? $sep :
'').
$object->zip;
3185 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3187 $ret .= ($ret ? $sep :
'').
$object->zip;
3188 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3189 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3191 $ret .= $sep.$object->state;
3193 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3196 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3198 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3200 $ret .= ($ret ? $sep :
'').
$object->zip;
3201 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3202 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3203 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3206 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3207 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3208 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3209 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3210 $ret .= ($ret ?
", " :
'').
$object->state;
3214 if (!is_object($outputlangs)) {
3215 $outputlangs = $langs;
3218 $langs->load(
"dict");
3219 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3222 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3223 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3227 $ret .= $hookmanager->resPrint;
3244function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3246 if ((abs($ts) <= 0x7FFFFFFF)) {
3249 return 'Error date outside supported range';
3274function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3276 global $conf, $langs;
3283 if ($tzoutput ===
'auto') {
3284 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
3289 $offsettz = $offsetdst = 0;
3292 if (is_string($tzoutput)) {
3293 if ($tzoutput ==
'tzserver') {
3295 $offsettzstring = @date_default_timezone_get();
3300 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3302 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3304 if (class_exists(
'DateTimeZone')) {
3305 $user_date_tz =
new DateTimeZone($offsettzstring);
3306 $user_dt =
new DateTime();
3307 $user_dt->setTimezone($user_date_tz);
3308 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3309 $offsettz = $user_dt->getOffset();
3311 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3312 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3317 if (!is_object($outputlangs)) {
3318 $outputlangs = $langs;
3321 $format =
'daytextshort';
3326 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3327 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3328 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3329 if ($formatwithoutreduce != $format) {
3330 $format = $formatwithoutreduce;
3336 if ($format ==
'day') {
3337 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
3338 } elseif ($format ==
'hour') {
3339 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
3340 } elseif ($format ==
'hourduration') {
3341 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
3342 } elseif ($format ==
'daytext') {
3343 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
3344 } elseif ($format ==
'daytextshort') {
3345 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
3346 } elseif ($format ==
'dayhour') {
3347 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
3348 } elseif ($format ==
'dayhoursec') {
3349 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
3350 } elseif ($format ==
'dayhourtext') {
3351 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
3352 } elseif ($format ==
'dayhourtextshort') {
3353 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
3354 } elseif ($format ==
'dayhourlog') {
3356 $format =
'%Y%m%d%H%M%S';
3357 } elseif ($format ==
'dayhourlogsmall') {
3359 $format =
'%y%m%d%H%M';
3360 } elseif ($format ==
'dayhourldap') {
3361 $format =
'%Y%m%d%H%M%SZ';
3362 } elseif ($format ==
'dayhourxcard') {
3363 $format =
'%Y%m%dT%H%M%SZ';
3364 } elseif ($format ==
'dayxcard') {
3366 } elseif ($format ==
'dayrfc') {
3367 $format =
'%Y-%m-%d';
3368 } elseif ($format ==
'dayhourrfc') {
3369 $format =
'%Y-%m-%dT%H:%M:%SZ';
3370 } elseif ($format ==
'standard') {
3371 $format =
'%Y-%m-%d %H:%M:%S';
3374 if ($reduceformat) {
3375 $format = str_replace(
'%Y',
'%y', $format);
3376 $format = str_replace(
'yyyy',
'yy', $format);
3380 if (preg_match(
'/%b/i', $format)) {
3382 $format = str_replace(
'%b',
'__b__', $format);
3383 $format = str_replace(
'%B',
'__B__', $format);
3385 if (preg_match(
'/%a/i', $format)) {
3387 $format = str_replace(
'%a',
'__a__', $format);
3388 $format = str_replace(
'%A',
'__A__', $format);
3393 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)) {
3394 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"]));
3396 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3398 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);
3401 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3402 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3403 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3404 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3405 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3406 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3408 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
3411 $tzo =
new DateTimeZone(
'UTC');
3413 $tzo =
new DateTimeZone(date_default_timezone_get());
3415 $dtts =
new DateTime();
3416 $dtts->setTimestamp($time);
3417 $dtts->setTimezone($tzo);
3418 $newformat = str_replace(
3419 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3420 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3423 $ret = $dtts->format($newformat);
3425 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3426 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3431 if ($time < 100000000000) {
3432 $timetouse = $time + $offsettz + $offsetdst;
3435 $tzo =
new DateTimeZone(
'UTC');
3437 $tzo =
new DateTimeZone(date_default_timezone_get());
3439 $dtts =
new DateTime();
3440 $dtts->setTimestamp($timetouse);
3441 $dtts->setTimezone($tzo);
3442 $newformat = str_replace(
3443 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3444 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3447 $ret = $dtts->format($newformat);
3449 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3450 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3455 $ret =
'Bad value '.$time.
' for date';
3459 if (preg_match(
'/__b__/i', $format)) {
3460 $timetouse = $time + $offsettz + $offsetdst;
3463 $tzo =
new DateTimeZone(
'UTC');
3465 $tzo =
new DateTimeZone(date_default_timezone_get());
3467 $dtts =
new DateTime();
3468 $dtts->setTimestamp($timetouse);
3469 $dtts->setTimezone($tzo);
3470 $month = (int) $dtts->format(
"m");
3471 $month = sprintf(
"%02d", $month);
3472 if ($encodetooutput) {
3473 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3474 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3476 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3477 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3480 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3481 $ret = str_replace(
'__B__', $monthtext, $ret);
3485 if (preg_match(
'/__a__/i', $format)) {
3487 $timetouse = $time + $offsettz + $offsetdst;
3490 $tzo =
new DateTimeZone(
'UTC');
3492 $tzo =
new DateTimeZone(date_default_timezone_get());
3494 $dtts =
new DateTime();
3495 $dtts->setTimestamp($timetouse);
3496 $dtts->setTimezone($tzo);
3497 $w = $dtts->format(
"w");
3498 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3500 $ret = str_replace(
'__A__', $dayweek, $ret);
3501 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3528function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3530 if ($timestamp ===
'') {
3534 $datetimeobj =
new DateTime();
3535 $datetimeobj->setTimestamp($timestamp);
3536 if ($forcetimezone) {
3537 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3540 'year' => ((
int) date_format($datetimeobj,
'Y')),
3541 'mon' => ((
int) date_format($datetimeobj,
'm')),
3542 'mday' => ((
int) date_format($datetimeobj,
'd')),
3543 'wday' => ((
int) date_format($datetimeobj,
'w')),
3544 'yday' => ((
int) date_format($datetimeobj,
'z')),
3545 'hours' => ((
int) date_format($datetimeobj,
'H')),
3546 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3547 'seconds' => ((
int) date_format($datetimeobj,
's')),
3575function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3580 if ($gm ===
'auto') {
3581 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3586 if ($hour == -1 || empty($hour)) {
3589 if ($minute == -1 || empty($minute)) {
3592 if ($second == -1 || empty($second)) {
3598 if (!$month || !$day) {
3607 if ($hour < 0 || $hour > 24) {
3610 if ($minute < 0 || $minute > 60) {
3613 if ($second < 0 || $second > 60) {
3618 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3619 $default_timezone = @date_default_timezone_get();
3620 $localtz =
new DateTimeZone($default_timezone);
3621 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3623 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3625 $localtz =
new DateTimeZone($default_timezone);
3627 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3628 $default_timezone = @date_default_timezone_get();
3630 } elseif (strrpos($gm,
"tz,") !==
false) {
3631 $timezone = str_replace(
"tz,",
"", $gm);
3633 $localtz =
new DateTimeZone($timezone);
3635 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3639 if (empty($localtz)) {
3640 $localtz =
new DateTimeZone(
'UTC');
3644 $dt =
new DateTime(
'now', $localtz);
3645 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3646 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3647 $date = $dt->getTimestamp();
3663function dol_now($mode =
'auto')
3667 if ($mode ===
'auto') {
3671 if ($mode ==
'gmt') {
3673 } elseif ($mode ==
'tzserver') {
3674 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3676 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3682 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3685 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3686 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3687 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3704 global $conf, $langs;
3707 if (!empty($conf->dol_optimize_smallscreen)) {
3712 if (empty($shortvalue) || $size < ($level * 10)) {
3714 $textunitshort = $langs->trans(
"b");
3715 $textunitlong = $langs->trans(
"Bytes");
3717 $ret = round($size / $level, 0);
3718 $textunitshort = $langs->trans(
"Kb");
3719 $textunitlong = $langs->trans(
"KiloBytes");
3722 if (empty($shortunit)) {
3723 $ret .=
' '.$textunitlong;
3725 $ret .=
' '.$textunitshort;
3741function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3749 $linkstart =
'<a href="';
3750 if (!preg_match(
'/^http/i', $url)) {
3751 $linkstart .=
'http://';
3756 $linkstart .=
' target="'.$target.
'"';
3758 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3762 if (!preg_match(
'/^http/i', $url)) {
3769 if ($morecss ==
'float') {
3770 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3772 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3788function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3790 global $user, $langs, $hookmanager;
3801 if (empty($email)) {
3805 if (!empty($addlink)) {
3806 $newemail =
'<a class="paddingrightonly" style="text-overflow: ellipsis;" href="';
3807 if (!preg_match(
'/^mailto:/i', $email)) {
3808 $newemail .=
'mailto:';
3810 $newemail .= $email;
3813 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3816 $newemail .=
'</a>';
3818 $langs->load(
"errors");
3819 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3822 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3824 $linktoaddaction =
'';
3826 $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>';
3828 if ($linktoaddaction) {
3829 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3833 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3836 $langs->load(
"errors");
3837 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3847 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3849 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3853 $rep .= $hookmanager->resPrint;
3868 $socialnetworks = array();
3870 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3871 $cachekey =
'socialnetworks_' . $conf->entity;
3873 if (!is_null($dataretrieved)) {
3874 $socialnetworks = $dataretrieved;
3876 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3877 $sql .=
" WHERE entity=".$conf->entity;
3878 $resql = $db->query($sql);
3880 while ($obj = $db->fetch_object($resql)) {
3881 $socialnetworks[$obj->code] = array(
3882 'rowid' => $obj->rowid,
3883 'label' => $obj->label,
3885 'icon' => $obj->icon,
3886 'active' => $obj->active,
3892 return $socialnetworks;
3907 global $user, $langs;
3911 if (empty($value)) {
3915 if (!empty($type)) {
3916 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3918 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3919 if ($type ==
'skype') {
3921 $htmllink .=
' <a href="skype:';
3923 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3924 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3925 $htmllink .=
'</a><a href="skype:';
3927 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3928 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3929 $htmllink .=
'</a>';
3930 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3931 $addlink =
'AC_SKYPE';
3934 $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>';
3936 $htmllink .= ($link ?
' '.$link :
'');
3939 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
3942 if (preg_match(
'/^https?:\/\//i', $link)) {
3943 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3945 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3947 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
3948 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3949 if ($tmpvirginurl) {
3950 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3951 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3953 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3954 if ($tmpvirginurl3) {
3955 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3956 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3959 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3960 if ($tmpvirginurl2) {
3961 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3962 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3965 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3966 if (preg_match(
'/^https?:\/\//i', $link)) {
3967 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3969 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3975 $htmllink .=
'</div>';
3977 $langs->load(
"errors");
3978 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3992function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
3996 if (empty($profID) || empty($profIDtype)) {
3999 if (empty($countrycode)) {
4000 $countrycode = $mysoc->country_code;
4002 $newProfID = $profID;
4003 $id = substr($profIDtype, -1);
4005 if (strtoupper($countrycode) ==
'FR') {
4009 if ($id == 1 &&
dol_strlen($newProfID) == 9) {
4011 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
4013 if ($id == 2 &&
dol_strlen($newProfID) == 14) {
4015 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
4017 if ($id == 3 &&
dol_strlen($newProfID) == 5) {
4019 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
4021 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4023 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
4026 if (!empty($addcpButton)) {
4049function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'')
4051 global $conf, $user, $langs, $mysoc, $hookmanager;
4054 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4055 if (empty($phone)) {
4061 if (empty($countrycode) && is_object($mysoc)) {
4062 $countrycode = $mysoc->country_code;
4066 if (!empty($conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4071 $newphonewa = $phone;
4072 if (strtoupper($countrycode) ==
"FR") {
4075 $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);
4077 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4079 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4081 $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);
4083 $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);
4085 $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);
4087 } elseif (strtoupper($countrycode) ==
"CA") {
4089 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4091 } elseif (strtoupper($countrycode) ==
"PT") {
4093 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4095 } elseif (strtoupper($countrycode) ==
"SR") {
4097 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4099 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4101 } elseif (strtoupper($countrycode) ==
"DE") {
4103 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4105 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4107 } elseif (strtoupper($countrycode) ==
"ES") {
4109 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4111 } elseif (strtoupper($countrycode) ==
"BF") {
4113 $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);
4115 } elseif (strtoupper($countrycode) ==
"RO") {
4117 $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);
4119 } elseif (strtoupper($countrycode) ==
"TR") {
4121 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4123 } elseif (strtoupper($countrycode) ==
"US") {
4125 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4127 } elseif (strtoupper($countrycode) ==
"MX") {
4129 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4131 $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);
4133 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4135 } elseif (strtoupper($countrycode) ==
"ML") {
4137 $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);
4139 } elseif (strtoupper($countrycode) ==
"TH") {
4141 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4143 $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);
4145 } elseif (strtoupper($countrycode) ==
"MU") {
4148 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4150 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4152 } elseif (strtoupper($countrycode) ==
"ZA") {
4154 $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);
4156 } elseif (strtoupper($countrycode) ==
"SY") {
4158 $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);
4160 $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);
4162 } elseif (strtoupper($countrycode) ==
"AE") {
4164 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4166 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4168 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4170 } elseif (strtoupper($countrycode) ==
"DZ") {
4172 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4174 } elseif (strtoupper($countrycode) ==
"BE") {
4176 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4178 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4180 } elseif (strtoupper($countrycode) ==
"PF") {
4182 $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);
4184 } elseif (strtoupper($countrycode) ==
"CO") {
4186 $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);
4188 } elseif (strtoupper($countrycode) ==
"JO") {
4190 $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);
4192 } elseif (strtoupper($countrycode) ==
"JM") {
4194 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4196 } elseif (strtoupper($countrycode) ==
"MG") {
4198 $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);
4200 } elseif (strtoupper($countrycode) ==
"GB") {
4202 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4204 } elseif (strtoupper($countrycode) ==
"CH") {
4206 $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);
4208 $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);
4210 } elseif (strtoupper($countrycode) ==
"TN") {
4212 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4214 } elseif (strtoupper($countrycode) ==
"GF") {
4216 $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);
4218 } elseif (strtoupper($countrycode) ==
"GP") {
4220 $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);
4222 } elseif (strtoupper($countrycode) ==
"MQ") {
4224 $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);
4226 } elseif (strtoupper($countrycode) ==
"IT") {
4228 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4230 $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);
4232 } elseif (strtoupper($countrycode) ==
"AU") {
4236 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4238 } elseif (strtoupper($countrycode) ==
"LU") {
4241 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4243 $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);
4245 $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);
4247 $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);
4249 } elseif (strtoupper($countrycode) ==
"PE") {
4252 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4254 $newphonewa =
'+51'.$newphone;
4255 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4257 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4259 $newphonewa = $newphone;
4260 $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);
4264 $newphoneastart = $newphoneaend =
'';
4265 if (!empty($addlink)) {
4266 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4267 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4268 $newphoneaend .=
'</a>';
4269 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4270 if (empty($user->clicktodial_loaded)) {
4271 $user->fetch_clicktodial();
4275 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4276 if (!empty($user->clicktodial_url)) {
4277 $urlmask = $user->clicktodial_url;
4280 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4281 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4282 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4284 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4286 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4287 '__PHONETO__' => urlencode($phone),
4288 '__LOGIN__' => $clicktodial_login,
4289 '__PASS__' => $clicktodial_password);
4293 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4294 $newphoneaend =
'</a>';
4297 $newphoneastart =
'<a href="'.$url.
'"';
4299 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4301 $newphoneastart .=
'>';
4302 $newphoneaend .=
'</a>';
4307 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4309 $addlinktoagenda =
'';
4310 if ($addlink ==
'AC_FAX') {
4314 $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>';
4316 if ($addlinktoagenda) {
4317 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4322 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4324 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4325 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4328 if (empty($titlealt)) {
4329 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4334 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4335 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4336 $rep .= $hookmanager->resPrint;
4338 if (empty($reshook)) {
4341 if ($withpicto ==
'fax') {
4342 $picto =
'phoning_fax';
4343 } elseif ($withpicto ==
'phone') {
4345 } elseif ($withpicto ==
'mobile') {
4346 $picto =
'phoning_mobile';
4351 if ($adddivfloat == 1) {
4352 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">';
4353 } elseif (empty($adddivfloat)) {
4354 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
' style="margin-right: 10px;">';
4357 $rep .= $newphoneastart;
4358 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4359 if ($separ !=
'hidenum') {
4360 $rep .= ($withpicto ?
' ' :
'').$newphone;
4362 $rep .= $newphoneaend;
4364 if ($adddivfloat == 1) {
4366 } elseif (empty($adddivfloat)) {
4394 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4395 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
4397 $ret .=
' ('.$countrycode.
')';
4417 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4418 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4419 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4420 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4422 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4425 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
4428 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
4444 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4446 } 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') {
4464 if (!empty($conf->geoipmaxmind->enabled)) {
4468 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4469 $geoip =
new DolGeoIP(
'country', $datafile);
4471 $countrycode = $geoip->getCountryCodeFromIP($ip);
4474 return $countrycode;
4486 global $conf, $langs, $user;
4490 if (!empty($conf->geoipmaxmind->enabled)) {
4495 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4496 $geoip =
new DolGeoIP(
'country', $datafile);
4497 $countrycode = $geoip->getCountryCodeFromIP($ip);
4498 $ret = $countrycode;
4515function dol_print_address($address, $htmlid, $element, $id, $noprint = 0, $charfornl =
'')
4517 global $conf, $user, $langs, $hookmanager;
4523 $parameters = array(
'element' => $element,
'id' => $id);
4524 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4525 $out .= $hookmanager->resPrint;
4527 if (empty($reshook)) {
4528 if (empty($charfornl)) {
4529 $out .= nl2br($address);
4531 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4535 $showgmap = $showomap = 0;
4536 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4539 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4542 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4545 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4548 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4551 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4554 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4557 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4561 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
4562 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4565 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
4566 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4587function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4589 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4592 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4595 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4613 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4614 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4617 if (function_exists(
'getmxrr')) {
4620 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4621 if (count($mxhosts) > 1) {
4624 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
4661 $tmparray = explode(
' ', $s);
4662 foreach ($tmparray as $tmps) {
4677function dol_strlen($string, $stringencoding =
'UTF-8')
4679 if (is_null($string)) {
4683 if (function_exists(
'mb_strlen')) {
4684 return mb_strlen($string, $stringencoding);
4686 return strlen($string);
4700function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4704 if (empty($stringencoding)) {
4705 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
4709 if (empty($trunconbytes)) {
4710 if (function_exists(
'mb_substr')) {
4711 $ret = mb_substr($string, $start, $length, $stringencoding);
4713 $ret = substr($string, $start, $length);
4716 if (function_exists(
'mb_strcut')) {
4717 $ret = mb_strcut($string, $start, $length, $stringencoding);
4719 $ret = substr($string, $start, $length);
4739function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4747 if (empty($stringencoding)) {
4748 $stringencoding =
'UTF-8';
4751 if (!empty($conf->dol_optimize_smallscreen) && $conf->dol_optimize_smallscreen == 1 && $display == 1) {
4752 $size = round($size / 3);
4756 if ($trunc ==
'right') {
4758 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4760 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4765 } elseif ($trunc ==
'middle') {
4767 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4768 $size1 = round($size / 2);
4769 $size2 = round($size / 2);
4770 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4774 } elseif ($trunc ==
'left') {
4776 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4778 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4782 } elseif ($trunc ==
'wrap') {
4784 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4790 return 'BadParam3CallingDolTrunc';
4804 $type2picto = array(
4805 'varchar' =>
'font',
4808 'int' =>
'sort-numeric-down',
4809 'double' =>
'sort-numeric-down',
4810 'price' =>
'currency',
4811 'pricecy' =>
'multicurrency',
4812 'password' =>
'key',
4813 'boolean' =>
'check-square',
4814 'date' =>
'calendar',
4815 'datetime' =>
'calendar',
4821 'sellist' =>
'list',
4822 'radio' =>
'check-circle',
4823 'checkbox' =>
'list',
4824 'chkbxlst' =>
'list',
4826 'icon' =>
"question",
4827 'point' =>
"country",
4828 'multipts' =>
'country',
4829 'linestrg' =>
"country",
4830 'polygon' =>
"country",
4831 'separate' =>
'minus'
4834 if (!empty($type2picto[$key])) {
4835 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4838 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4863function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4868 $url = DOL_URL_ROOT;
4869 $theme = isset($conf->theme) ? $conf->theme :
null;
4870 $path =
'theme/'.$theme;
4871 if (empty($picto)) {
4876 if ($pictoisfullpath) {
4878 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4881 $fullpathpicto = $picto;
4883 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4884 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4885 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4888 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', (is_null($picto) ?
'' : $picto));
4889 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4890 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4892 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
4894 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4895 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4898 if ($pictowithouttext ==
'file-o') {
4899 $pictowithouttext =
'file';
4902 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4903 $marginleftonlyshort = 0;
4905 if (!empty($pictowithouttextarray[1])) {
4907 $fakey =
'fa-'.$pictowithouttextarray[0];
4908 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
4909 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4910 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4912 $fakey =
'fa-'.$pictowithouttext;
4922 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4923 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4924 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4926 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4927 $morestyle = $reg[1];
4928 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4930 $moreatt = trim($moreatt);
4932 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4933 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4937 $enabledisablehtml .=
'</span>';
4939 return $enabledisablehtml;
4942 if (empty($srconly) && in_array($pictowithouttext, array(
4943 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4944 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
4945 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
4946 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4947 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4948 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
4949 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
4950 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
4951 'commercial',
'companies',
4952 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4953 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4954 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
4955 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4956 'hands-helping',
'help',
'holiday',
4957 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4958 'key',
'knowledgemanagement',
4959 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4960 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4961 'off',
'on',
'order',
4962 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4963 'stock',
'resize',
'service',
'stats',
4964 'security',
'setup',
'share-alt',
'sign-out',
'split',
'stripe',
'stripe-s',
'switch_off',
'switch_on',
'switch_on_warning',
'switch_on_red',
'tools',
'unlink',
'uparrow',
'user',
'user-tie',
'vcard',
'wrench',
4965 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4966 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4967 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4968 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4969 'technic',
'ticket',
4971 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4972 'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4973 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
4974 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4975 'conferenceorbooth',
'eventorganization',
4976 'stamp',
'signature',
4979 $fakey = $pictowithouttext;
4983 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'))) {
4986 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4990 $arrayconvpictotofa = array(
4991 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
4992 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
4993 'bank_account' =>
'university',
4994 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
4995 'bookcal' =>
'calendar-check',
4996 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
4998 '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',
4999 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
5000 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
5001 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
5002 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
5003 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
5004 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
5005 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
5006 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
5007 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
5008 'info' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
5009 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
5010 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
5011 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
5012 'sign-out' =>
'sign-out-alt',
5013 'switch_off' =>
'toggle-off',
'switch_on' =>
'toggle-on',
'switch_on_warning' =>
'toggle-on',
'switch_on_red' =>
'toggle-on',
'check' =>
'check',
'bookmark' =>
'star',
5014 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
5015 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
5016 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
5017 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
5018 'other' =>
'square',
5019 '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',
5020 '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',
5021 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
5022 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
5023 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
5024 'service' =>
'concierge-bell',
5025 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
5026 'status' =>
'stop-circle',
5027 'stripe' =>
'stripe-s',
'supplier' =>
'building',
5028 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
5029 'title_agenda' =>
'calendar-alt',
5030 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
5031 'jabber' =>
'comment-o',
5032 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
5033 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
5034 'webportal' =>
'door-open'
5036 if ($conf->currency ==
'EUR') {
5037 $arrayconvpictotofa[
'currency'] =
'euro-sign';
5038 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
5040 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
5041 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
5043 if ($pictowithouttext ==
'off') {
5044 $fakey =
'fa-square';
5046 } elseif ($pictowithouttext ==
'on') {
5047 $fakey =
'fa-check-square';
5049 } elseif ($pictowithouttext ==
'listlight') {
5050 $fakey =
'fa-download';
5051 $marginleftonlyshort = 1;
5052 } elseif ($pictowithouttext ==
'printer') {
5053 $fakey =
'fa-print';
5055 } elseif ($pictowithouttext ==
'note') {
5056 $fakey =
'fa-sticky-note';
5057 $marginleftonlyshort = 1;
5058 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5059 $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');
5060 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5061 if (preg_match(
'/selected/', $pictowithouttext)) {
5064 $marginleftonlyshort = 1;
5065 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5066 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5068 $fakey =
'fa-'.$pictowithouttext;
5071 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5072 $morecss .=
' em092';
5074 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
5075 $morecss .=
' em088';
5077 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5078 $morecss .=
' em080';
5082 $arrayconvpictotomarginleftonly = array(
5083 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5084 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
5085 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5087 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
5088 $marginleftonlyshort = 0;
5092 $arrayconvpictotomorcess = array(
5093 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5094 'bank_account' =>
'infobox-bank_account',
5095 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5096 'bookcal' =>
'infobox-action',
5097 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5098 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5099 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5100 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5101 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5102 'incoterm' =>
'infobox-supplier_proposal',
5103 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5104 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5105 'order' =>
'infobox-commande',
5106 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5107 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5108 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'invoice' =>
'infobox-commande',
5109 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5110 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5111 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5112 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5113 'resource' =>
'infobox-action',
5114 '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',
5115 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5116 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5117 'vat' =>
'infobox-bank_account',
5119 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode'
5121 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5122 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5126 $arrayconvpictotocolor = array(
5127 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5128 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5129 'dynamicprice' =>
'#a69944',
5130 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5132 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5133 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5134 'other' =>
'#ddd',
'world' =>
'#986c6a',
5135 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5137 'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5138 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5139 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5140 'website' =>
'#304',
'workstation' =>
'#a69944'
5142 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5143 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5150 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5151 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5152 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5154 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5155 $morestyle = $reg[1];
5156 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5158 $moreatt = trim($moreatt);
5160 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5161 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5165 $enabledisablehtml .=
'</span>';
5167 return $enabledisablehtml;
5174 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
5175 $path = $theme.
'/theme/'.$theme;
5180 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5186 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5191 foreach ($conf->file->dol_document_root as $type => $dirroot) {
5192 if ($type ==
'main') {
5196 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5197 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5203 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5207 return $fullpathpicto;
5211 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 :
'').
'"').
'>';
5227function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0)
5229 if (strpos($picto,
'^') === 0) {
5230 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
5232 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
5247function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5251 if (is_numeric($picto)) {
5254 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5255 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5259 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
5261 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5275function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5279 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5283 if ($pictoisfullpath) {
5286 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5289 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
5291 if (file_exists($themepath)) {
5297 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5313function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5317 if (empty($titlealt) || $titlealt ==
'default') {
5318 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5320 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5321 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5323 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5324 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5326 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5327 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5329 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5330 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5332 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5334 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5338 if (!is_numeric($numaction)) {
5342 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5352function img_pdf($titlealt =
'default', $size = 3)
5356 if ($titlealt ==
'default') {
5357 $titlealt = $langs->trans(
'Show');
5360 return img_picto($titlealt,
'pdf'.$size.
'.png');
5370function img_edit_add($titlealt =
'default', $other =
'')
5374 if ($titlealt ==
'default') {
5375 $titlealt = $langs->trans(
'Add');
5378 return img_picto($titlealt,
'edit_add.png', $other);
5391 if ($titlealt ==
'default') {
5392 $titlealt = $langs->trans(
'Remove');
5395 return img_picto($titlealt,
'edit_remove.png', $other);
5406function img_edit($titlealt =
'default', $float = 0, $other =
'')
5410 if ($titlealt ==
'default') {
5411 $titlealt = $langs->trans(
'Modify');
5414 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5425function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5429 if ($titlealt ==
'default') {
5430 $titlealt = $langs->trans(
'View');
5433 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5435 return img_picto($titlealt,
'eye', $moreatt);
5446function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5450 if ($titlealt ==
'default') {
5451 $titlealt = $langs->trans(
'Delete');
5454 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5464function img_printer($titlealt =
"default", $other =
'')
5467 if ($titlealt ==
"default") {
5468 $titlealt = $langs->trans(
"Print");
5470 return img_picto($titlealt,
'printer.png', $other);
5480function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5484 if ($titlealt ==
'default') {
5485 $titlealt = $langs->trans(
'Split');
5488 return img_picto($titlealt,
'split.png', $other);
5498function img_help($usehelpcursor = 1, $usealttitle = 1)
5503 if (is_string($usealttitle)) {
5506 $usealttitle = $langs->trans(
'Info');
5510 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5519function img_info($titlealt =
'default')
5523 if ($titlealt ==
'default') {
5524 $titlealt = $langs->trans(
'Informations');
5527 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5538function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5542 if ($titlealt ==
'default') {
5543 $titlealt = $langs->trans(
'Warning');
5547 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5556function img_error($titlealt =
'default')
5560 if ($titlealt ==
'default') {
5561 $titlealt = $langs->trans(
'Error');
5564 return img_picto($titlealt,
'error.png');
5574function img_next($titlealt =
'default', $moreatt =
'')
5578 if ($titlealt ==
'default') {
5579 $titlealt = $langs->trans(
'Next');
5583 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5593function img_previous($titlealt =
'default', $moreatt =
'')
5597 if ($titlealt ==
'default') {
5598 $titlealt = $langs->trans(
'Previous');
5602 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5613function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5617 if ($titlealt ==
'default') {
5618 $titlealt = $langs->trans(
'Down');
5621 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5632function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5636 if ($titlealt ==
'default') {
5637 $titlealt = $langs->trans(
'Up');
5640 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5651function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5655 if ($titlealt ==
'default') {
5656 $titlealt = $langs->trans(
'Left');
5659 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5670function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5674 if ($titlealt ==
'default') {
5675 $titlealt = $langs->trans(
'Right');
5678 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5688function img_allow($allow, $titlealt =
'default')
5692 if ($titlealt ==
'default') {
5693 $titlealt = $langs->trans(
'Active');
5697 return img_picto($titlealt,
'tick.png');
5712 if (is_null($morecss)) {
5716 if ($brand ==
'visa' || $brand ==
'Visa') {
5718 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5719 $brand =
'cc-mastercard';
5720 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5722 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5723 $brand =
'cc-discover';
5724 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5726 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5727 $brand =
'cc-diners-club';
5728 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5729 $brand =
'credit-card';
5732 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5743function img_mime($file, $titlealt =
'', $morecss =
'')
5745 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5751 if (empty($titlealt)) {
5752 $titlealt =
'Mime type: '.$mimetype;
5756 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5767function img_search($titlealt =
'default', $other =
'')
5771 if ($titlealt ==
'default') {
5772 $titlealt = $langs->trans(
'Search');
5775 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
5777 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5778 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5794 if ($titlealt ==
'default') {
5795 $titlealt = $langs->trans(
'Search');
5798 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
5800 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5801 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5818function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
5820 global $conf, $langs;
5822 if ($infoonimgalt) {
5823 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5825 if (empty($conf->use_javascript_ajax)) {
5826 $textfordropdown =
'';
5829 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5830 $fa =
'info-circle';
5831 if ($picto ==
'warning') {
5832 $fa =
'exclamation-triangle';
5834 $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> ';
5836 $result .= ($nodiv ?
'' :
'</div>');
5838 if ($textfordropdown) {
5839 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5840 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5841 jQuery(document).ready(function() {
5842 jQuery(".'.$class.
'text").click(function() {
5843 console.log("toggle text");
5844 jQuery(".'.$class.
'").toggle();
5849 $result = $tmpresult.$result;
5870 global $conf, $langs, $user, $argv;
5871 global $dolibarr_main_prod;
5878 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5880 $langs->load(
"main");
5884 $langs->loadLangs(array(
'main',
'errors'));
5886 if ($_SERVER[
'DOCUMENT_ROOT']) {
5887 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5889 $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";
5891 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5893 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5894 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5895 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5896 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5898 if ($user instanceof
User) {
5899 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
5901 if (function_exists(
"phpversion")) {
5902 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5904 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5905 if (function_exists(
"php_uname")) {
5906 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5908 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5910 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5911 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5912 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5914 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5915 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5917 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5918 $syslog .=
"pid=".dol_getmypid();
5921 if (!empty($conf->modules)) {
5922 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ', $conf->modules).
"<br>\n";
5925 if (is_object($db)) {
5926 if ($_SERVER[
'DOCUMENT_ROOT']) {
5927 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5928 $lastqueryerror = $db->lastqueryerror();
5930 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5932 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5933 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5934 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5938 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5939 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5940 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5941 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5943 $syslog .=
", sql=".$db->lastquery();
5944 $syslog .=
", db_error=".$db->lasterror();
5947 if ($error || $errors) {
5949 if (is_array($error) && is_array($errors)) {
5950 $errors = array_merge($error, $errors);
5951 } elseif (is_array($error)) {
5953 } elseif (is_array($errors) && !empty($error)) {
5954 $errors = array_merge(array($error), $errors);
5955 } elseif (!empty($error)) {
5956 $errors = array_merge(array($error), array($errors));
5959 $langs->load(
"errors");
5961 foreach ($errors as $msg) {
5965 if ($_SERVER[
'DOCUMENT_ROOT']) {
5968 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5970 $syslog .=
", msg=".$msg;
5973 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5974 xdebug_print_function_stack();
5975 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
5976 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5977 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5978 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5983 if (!headers_sent()) {
5984 if (function_exists(
'top_httphead')) {
5988 http_response_code(202);
5991 if (empty($dolibarr_main_prod)) {
5994 if (empty($langs->defaultlang)) {
5995 $langs->setDefaultLang();
5997 $langs->loadLangs(array(
"main",
"errors"));
5999 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";
6000 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
6001 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
6002 if (!defined(
"MAIN_CORE_ERROR")) {
6003 define(
"MAIN_CORE_ERROR", 1);
6020function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6024 if (empty($email)) {
6028 $langs->load(
"errors");
6031 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
6032 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
6033 if ($errormessage) {
6034 print
'<br><br>'.$errormessage;
6036 if (is_array($errormessages) && count($errormessages)) {
6037 foreach ($errormessages as $mesgtoshow) {
6038 print
'<br><br>'.$mesgtoshow;
6041 print
'</div></div>';
6060function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6062 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6083function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6085 global $langs, $form;
6088 if ($moreattrib ==
'class="right"') {
6089 $prefix .=
'right ';
6092 $sortorder = strtoupper($sortorder);
6101 $tmpsortfield = explode(
',', $sortfield);
6102 $sortfield1 = trim($tmpsortfield[0]);
6103 $tmpfield = explode(
',', $field);
6104 $field1 = trim($tmpfield[0]);
6106 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6107 $prefix =
'wrapcolumntitle '.$prefix;
6113 $liste_titre =
'liste_titre';
6114 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6115 $liste_titre =
'liste_titre_sel';
6118 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6123 if (empty($thead) && $field && empty($disablesortlink)) {
6124 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6125 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6126 $options = preg_replace(
'/&+/i',
'&', $options);
6127 if (!preg_match(
'/^&/', $options)) {
6128 $options =
'&'.$options;
6131 $sortordertouseinlink =
'';
6132 if ($field1 != $sortfield1) {
6133 if (preg_match(
'/^DESC/i', $sortorder)) {
6134 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6136 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6139 if (preg_match(
'/^ASC/i', $sortorder)) {
6140 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6142 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6145 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6146 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
6152 if (preg_match(
'/:\w+$/', $tooltip)) {
6153 $tmptooltip = explode(
':', $tooltip);
6155 $tmptooltip = array($tooltip);
6157 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6159 $out .= $langs->trans($name);
6162 if (empty($thead) && $field && empty($disablesortlink)) {
6166 if (empty($thead) && $field) {
6167 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6168 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6169 $options = preg_replace(
'/&+/i',
'&', $options);
6170 if (!preg_match(
'/^&/', $options)) {
6171 $options =
'&'.$options;
6174 if (!$sortorder || ($field1 != $sortfield1)) {
6178 if (preg_match(
'/^DESC/', $sortorder)) {
6181 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6183 if (preg_match(
'/^ASC/', $sortorder)) {
6186 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6191 $tagend =
'</'.$tag.
'>';
6193 $out = $tagstart.$sortimg.$out.$tagend;
6208 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6210 print
'<div class="titre">'.$title.
'</div>';
6224function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'')
6242function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6246 if ($picto ==
'setup') {
6251 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6252 $return .=
'<tr class="titre">';
6254 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6256 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6257 $return .=
'<div class="titre inline-block">';
6259 $return .=
'</div>';
6262 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6265 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6267 $return .=
'</tr></table>'.
"\n";
6295function print_barre_liste($title, $page, $file, $options =
'', $sortfield =
'', $sortorder =
'', $morehtmlcenter =
'', $num = -1, $totalnboflines =
'', $picto =
'generic', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limit = -1, $hideselectlimit = 0, $hidenavigation = 0, $pagenavastextinput = 0, $morehtmlrightbeforearrow =
'')
6300 $savtotalnboflines = $totalnboflines;
6301 if (is_numeric($totalnboflines)) {
6302 $totalnboflines = abs($totalnboflines);
6305 $page = (int) $page;
6307 if ($picto ==
'setup') {
6308 $picto =
'title_setup.png';
6310 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
6311 $picto =
'title.gif';
6314 $limit = $conf->liste_limit;
6317 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6325 print
"<!-- Begin title -->\n";
6326 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
6330 if ($picto && $title) {
6331 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
6334 print
'<td class="nobordernopadding valignmiddle col-title">';
6335 print
'<div class="titre inline-block">';
6337 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
6338 print
'<span class="opacitymedium colorblack paddingleft totalnboflines">('.$totalnboflines.
')</span>';
6340 print
'</div></td>';
6343 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
6344 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6348 print
'<td class="nobordernopadding valignmiddle right col-right">';
6349 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6351 $options .=
"&sortfield=".urlencode($sortfield);
6354 $options .=
"&sortorder=".urlencode($sortorder);
6358 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6359 if ($totalnboflines) {
6361 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
6364 $nbpages = ceil($totalnboflines / $limit);
6368 $cpt = ($page - $maxnbofpage);
6374 if (empty($pagenavastextinput)) {
6375 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6377 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6378 } elseif ($cpt == 2) {
6379 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6385 if ($pagenavastextinput) {
6386 if ($cpt == $page) {
6387 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
6391 if ($cpt == $page) {
6392 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6394 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6398 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6400 if (empty($pagenavastextinput)) {
6401 if ($cpt < $nbpages) {
6402 if ($cpt < $nbpages - 2) {
6403 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6404 } elseif ($cpt == $nbpages - 2) {
6405 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6407 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6411 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6414 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6418 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6419 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
6423 if ($pagenavastextinput) {
6430 print
'</table>'.
"\n";
6433 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
6434 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6437 print
"<!-- End title -->\n\n";
6456function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
6458 global $conf, $langs;
6460 print
'<div class="pagination"><ul>';
6461 if ($beforearrows) {
6462 print
'<li class="paginationbeforearrows">';
6463 print $beforearrows;
6467 if (empty($hidenavigation)) {
6468 if ((
int) $limit > 0 && empty($hideselectlimit)) {
6469 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6470 $pagesizechoices .=
',5000:5000,10000:10000';
6479 print
'<li class="pagination">';
6480 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.
'">';
6481 print
'<datalist id="limitlist">';
6483 print
'<li class="paginationcombolimit valignmiddle">';
6484 print
'<select id="limit" class="flat selectlimit nopadding maxwidth75 center" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
6486 $tmpchoice = explode(
',', $pagesizechoices);
6487 $tmpkey = $limit.
':'.$limit;
6488 if (!in_array($tmpkey, $tmpchoice)) {
6489 $tmpchoice[] = $tmpkey;
6491 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
6492 if (!in_array($tmpkey, $tmpchoice)) {
6493 $tmpchoice[] = $tmpkey;
6495 asort($tmpchoice, SORT_NUMERIC);
6496 foreach ($tmpchoice as $val) {
6498 $tmp = explode(
':', $val);
6501 if ($key !=
'' && $val !=
'') {
6502 if ((
int) $key == (
int) $limit) {
6503 $selected =
' selected="selected"';
6505 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6509 print
'</datalist>';
6512 print
ajax_combobox(
"limit", array(), 0, 0,
'resolve', -1,
'limit');
6516 if ($conf->use_javascript_ajax) {
6517 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6519 jQuery(document).ready(function () {
6520 jQuery(".selectlimit").change(function() {
6521 console.log("Change limit. Send submit");
6522 $(this).parents(\'form:first\').submit();
6531 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>';
6533 if ($betweenarrows) {
6534 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6535 print $betweenarrows;
6536 print
'<!--</div>-->';
6538 if ($nextpage > 0) {
6539 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>';
6542 print
'<li class="paginationafterarrows">';
6547 print
'</ul></div>'.
"\n";
6562function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6566 if (preg_match(
'/%/', $rate)) {
6567 $rate = str_replace(
'%',
'', $rate);
6571 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6572 $morelabel =
' ('.$reg[1].
')';
6573 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6574 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6576 if (preg_match(
'/\*/', $rate)) {
6577 $rate = str_replace(
'*',
'', $rate);
6582 if (!preg_match(
'/\//', $rate)) {
6583 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6586 $ret = $rate.($addpercent ?
'%' :
'');
6588 if (($info_bits & 1) && $usestarfornpr >= 0) {
6611function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6613 global $langs, $conf;
6616 if (empty($amount)) {
6619 $amount = (is_numeric($amount) ? $amount : 0);
6620 if ($rounding == -1) {
6623 $nbdecimal = $rounding;
6625 if ($outlangs ===
'none') {
6635 if (!($outlangs instanceof
Translate)) {
6639 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6640 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6642 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6643 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6645 if ($thousand ==
'None') {
6647 } elseif ($thousand ==
'Space') {
6654 $amount = str_replace(
',',
'.', $amount);
6656 $data = explode(
'.', $amount);
6657 $decpart = isset($data[1]) ? $data[1] :
'';
6658 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6668 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6669 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6670 $nbdecimal = $nbdecimalmaxshown;
6678 if ((
string) $forcerounding !=
'-1') {
6679 if ($forcerounding ===
'MU') {
6681 } elseif ($forcerounding ===
'MT') {
6683 } elseif ($forcerounding >= 0) {
6684 $nbdecimal = $forcerounding;
6689 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
6691 $output = preg_replace(
'/\s/',
' ', $output);
6692 $output = preg_replace(
'/\'/',
''', $output);
6695 $cursymbolbefore = $cursymbolafter =
'';
6696 if ($currency_code && is_object($outlangs)) {
6697 if ($currency_code ==
'auto') {
6698 $currency_code = $conf->currency;
6701 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6702 $listoflanguagesbefore = array(
'nl_NL');
6703 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6704 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6706 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6707 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6710 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6739function price2num($amount, $rounding =
'', $option = 0)
6741 global $langs, $conf;
6744 if (is_null($amount)) {
6753 if (is_null($langs)) {
6757 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6758 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6760 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6761 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6764 if ($thousand ==
'None') {
6766 } elseif ($thousand ==
'Space') {
6774 if (!is_numeric($amount)) {
6775 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6778 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6779 $amount = str_replace($thousand,
'', $amount);
6785 if (is_numeric($amount)) {
6787 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6788 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6790 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6795 if ($thousand !=
',' && $thousand !=
'.') {
6796 $amount = str_replace(
',',
'.', $amount);
6799 $amount = str_replace(
' ',
'', $amount);
6800 $amount = str_replace($thousand,
'', $amount);
6801 $amount = str_replace($dec,
'.', $amount);
6803 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6809 $nbofdectoround =
'';
6810 if ($rounding ==
'MU') {
6812 } elseif ($rounding ==
'MT') {
6814 } elseif ($rounding ==
'MS') {
6815 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6816 } elseif ($rounding ==
'CU') {
6818 } elseif ($rounding ==
'CT') {
6820 } elseif (is_numeric($rounding)) {
6821 $nbofdectoround = (int) $rounding;
6826 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6828 return 'ErrorBadParameterProvidedToFunction';
6834 if (is_numeric($amount)) {
6836 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6837 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6839 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6845 if ($thousand !=
',' && $thousand !=
'.') {
6846 $amount = str_replace(
',',
'.', $amount);
6849 $amount = str_replace(
' ',
'', $amount);
6850 $amount = str_replace($thousand,
'', $amount);
6851 $amount = str_replace($dec,
'.', $amount);
6853 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6871function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6873 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6875 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6876 $dimension *= 1000000;
6878 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6881 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6882 $dimension /= 1000000;
6884 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6901 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6903 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6921function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
6923 global $db, $conf, $mysoc;
6925 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6926 $thirdparty_seller = $mysoc;
6929 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);
6931 $vatratecleaned = $vatrate;
6933 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
6934 $vatratecleaned = trim($reg[1]);
6935 $vatratecode = $reg[2];
6944 if ($mysoc->country_code ==
'ES') {
6946 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6949 if ($thirdparty_seller->id == $mysoc->id) {
6950 if (!$thirdparty_buyer->localtax1_assuj) {
6954 if (!$thirdparty_seller->localtax1_assuj) {
6962 if (!$mysoc->localtax2_assuj) {
6965 if ($thirdparty_seller->id == $mysoc->id) {
6966 if (!$thirdparty_buyer->localtax2_assuj) {
6970 if (!$thirdparty_seller->localtax2_assuj) {
6976 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6979 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6985 if (in_array($mysoc->country_code, array(
'ES'))) {
6986 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6992 if ($thirdparty_seller != $mysoc) {
6994 return $thirdparty_seller->localtax1_value;
6998 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
7003 if ($thirdparty_seller != $mysoc) {
7006 return $thirdparty_seller->localtax2_value;
7009 if (in_array($mysoc->country_code, array(
'ES'))) {
7010 return $thirdparty_buyer->localtax2_value;
7012 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
7019 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
7020 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7021 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
7022 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7023 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7024 if (!empty($vatratecode)) {
7025 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
7027 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
7030 $resql = $db->query($sql);
7033 $obj = $db->fetch_object($resql);
7036 return $obj->localtax1;
7037 } elseif ($local == 2) {
7038 return $obj->localtax2;
7059 $valors = explode(
":", $tax);
7061 if (count($valors) > 1) {
7078 $sql =
" SELECT t.localtax".$local.
" as localtax";
7079 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7080 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7081 $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";
7082 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7083 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7084 $sql .=
" ORDER BY t.rowid DESC";
7086 $resql = $db->query($sql);
7088 $obj = $db->fetch_object($resql);
7090 return $obj->localtax;
7111function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7115 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7118 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7119 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7120 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7121 if ($firstparamisid) {
7122 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7124 $vatratecleaned = $vatrate;
7127 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7128 $vatratecleaned = $reg[1];
7129 $vatratecode = $reg[2];
7132 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7135 $sql .=
" WHERE t.fk_pays = c.rowid";
7137 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
7139 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
7141 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7142 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7144 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7148 $resql = $db->query($sql);
7150 $obj = $db->fetch_object($resql);
7153 'rowid' => $obj->rowid,
7154 'code' => $obj->code,
7155 'rate' => $obj->rate,
7156 'localtax1' => $obj->localtax1,
7157 'localtax1_type' => $obj->localtax1_type,
7158 'localtax2' => $obj->localtax2,
7159 'localtax2_type' => $obj->localtax2_type,
7161 'accountancy_code_sell' => $obj->accountancy_code_sell,
7162 'accountancy_code_buy' => $obj->accountancy_code_buy
7194 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7197 $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";
7198 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7199 if ($firstparamisid) {
7200 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7202 $vatratecleaned = $vatrate;
7205 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7206 $vatratecleaned = $reg[1];
7207 $vatratecode = $reg[2];
7210 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7211 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7212 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7213 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7215 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7216 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7218 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7220 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7224 $resql = $db->query($sql);
7226 $obj = $db->fetch_object($resql);
7229 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7232 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7233 } elseif ($local == 2) {
7234 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7236 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);
7258 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7266 $product->fetch($idprod);
7268 if (($mysoc->country_code == $thirdpartytouse->country_code)
7269 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7270 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7273 if ($idprodfournprice > 0) {
7274 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
7276 $ret = $product->vatrate_supplier;
7277 if ($product->default_vat_code_supplier) {
7278 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7284 $ret = $product->tva_tx;
7285 if ($product->default_vat_code) {
7286 $ret .=
' ('.$product->default_vat_code.
')';
7299 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7300 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7301 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7302 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7303 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7304 $sql .= $db->plimit(1);
7306 $resql = $db->query($sql);
7308 $obj = $db->fetch_object($resql);
7310 $ret = $obj->vat_rate;
7311 if ($obj->default_vat_code) {
7312 $ret .=
' ('.$obj->default_vat_code.
')';
7336 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7353 if (!class_exists(
'Product')) {
7354 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7363 $result = $product->fetch($idprod);
7365 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7379 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7380 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7381 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7382 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7383 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7384 $sql .= $db->plimit(1);
7386 $resql = $db->query($sql);
7388 $obj = $db->fetch_object($resql);
7391 $ret = $obj->localtax1;
7392 } elseif ($local == 2) {
7393 $ret = $obj->localtax2;
7401 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7425 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7428 $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;
7430 $seller_country_code = $thirdparty_seller->country_code;
7431 $seller_in_cee =
isInEEC($thirdparty_seller);
7433 $buyer_country_code = $thirdparty_buyer->country_code;
7434 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7436 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(
'SERVICES_ARE_ECOMMERCE_200238EC') ? $conf->global->SERVICES_ARE_ECOMMERCE_200238EC :
''));
7441 if ($seller_in_cee && $buyer_in_cee) {
7442 $isacompany = $thirdparty_buyer->isACompany();
7443 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7444 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7458 if (!$seller_use_vat) {
7464 if (($seller_country_code == $buyer_country_code)
7465 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7466 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7471 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7475 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
7477 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
7478 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
7480 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
7492 if (($seller_in_cee && $buyer_in_cee)) {
7493 $isacompany = $thirdparty_buyer->isACompany();
7494 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7512 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
7513 $isacompany = $thirdparty_buyer->isACompany();
7541 if ($idprodfournprice > 0) {
7542 if (!class_exists(
'ProductFournisseur')) {
7543 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7546 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7547 return $prodprice->fourn_tva_npr;
7548 } elseif ($idprod > 0) {
7549 if (!class_exists(
'Product')) {
7550 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7553 $prod->fetch($idprod);
7554 return $prod->tva_npr;
7577 if (!is_object($thirdparty_seller)) {
7580 if (!is_object($thirdparty_buyer)) {
7585 if ($mysoc->country_code ==
'ES') {
7586 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7591 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7594 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7598 } elseif ($local == 2) {
7600 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7603 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7608 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7623function yn($yesno, $case = 1, $color = 0)
7627 $result =
'unknown';
7629 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7630 $result = $langs->trans(
'yes');
7631 if ($case == 1 || $case == 3) {
7632 $result = $langs->trans(
"Yes");
7635 $result =
'<input type="checkbox" value="1" checked disabled>';
7638 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7645 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7646 $result = $langs->trans(
"no");
7647 if ($case == 1 || $case == 3) {
7648 $result = $langs->trans(
"No");
7651 $result =
'<input type="checkbox" value="0" disabled>';
7654 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7657 $result =
img_picto(
'uncheck',
'uncheck');
7663 $classname =
'error';
7667 return '<span class="'.$classname.
'">'.$result.
'</span>';
7690function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
7692 if (empty($modulepart) && is_object(
$object)) {
7693 if (!empty(
$object->module)) {
7694 $modulepart =
$object->module;
7695 } elseif (!empty(
$object->element)) {
7696 $modulepart =
$object->element;
7703 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
7705 $arrayforoldpath[
'product'] = 2;
7708 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7709 $level = $arrayforoldpath[$modulepart];
7712 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7714 if (empty($num) && is_object(
$object)) {
7717 if (empty($alpha)) {
7718 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7720 $num = preg_replace(
'/^.*\-/i',
'', $num);
7722 $num = substr(
"000".$num, -$level);
7724 $path = substr($num, 0, 1);
7727 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7730 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7740 if (empty($withoutslash) && !empty($path)) {
7755function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
7759 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7762 if (@is_dir($dir_osencoded)) {
7770 if (!empty($dataroot)) {
7772 $dir = str_replace($dataroot.
'/',
'', $dir);
7773 $ccdir = $dataroot.
'/';
7776 $cdir = explode(
"/", $dir);
7777 $num = count($cdir);
7778 for ($i = 0; $i < $num; $i++) {
7780 $ccdir .=
'/'.$cdir[$i];
7782 $ccdir .= $cdir[$i];
7785 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7793 if (!@is_dir($ccdir_osencoded)) {
7794 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7797 $dirmaskdec = octdec((
string) $newmask);
7798 if (empty($newmask)) {
7799 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7801 $dirmaskdec |= octdec(
'0111');
7802 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7804 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7807 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7816 return ($nberr ? -$nberr : $nbcreated);
7827function dolChmod($filepath, $newmask =
'')
7831 if (!empty($newmask)) {
7832 @chmod($filepath, octdec($newmask));
7834 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7846 return '<span class="fieldrequired">*</span>';
7866function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7868 if (is_null($stringtoclean)) {
7872 if ($removelinefeed == 2) {
7873 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7875 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7880 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7881 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
7884 $temp = strip_tags($temp);
7887 $pattern =
"/<[^<>]+>/";
7894 $tempbis = str_replace(
'<>',
'', $temp);
7895 $tempbis = preg_replace($pattern,
'', $tempbis);
7897 }
while ($tempbis != $temp);
7902 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7908 if ($removelinefeed == 1) {
7909 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7913 if ($removedoublespaces) {
7914 while (strpos($temp,
" ")) {
7915 $temp = str_replace(
" ",
" ", $temp);
7919 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7920 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
7940function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7942 if (empty($allowed_tags)) {
7943 $allowed_tags = array(
7944 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7945 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7946 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7949 $allowed_tags[] =
"comment";
7951 if (!in_array(
'iframe', $allowed_tags)) {
7952 $allowed_tags[] =
"iframe";
7956 if (!in_array(
'link', $allowed_tags)) {
7957 $allowed_tags[] =
"link";
7961 $allowed_tags_string = implode(
"><", $allowed_tags);
7962 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7964 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7969 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7971 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7972 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7975 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7977 if ($cleanalsosomestyles) {
7978 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7980 if ($removeclassattribute) {
7981 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7986 if ($cleanalsojavascript) {
7987 $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);
7990 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7992 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
8013 if (is_null($allowed_attributes)) {
8014 $allowed_attributes = array(
8015 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
8017 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8021 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
8022 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
8025 $dom =
new DOMDocument(
'',
'UTF-8');
8027 $savwarning = error_reporting();
8028 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
8029 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
8030 error_reporting($savwarning);
8032 if ($dom instanceof DOMDocument) {
8033 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
8034 $el = $els->item($i);
8035 if (!$el instanceof DOMElement) {
8038 $attrs = $el->attributes;
8039 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
8041 if (!empty($attrs->item($ii)->name)) {
8042 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
8044 $els->item($i)->removeAttribute($attrs->item($ii)->name);
8045 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
8047 $valuetoclean = $attrs->item($ii)->value;
8049 if (isset($valuetoclean)) {
8051 $oldvaluetoclean = $valuetoclean;
8052 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
8053 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
8054 if ($els->item($i)->tagName ==
'a') {
8055 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
8056 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
8057 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
8061 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
8062 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8063 }
while ($oldvaluetoclean != $valuetoclean);
8066 $attrs->item($ii)->value = $valuetoclean;
8073 $return = $dom->saveHTML();
8076 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
8077 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
8078 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
8079 return trim($return);
8081 return $stringtoclean;
8098 $temp = $stringtoclean;
8099 foreach ($disallowed_tags as $tagtoremove) {
8100 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8101 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8104 if ($cleanalsosomestyles) {
8105 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8123 if ($nboflines == 1) {
8125 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8126 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8129 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8134 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8138 $text = preg_replace(
'/\n/',
'', $text);
8140 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8142 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8145 $text = strtr($text, $repTable);
8146 if ($charset ==
'UTF-8') {
8147 $pattern =
'/(<br[^>]*>)/Uu';
8150 $pattern =
'/(<br[^>]*>)/U';
8152 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8157 $lastaddediscontent = 1;
8158 while ($countline < $nboflines && isset($a[$i])) {
8159 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8160 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8161 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8163 if (!$lastaddediscontent) {
8166 $lastaddediscontent = 0;
8169 $firstline .= $a[$i];
8170 $lastaddediscontent = 1;
8176 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8178 $ret = $firstline.($adddots ?
'...' :
'');
8196function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8198 if (is_null($stringtoencode)) {
8203 return nl2br($stringtoencode, $forxml);
8205 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8219function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8221 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8226 return $stringtoencode;
8228 $out = $stringtoencode;
8232 $oldstringtoclean = $out;
8234 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8236 libxml_use_internal_errors(
false);
8237 if (LIBXML_VERSION < 20900) {
8241 libxml_disable_entity_loader(
true);
8244 $dom =
new DOMDocument();
8250 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
8252 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
8255 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8256 $out = trim($dom->saveHTML());
8259 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
8260 $out = preg_replace(
'/<\/div>$/',
'', $out);
8264 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8268 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
8271 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8277 'quote-marks' =>
false,
8278 'doctype' =>
'strict',
8279 'show-body-only' =>
true,
8280 "indent-attributes" =>
false,
8281 "vertical-space" =>
false,
8293 $out = $tidy->repairString($out, $config,
'utf8');
8300 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8305 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8308 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8312 $out = preg_replace(
'/'/i',
''', $out);
8317 $out = preg_replace_callback(
8318 '/&#(x?[0-9][0-9a-f]+;?)/i',
8323 static function ($m) {
8330 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8333 if ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
8345 $out = preg_replace(
'/'/i',
"'", $out);
8349 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8350 $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);
8351 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8352 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8353 $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);
8354 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8356 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8357 }
while ($oldstringtoclean != $out);
8364 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8365 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8366 $nblinks = count($reg[0]);
8367 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8368 $out =
'ErrorTooManyLinksIntoHTMLString';
8371 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8373 $out =
'ErrorHTMLLinksNotAllowed';
8375 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8378 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8381 if (preg_match_all($pattern, $out, $matches)) {
8383 $urls = $matches[1];
8386 foreach ($urls as $url) {
8388 echo
"Found url = ".$url .
"\n";
8391 $out =
'ErrorHTMLExternalLinksNotAllowed';
8420function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
8422 if (is_null($stringtoencode)) {
8426 $newstring = $stringtoencode;
8428 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
8429 if ($removelasteolbr) {
8430 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
8432 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
8433 $newstring = strtr($newstring, array(
'&' =>
'__and__',
'<' =>
'__lt__',
'>' =>
'__gt__',
'"' =>
'__dquot__'));
8435 $newstring = strtr($newstring, array(
'__and__' =>
'&',
'__lt__' =>
'<',
'__gt__' =>
'>',
'__dquot__' =>
'"'));
8437 if ($removelasteolbr) {
8438 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
8457 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
8458 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
8459 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
8460 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
8472 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
8473 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
8489 if ($keepsomeentities) {
8490 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
8492 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
8493 if ($keepsomeentities) {
8494 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
8510function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
8512 return htmlentities($string, $flags, $encoding, $double_encode);
8531 for ($scursor = 0; $scursor < $len; $scursor++) {
8532 $ordchar = ord($s[$scursor]);
8534 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
8537 } elseif ($ordchar > 126 && $ordchar < 160) {
8541 $out .= $s[$scursor];
8563 $arraystring = explode(
"\n", $s);
8564 $nb = count($arraystring);
8581 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8583 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8586 $text = strtr($text, $repTable);
8587 if ($charset ==
'UTF-8') {
8588 $pattern =
'/(<br[^>]*>)/Uu';
8591 $pattern =
'/(<br[^>]*>)/U';
8593 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8595 $nblines = (int) floor((count($a) + 1) / 2);
8598 foreach ($a as $line) {
8601 $line_dec = html_entity_decode($line);
8603 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8604 $nblines += substr_count($line_dec,
'\n');
8624 if (is_null($msg)) {
8629 if (preg_match(
'/<html/i', $msg)) {
8631 } elseif (preg_match(
'/<body/i', $msg)) {
8633 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8635 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8637 } elseif (preg_match(
'/<br/i', $msg)) {
8643 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8644 if (preg_match(
'/<html/i', $msg)) {
8646 } elseif (preg_match(
'/<body/i', $msg)) {
8648 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8650 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8652 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8654 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8656 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8658 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8660 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8662 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8664 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8667 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8689function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
8691 if (!empty($invert)) {
8699 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8721 global $db, $conf, $mysoc, $user, $extrafields;
8723 $substitutionarray = array();
8725 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8729 $emailsendersignature = $user->signature;
8730 $usersignature = $user->signature;
8731 $substitutionarray = array_merge($substitutionarray, array(
8732 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8736 if (is_object($user) && ($user instanceof
User)) {
8737 $substitutionarray = array_merge($substitutionarray, array(
8738 '__USER_ID__' => (
string) $user->id,
8739 '__USER_LOGIN__' => (
string) $user->login,
8740 '__USER_EMAIL__' => (
string) $user->email,
8741 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8742 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8743 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8744 '__USER_FAX__' => (
string) $user->office_fax,
8745 '__USER_LASTNAME__' => (
string) $user->lastname,
8746 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8747 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8748 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8749 '__USER_JOB__' => (string) $user->job,
8751 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8755 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8756 $substitutionarray = array_merge($substitutionarray, array(
8757 '__MYCOMPANY_NAME__' => $mysoc->name,
8758 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8759 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8760 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8761 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8762 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8763 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8764 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8765 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8766 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8767 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
8768 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
8769 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
8770 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
8771 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8772 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8773 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8774 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8775 '__MYCOMPANY_TOWN__' => $mysoc->town,
8776 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8777 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8778 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8779 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8783 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8785 $substitutionarray[
'__ID__'] =
'__ID__';
8786 $substitutionarray[
'__REF__'] =
'__REF__';
8787 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8788 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8789 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8790 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8791 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8792 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8793 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8795 if (isModEnabled(
"societe")) {
8796 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8797 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8798 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8799 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8800 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8801 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8803 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8804 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8805 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8806 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8807 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8808 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8809 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8810 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8811 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8812 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8813 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8814 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
8815 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
8816 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
8817 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
8818 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8819 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8820 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8822 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8823 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8824 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8825 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8826 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8827 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8832 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8833 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8834 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8835 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8836 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8837 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8838 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8839 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8840 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8841 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8844 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8845 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8846 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8847 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8849 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8850 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8851 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8852 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8856 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8857 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8858 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8859 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8860 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8862 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8863 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8865 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8866 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8868 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8869 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8870 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8871 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8872 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8873 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8874 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8876 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8877 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8878 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8879 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8880 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8882 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
8883 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8884 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8885 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8887 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
8888 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
8889 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8892 '@phan-var-force Adherent|Delivery $object';
8893 $substitutionarray[
'__ID__'] =
$object->id;
8894 $substitutionarray[
'__REF__'] =
$object->ref;
8895 $substitutionarray[
'__NEWREF__'] =
$object->newref;
8897 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8898 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8899 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
8900 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
8902 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day', 0, $outputlangs) :
'');
8903 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day', 0, $outputlangs) :
'');
8904 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day', 0, $outputlangs) :
'');
8907 $date_delivery =
null;
8908 if (property_exists(
$object,
'date_delivery')) {
8909 $date_delivery =
$object->date_delivery;
8910 } elseif (property_exists(
$object,
'delivery_date')) {
8911 $date_delivery =
$object->delivery_date;
8913 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day', 0, $outputlangs) :
'');
8914 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
8915 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
8916 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
8917 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
8918 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
8919 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
8920 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
8921 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
8924 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8925 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8926 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day', 0, $outputlangs) :
'');
8927 $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 :
'')) :
'');
8931 '@phan-var-force Adherent $object';
8934 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
8935 if (method_exists(
$object,
'getCivilityLabel')) {
8936 $substitutionarray[
'__MEMBER_CIVILITY__'] =
$object->getCivilityLabel();
8938 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
8939 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
8940 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8941 if (method_exists(
$object,
'getFullName')) {
8942 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
8944 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
8945 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
8946 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
8947 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
8948 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
8949 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
8950 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8951 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
8952 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
8953 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
8957 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
8958 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
8960 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
8961 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
8962 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
8963 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
8964 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
8965 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
8966 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
8967 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
8968 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
8969 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
8970 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
8974 '@phan-var-force Societe $object';
8975 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object) ?
$object->id :
'');
8976 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object) ?
$object->name :
'');
8977 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object) ?
$object->name_alias :
'');
8978 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object) ?
$object->code_client :
'');
8979 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object) ?
$object->code_fournisseur :
'');
8980 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object) ?
$object->email :
'');
8981 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object) ?
$object->email :
'');
8984 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object) ?
$object->address :
'');
8985 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object) ?
$object->zip :
'');
8986 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object) ?
$object->town :
'');
8987 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object) ?
$object->country_id :
'');
8988 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object) ?
$object->country_code :
'');
8989 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object) ?
$object->idprof1 :
'');
8990 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object) ?
$object->idprof2 :
'');
8991 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object) ?
$object->idprof3 :
'');
8992 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object) ?
$object->idprof4 :
'');
8993 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object) ?
$object->idprof5 :
'');
8994 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object) ?
$object->idprof6 :
'');
8995 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object) ?
$object->tva_intra :
'');
8998 } elseif (is_object(
$object->thirdparty)) {
8999 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->id :
'');
9000 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name :
'');
9001 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name_alias :
'');
9002 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_client :
'');
9003 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_fournisseur :
'');
9004 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9005 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9008 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->address :
'');
9009 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->zip :
'');
9010 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->town :
'');
9011 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_id :
'');
9012 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_code :
'');
9013 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof1 :
'');
9014 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof2 :
'');
9015 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof3 :
'');
9016 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof4 :
'');
9017 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof5 :
'');
9018 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof6 :
'');
9019 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->tva_intra :
'');
9024 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
9025 '@phan-var-force RecruitmentCandidature $object';
9026 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
9027 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9028 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9030 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
9031 '@phan-var-force ConferenceOrBoothAttendee $object';
9032 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
9033 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9034 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9038 '@phan-var-force Project $object';
9039 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
9040 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
9041 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
9042 } elseif (is_object(
$object)) {
9044 if (!empty(
$object->project)) {
9046 } elseif (!empty(
$object->projet)) {
9049 if (!is_null($project) && is_object($project)) {
9050 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
9051 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
9052 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
9057 $project_id =
$object->fk_project;
9058 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
9059 $project_id =
$object->fk_project;
9061 if ($project_id > 0) {
9063 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9064 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9065 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9071 '@phan-var-force Facture $object';
9072 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
9075 '@phan-var-force Expedition $object';
9076 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9077 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9078 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9081 '@phan-var-force Reception $object';
9082 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9083 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9087 '@phan-var-force Contrat $object';
9088 $dateplannedstart =
'';
9089 $datenextexpiration =
'';
9090 foreach (
$object->lines as $line) {
9091 if ($line->date_start > $dateplannedstart) {
9092 $dateplannedstart = $line->date_start;
9094 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9095 $datenextexpiration = $line->date_end;
9098 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9099 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9100 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9102 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9103 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9104 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9108 '@phan-var-force Ticket $object';
9109 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9110 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9111 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9112 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9113 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9114 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9115 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9116 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9117 $userstat =
new User($db);
9118 if (
$object->fk_user_assign > 0) {
9119 $userstat->fetch(
$object->fk_user_assign);
9120 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9123 if (
$object->fk_user_create > 0) {
9124 $userstat->fetch(
$object->fk_user_create);
9125 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9131 if (!is_object($extrafields)) {
9134 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9136 if (
$object->fetch_optionals() > 0) {
9137 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9138 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9139 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9140 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9141 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9142 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9143 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9144 $datetime =
$object->array_options[
'options_'.$key];
9145 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9146 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9147 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9148 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9149 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9150 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9151 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9152 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9153 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9154 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9155 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9156 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9164 if (empty($substitutionarray[
'__REF__'])) {
9168 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9169 $outputlangs->loadLangs(array(
'paypal',
'other'));
9172 $typeforonlinepayment =
'free';
9174 $typeforonlinepayment =
'order';
9177 $typeforonlinepayment =
'invoice';
9180 $typeforonlinepayment =
'member';
9181 if (!empty(
$object->last_subscription_amount)) {
9182 $amounttouse =
$object->last_subscription_amount;
9186 $typeforonlinepayment =
'contract';
9189 $typeforonlinepayment =
'ficheinter';
9192 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9197 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9198 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9201 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9203 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9206 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9208 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9211 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9213 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9216 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9218 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9221 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9223 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9226 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9228 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9232 '@phan-var-force Propal $object';
9233 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9234 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9235 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9238 '@phan-var-force Commande $object';
9239 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9242 '@phan-var-force Facture $object';
9243 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9246 '@phan-var-force Contrat $object';
9247 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9248 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9249 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9252 '@phan-var-force Fichinter $object';
9253 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9254 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9255 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9257 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9258 '@phan-var-force SupplierProposal $object';
9259 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9261 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9262 '@phan-var-force FactureFournisseur $object';
9263 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9266 '@phan-var-force Expedition $object';
9267 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9272 '@phan-var-force ActionComm $object';
9273 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9274 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9276 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9280 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9281 '@phan-var-force Facture|FactureRec $object';
9282 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9285 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day', 0, $outputlangs) : null) :
'';
9287 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext', 0, $outputlangs) : null) :
'';
9289 $already_payed_all = 0;
9294 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9296 $substitutionarray[
'__AMOUNT_EXCL_TAX_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ht, $outputlangs, $conf->currency,
true) :
'';
9298 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9302 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9304 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9308 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9309 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9311 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9312 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9316 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9317 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9318 $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) :
'';
9319 $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)) :
'';
9320 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9321 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9323 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9324 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9327 if ($onlykey != 2) {
9328 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9329 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9330 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9331 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9332 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9333 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9335 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9336 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9340 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9341 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9342 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9346 if ($onlykey != 2) {
9347 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9348 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
9354 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
9355 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
9365 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
9367 $substitutionarray = array_merge($substitutionarray, array(
9368 '__NOW_TMS__' => (
string) $now,
9369 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
9370 '__DAY__' => (
string) $tmp[
'mday'],
9371 '__DAY_TEXT__' => $daytext,
9372 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
9373 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
9374 '__MONTH__' => (
string) $tmp[
'mon'],
9375 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
9376 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
9377 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
9378 '__YEAR__' => (
string) $tmp[
'year'],
9379 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
9380 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
9381 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
9382 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
9383 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
9384 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
9385 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
9386 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
9387 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
9391 if (isModEnabled(
'multicompany')) {
9392 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
9394 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
9395 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
9396 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
9397 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
9398 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
9403 return $substitutionarray;
9422function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
9424 global $conf, $db, $langs;
9426 if (!is_array($substitutionarray)) {
9427 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
9430 if (empty($outputlangs)) {
9431 $outputlangs = $langs;
9441 if (is_object($outputlangs)) {
9443 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
9445 $tmp = explode(
'|', $reg[1]);
9446 if (!empty($tmp[1])) {
9447 $outputlangs->load($tmp[1]);
9450 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
9452 if (empty($converttextinhtmlifnecessary)) {
9454 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9468 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
9476 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
9477 $keyfound = $reg[1];
9479 $value =
'*****forbidden*****';
9481 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
9484 if (empty($converttextinhtmlifnecessary)) {
9486 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9499 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
9504 foreach ($substitutionarray as $key => $value) {
9505 if (!isset($value)) {
9509 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
9513 if (empty($converttextinhtmlifnecessary)) {
9514 $text = str_replace(
"$key",
"$value", $text);
9526 $text = str_replace(
"$key",
"$value", $text);
9542 $memory_object_list = array();
9543 foreach ($substitutionarray as $key => $value) {
9544 $lazy_load_arr = array();
9545 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
9546 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
9547 $key_to_substitute = $lazy_load_arr[1];
9548 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
9549 $param_arr = explode(
':', $value);
9551 if (count($param_arr) == 4) {
9552 $path = $param_arr[0];
9553 $class = $param_arr[1];
9554 $method = $param_arr[2];
9555 $id = (int) $param_arr[3];
9558 if (!isset($memory_object_list[$class])) {
9560 require_once DOL_DOCUMENT_ROOT . $path;
9561 if (class_exists($class)) {
9562 $memory_object_list[$class] = array(
9570 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
9571 if (method_exists($class, $method)) {
9572 if (!isset($memory_object_list[$class][
'list'][$id])) {
9573 $tmpobj =
new $class($db);
9575 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
9576 $memory_object_list[$class][
'list'][$id] = $tmpobj;
9579 $tmpobj = $memory_object_list[$class][
'list'][$id];
9581 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
9584 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
9610 global $conf, $user;
9612 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9617 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
9619 foreach ($dirsubstitutions as $reldir) {
9627 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
9628 foreach ($substitfiles as $substitfile) {
9630 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
9633 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
9635 require_once $dir.$substitfile[
'name'];
9637 $function_name = $module.
"_".$callfunc;
9638 if (function_exists($function_name)) {
9639 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
9647 foreach ($substitutionarray as $key => $value) {
9648 $tags .=
'{'.$key.
'} => '.$value.
"\n";
9650 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9663function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
9665 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9678function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
9684 if (!is_object($outputlangs)) {
9685 $outputlangs = $langs;
9688 if ($date_start && $date_end) {
9689 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9691 if ($date_start && !$date_end) {
9692 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9694 if (!$date_start && $date_end) {
9695 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9715 if ($nameorder < 0) {
9718 if ($nameorder == 1) {
9720 if ($firstname && $lastname) {
9724 } elseif ($nameorder == 2 || $nameorder == 3) {
9726 if (empty($ret) && $nameorder == 3) {
9731 if (empty($ret) && $nameorder == 5) {
9734 if ($nameorder == 0) {
9735 if ($firstname && $lastname) {
9759 if (!is_array($mesgs)) {
9760 $mesgs = trim((
string) $mesgs);
9763 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9766 $_SESSION[
'dol_events'][$style][] = $mesgs;
9770 foreach ($mesgs as $mesg) {
9771 $mesg = trim((
string) $mesg);
9773 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9776 $_SESSION[
'dol_events'][$style][] = $mesg;
9794function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0)
9796 if (empty($mesg) && empty($mesgs)) {
9797 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9804 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9805 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9806 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
9808 if (empty($mesgs)) {
9811 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9832 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9833 if (empty($disabledoutputofmessages)) {
9836 unset($_SESSION[
'dol_events'][
'mesgs']);
9839 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9840 if (empty($disabledoutputofmessages)) {
9843 unset($_SESSION[
'dol_events'][
'errors']);
9847 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9848 if (empty($disabledoutputofmessages)) {
9851 unset($_SESSION[
'dol_events'][
'warnings']);
9869function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
9871 global $conf, $langs;
9876 $divstart = $divend =
'';
9879 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9880 $divstart =
'<div class="'.$style.
' clearboth">';
9884 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9885 $langs->load(
"errors");
9887 if (is_array($mesgarray) && count($mesgarray)) {
9888 foreach ($mesgarray as $message) {
9890 $out .= $langs->trans($message);
9891 if ($ret < count($mesgarray)) {
9898 $out .= $langs->trans($mesgstring);
9904 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9905 $return =
'<script nonce="'.getNonce().
'">
9906 $(document).ready(function() {
9911 /* jnotify(message, preset of message type, keepmessage) */
9913 "'.($style ==
"ok" ? 3000 : $style).
'",
9914 '.($style ==
"ok" ?
"false" :
"true").
',
9915 { remove: function (){} } );
9956function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
9958 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9964 if (is_array($mesgarray)) {
9965 foreach ($mesgarray as $val) {
9966 if ($val && preg_match(
'/class="error"/i', $val)) {
9970 if ($val && preg_match(
'/class="warning"/i', $val)) {
9975 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9977 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9980 if ($style ==
'error') {
9983 if ($style ==
'warning') {
9987 if ($iserror || $iswarning) {
9989 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9990 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9991 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9993 if (is_array($mesgarray)) {
9994 $newmesgarray = array();
9995 foreach ($mesgarray as $val) {
9996 if (is_string($val)) {
9997 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9998 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9999 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
10000 $newmesgarray[] = $tmpmesgstring;
10002 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
10005 $mesgarray = $newmesgarray;
10007 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
10042function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
10045 $order = strtolower($order);
10047 if (is_array($array)) {
10048 $sizearray = count($array);
10049 if ($sizearray > 0) {
10051 foreach (array_keys($array) as $key) {
10052 if (is_object($array[$key])) {
10053 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
10056 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
10058 if ($natsort == -1) {
10059 $temp[$key] =
'___'.$temp[$key];
10063 if (empty($natsort) || $natsort == -1) {
10064 if ($order ==
'asc') {
10070 if ($case_sensitive) {
10073 natcasesort($temp);
10075 if ($order !=
'asc') {
10076 $temp = array_reverse($temp,
true);
10082 foreach (array_keys($temp) as $key) {
10083 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10102 $str = (string) $str;
10105 $strLength = strlen($str);
10106 for ($i = 0; $i < $strLength; $i++) {
10107 if (ord($str[$i]) < 0x80) {
10109 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10111 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10113 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10115 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10117 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10122 for ($j = 0; $j < $n; $j++) {
10123 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10144 return preg_match(
'//u', $str) ? true :
false;
10156 if (function_exists(
'mb_check_encoding')) {
10158 if (!mb_check_encoding($str,
'ASCII')) {
10162 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10180 $tmp = ini_get(
"unicode.filesystem_encoding");
10181 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10182 $tmp =
'iso-8859-1';
10191 if ($tmp ==
'iso-8859-1') {
10192 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10213function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
10223 if ($useCache && isset($conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10224 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10227 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10229 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10230 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10231 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10232 if (!empty($entityfilter)) {
10233 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10239 $resql = $db->query($sql);
10241 $obj = $db->fetch_object($resql);
10244 $valuetoget = $obj->valuetoget;
10245 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
10247 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10251 return $valuetoget;
10268 if ($matchrule == 1) {
10269 if ($var ==
'mainmenu') {
10271 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10272 } elseif ($var ==
'leftmenu') {
10274 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10276 return 'This variable is not accessible with dol_eval';
10279 return 'This value for matchrule is not implemented';
10293function verifCond($strToEvaluate, $onlysimplestring =
'1')
10297 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10300 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10301 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10321function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10325 global $db, $langs, $user, $website, $websitepage;
10326 global $action, $mainmenu, $leftmenu;
10328 global $objectoffield;
10334 $isObBufferActive =
false;
10335 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
10336 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
10341 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
10347 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
10348 if ($onlysimplestring ==
'2') {
10349 $specialcharsallowed .=
'[]';
10352 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
10354 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
10355 if ($returnvalue) {
10356 return 'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s;
10358 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s, LOG_WARNING);
10364 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
10365 if ($returnvalue) {
10366 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;
10368 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);
10376 while ($scheck && $savescheck != $scheck) {
10377 $savescheck = $scheck;
10378 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10379 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
10380 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
10381 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10382 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10383 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
10386 if (strpos($scheck,
'(') !==
false) {
10387 if ($returnvalue) {
10388 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
10390 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);
10399 if (is_array($s) || $s ===
'Array') {
10400 if ($returnvalue) {
10401 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
10403 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
10407 if (strpos($s,
'::') !==
false) {
10408 if ($returnvalue) {
10409 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
10411 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s, LOG_WARNING);
10415 if (strpos($s,
'`') !==
false) {
10416 if ($returnvalue) {
10417 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
10419 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
10423 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
10424 if ($returnvalue) {
10425 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
10427 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
10433 $forbiddenphpstrings = array(
'$$',
'$_',
'}[');
10434 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
10436 $forbiddenphpfunctions = array();
10438 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
10439 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
10440 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
10441 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
10442 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
10443 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
10444 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
10445 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
10446 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
10447 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
10449 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
10451 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
10453 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
10456 $oldstringtoclean = $s;
10457 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
10458 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
10459 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
10461 }
while ($oldstringtoclean != $s);
10464 if (strpos($s,
'__forbiddenstring__') !==
false) {
10465 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
10466 if ($returnvalue) {
10467 return 'Bad string syntax to evaluate: '.$s;
10469 dol_syslog(
'Bad string syntax to evaluate: '.$s);
10475 if ($returnvalue) {
10478 $isObBufferActive =
true;
10479 $tmps = @eval(
'return '.$s.
';');
10480 $tmpo = ob_get_clean();
10481 $isObBufferActive =
false;
10483 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10488 $isObBufferActive =
true;
10489 $tmps = eval(
'return '.$s.
';');
10490 $tmpo = ob_get_clean();
10491 $isObBufferActive =
false;
10493 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10498 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
10506 }
catch (Error $e) {
10507 if ($isObBufferActive) {
10509 $tmpo = ob_get_clean();
10510 $isObBufferActive =
false;
10512 $error =
'dol_eval try/catch error : ';
10513 $error .= $e->getMessage();
10515 if ($returnvalue) {
10516 return 'Exception during evaluation: '.$s;
10532 return (trim($element) !=
'');
10545 if (empty($codelang)) {
10549 if ($codelang ==
'auto') {
10550 return '<span class="fa fa-language"></span>';
10553 $langtocountryflag = array(
10555 'ca_ES' =>
'catalonia',
10559 'sw_SW' =>
'unknown',
10569 if (isset($langtocountryflag[$codelang])) {
10570 $flagImage = $langtocountryflag[$codelang];
10572 $tmparray = explode(
'_', $codelang);
10573 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
10578 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
10579 $morecss = $reg[1];
10584 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
10598 if (empty($countrycode)) {
10602 if (strtoupper($countrycode) ==
'MQ') {
10605 if (strtoupper($countrycode) ==
'SE') {
10608 if (strtoupper($countrycode) ==
'CH') {
10609 if ($mysoc->country_code ==
'FR') {
10612 if ($mysoc->country_code ==
'DE') {
10615 if ($mysoc->country_code ==
'IT') {
10797 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10798 if (in_array($buildprimarykeytotest, $locales)) {
10799 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10802 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10803 foreach ($locales as $locale) {
10804 $locale_language = locale_get_primary_language($locale);
10805 $locale_region = locale_get_region($locale);
10806 if (strtoupper($countrycode) == $locale_region) {
10808 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10812 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
10850 global $hookmanager, $db;
10852 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10853 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10854 $values = explode(
':', $value);
10857 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10862 $posstart = strpos($str,
'(');
10863 if ($posstart > 0) {
10864 $posend = strpos($str,
')');
10865 if ($posstart > 0) {
10866 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
10867 if (is_numeric($res1)) {
10868 $postab = (int) $res1;
10869 $values[1] =
'+' . substr($str, $posend + 1);
10873 if (count($values) == 6) {
10877 if ($values[0] != $type) {
10883 if ($filterorigmodule) {
10884 if (strpos($values[3],
'@')) {
10885 if ($filterorigmodule !=
'external') {
10889 if ($filterorigmodule !=
'core') {
10894 $langs->load($values[3]);
10896 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10898 $substitutionarray = array();
10903 $labeltemp = explode(
',', $values[2]);
10904 $label = $langs->trans($labeltemp[0]);
10906 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
10908 $classtoload = $labeltemp[1];
10909 if (class_exists($classtoload)) {
10910 $obj =
new $classtoload($db);
10911 $function = $labeltemp[3];
10912 if ($obj && $function && method_exists($obj, $function)) {
10914 $nbrec = $obj->$function(
$object->id, $obj);
10915 if (!empty($nbrec)) {
10916 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10924 $newtab[1] = $label;
10925 $newtab[2] = str_replace(
'+',
'', $values[1]);
10930 } elseif (count($values) == 5) {
10931 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10933 if ($values[0] != $type) {
10937 if ($filterorigmodule) {
10938 if (strpos($values[3],
'@')) {
10939 if ($filterorigmodule !=
'external') {
10943 if ($filterorigmodule !=
'core') {
10948 $langs->load($values[3]);
10950 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10951 $substitutionarray = array();
10955 $label = $langs->trans($values[2]);
10959 $newtab[1] = $label;
10960 $newtab[2] = str_replace(
'+',
'', $values[1]);
10964 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10965 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10966 if ($values[0] != $type) {
10969 $tabname = str_replace(
'-',
'', $values[1]);
10970 foreach ($head as $key => $val) {
10971 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
10973 if ($head[$key][2] == $tabname && $condition) {
10974 unset($head[$key]);
10983 if (!empty($hookmanager)) {
10984 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
10985 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
10986 if ($reshook > 0) {
10987 $head = $hookmanager->resArray;
10989 $head = array_merge($head, $hookmanager->resArray);
11008 global $conf, $hookmanager, $user, $langs;
11011 global $micro_start_time;
11013 if ($zone ==
'private') {
11014 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
11016 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
11020 print
"\n<!-- A div to store page_y POST parameter -->\n";
11021 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
11023 $parameters = array();
11024 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
11025 if (empty($reshook)) {
11031 if (!empty($conf->use_javascript_ajax)) {
11032 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
11033 print
'<script>'.
"\n";
11034 print
'jQuery(document).ready(function() {'.
"\n";
11036 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
11038 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
11039 print
'jQuery("li.menuhider").click(function(event) {';
11040 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
11041 print
' console.log("We click on .menuhider");'.
"\n";
11042 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
11047 if ($action ==
'create' || $action ==
'add' || $action ==
'edit' || (empty($action) && (preg_match(
'/new\.php/', $_SERVER[
"PHP_SELF"]))) || ((empty($action) || $action ==
'addline') && (preg_match(
'/card\.php/', $_SERVER[
"PHP_SELF"])))) {
11048 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
11049 $relativepathstring = $_SERVER[
"PHP_SELF"];
11051 if (constant(
'DOL_URL_ROOT')) {
11052 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
11054 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
11055 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
11058 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
11059 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
11061 if ($defkey !=
'_noquery_') {
11062 $tmpqueryarraytohave = explode(
'&', $defkey);
11064 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11065 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
11067 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
11071 if (!$foundintru) {
11080 print
'console.log("set the focus by executing jQuery(...).focus();")'.
"\n";
11081 foreach ($defval as $paramkey => $paramval) {
11083 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
11084 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // TODO KO with ckeditor
11085 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
11090 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
11091 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
11093 if ($defkey != '_noquery_') {
11094 $tmpqueryarraytohave = explode('&', $defkey);
11096 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11097 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
11098 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
11099 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
11103 if (!$foundintru) {
11106 //var_dump($defkey.'-'.$qualified);
11112 print 'console.log("set the js code to manage fields that are
set as mandatory
");'."\n
";
11114 foreach ($defval as $paramkey => $paramval) {
11115 // Solution 1: Add handler on submit to check if mandatory fields are empty
11116 print 'var form = $(\'#'.dol_escape_js($paramkey).'\').closest("form
");'."\n
";
11117 print "form.on(
'submit',
function(event) {
11118 var submitter = $(
this).find(
':submit:focus').get(0);
11120 var buttonName = $(submitter).attr(
'name');
11121 if (buttonName ==
'cancel') {
11122 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
11127 console.log(
'We did not click on cancel button but on something else, we check that field #".dol_escape_js($paramkey)." is not empty');
11129 var tmpvalue = jQuery(
'#".dol_escape_js($paramkey)."').val();
11130 let tmptypefield = jQuery(
'#".dol_escape_js($paramkey)."').prop(
'nodeName').toLowerCase();
11132 if (tmptypefield ==
'textarea') {
11134 var tmpeditor = CKEDITOR.instances[
'".dol_escape_js($paramkey)."'];
11136 tmpvalue = tmpeditor.getData();
11137 console.log(
'For textarea tmpvalue is '+tmpvalue);
11141 let tmpvalueisempty =
false;
11142 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'') {
11143 tmpvalueisempty =
true;
11145 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
11146 tmpvalueisempty =
true;
11148 if (tmpvalueisempty && (buttonName ==
'save')) {
11149 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
11150 event.preventDefault();
11151 event.stopPropagation();
11152 alert(
'".dol_escape_js($langs->trans("ErrorFieldRequired", $paramkey).' (
'.$langs->trans("CustomMandatoryFieldRule").')
')."');
11155 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
11160 // Solution 2: Add property 'required' on input
11161 // so browser will check value and try to focus on it when submitting the form.
11162 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
11163 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11164 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11165 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
11166 //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
";
11167 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
11173 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");'.
"\n";
11178 print
'jQuery("input[name=\'cancel\']").click(function() {
11179 console.log("We click on cancel button so removed all required attribute");
11180 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
11190 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
11192 print
"/* JS CODE TO ENABLE to add memory info */\n";
11193 print
'window.console && console.log("';
11198 if (!empty($micro_start_time)) {
11199 $micro_end_time = microtime(
true);
11200 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
11203 if (function_exists(
"memory_get_usage")) {
11204 print
' - Mem: '.memory_get_usage();
11206 if (function_exists(
"memory_get_peak_usage")) {
11207 print
' - Real mem peak: '.memory_get_peak_usage(
true);
11209 if (function_exists(
"zend_loader_file_encoded")) {
11210 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
11215 print
"\n".
'</script>'.
"\n";
11221 foreach ($tmptagarray as $tmptag) {
11223 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
11225 <!-- Global site tag (gtag.js) - Google Analytics -->
11226 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
11228 window.dataLayer = window.dataLayer || [];
11229 function gtag(){dataLayer.push(arguments);}
11230 gtag(\'js\', new Date());
11232 gtag(\'config\', \''.trim($tmptag).
'\');
11239 // Add Xdebug coverage of code
11240 if (defined('XDEBUGCOVERAGE
')) {
11241 print_r(xdebug_get_code_coverage());
11244 // Add DebugBar data
11245 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
11246 if (isset($debugbar['time
'])) {
11247 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
11248 $debugbar['time
']->stopMeasure('pageaftermaster
');
11250 print '<!-- Output debugbar data -->
'."\n";
11251 $renderer = $debugbar->getJavascriptRenderer();
11252 print $renderer->render();
11253 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
11255 print "<!-- Start of log output\n";
11256 //print '<div
class=
"hidden">
'."\n";
11257 foreach ($conf->logbuffer as $logline) {
11258 print $logline."<br>\n";
11260 //print '</div>
'."\n";
11261 print "End of log output -->\n";
11275function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
11277 if (is_null($string)) {
11281 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
11282 // This is a regex string
11283 $newdelimiter = $delimiter;
11285 // This is a simple string
11286 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
11287 $newdelimiter = preg_quote($delimiter, '/
');
11290 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
11292 foreach ($a as $s) { // each part
11294 if ($pos = strpos($s, $kv)) { // key/value delimiter
11295 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
11296 } else { // key delimiter not found
11314function dol_set_focus($selector)
11316 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
11317 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
11328function dol_getmypid()
11330 if (!function_exists('getmypid
')) {
11331 return mt_rand(99900000, 99965535);
11333 return getmypid(); // May be a number on 64 bits (depending on OS)
11359function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
11361 global $db, $langs;
11363 $value = trim($value);
11366 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
11369 $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
11372 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
11374 //natural mode search type 3 allow spaces into search ...
11375 if ($mode == 3 || $mode == -3) {
11376 $crits = explode(',
', $value);
11378 $crits = explode(' ', $value);
11381 if (!is_array($fields)) {
11382 $fields = array($fields);
11385 $i1 = 0; // count the nb of and criteria added (all fields / criteria)
11386 foreach ($crits as $crit) { // Loop on each AND criteria
11387 $crit = trim($crit);
11388 $i2 = 0; // count the nb of valid criteria added for this this first criteria
11390 foreach ($fields as $field) {
11392 $tmpcrits = explode('|
', $crit);
11393 $i3 = 0; // count the nb of valid criteria added for this current field
11394 foreach ($tmpcrits as $tmpcrit) {
11395 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11398 $tmpcrit = trim($tmpcrit);
11400 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11403 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
11406 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
11407 if (!empty($reg[1])) {
11408 $operator = $reg[1];
11410 if ($newcrit != '') {
11411 $numnewcrit = price2num($newcrit);
11412 if (is_numeric($numnewcrit)) {
11413 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
11415 $newres .= '1 = 2
'; // force false, we received a corrupted data
11417 $i3++; // a criteria was added to string
11420 $i2++; // a criteria for 1 more field was added to string
11421 } elseif ($mode == 2 || $mode == -2) {
11422 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
11423 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
11424 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
11426 $newres .= ' OR
'.$field.' IS NULL
';
11428 $i2++; // a criteria for 1 more field was added to string
11429 } elseif ($mode == 3 || $mode == -3) {
11430 $tmparray = explode(',
', $crit);
11431 if (count($tmparray)) {
11433 foreach ($tmparray as $val) {
11436 $listofcodes .= ($listofcodes ? ',
' : '');
11437 $listofcodes .= "'".$db->escape($val)."'";
11440 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1, 0, 1).")";
11441 $i2++; // a criteria for 1 more field was added to string
11444 $newres .= ' OR
'.$field.' IS NULL
';
11446 } elseif ($mode == 4) {
11447 $tmparray = explode(',
', $crit);
11448 if (count($tmparray)) {
11450 foreach ($tmparray as $val) {
11453 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
11454 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
11455 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
11456 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
11458 $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)
11462 } else { // $mode=0
11463 $tmpcrits = explode('|
', $crit);
11464 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
11465 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
11466 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11469 $tmpcrit = trim($tmpcrit);
11471 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
11472 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
11474 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11477 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
11478 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
11480 $tmpcrit2 = $tmpcrit;
11485 if (preg_match('/^!/
', $tmpcrit)) {
11486 $tmps .= $field." NOT LIKE "; // ! as exclude character
11487 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
11489 $tmps .= $field." LIKE ";
11493 if (preg_match('/^[\^\$]/', $tmpcrit)) {
11495 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
11497 if (preg_match('/[\^\$]$/', $tmpcrit)) {
11499 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
11502 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
11506 $newres .= $tmpbefore;
11507 $newres .= $db->escape($tmpcrit2);
11508 $newres .= $tmpafter;
11510 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
11511 $newres .= " OR ".$field." IS NULL)";
11518 $i2++; // a criteria for 1 more field was added to string
11523 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
11527 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
11538function showDirectDownloadLink($object)
11540 global $conf, $langs;
11543 $url = $object->getLastMainDocLink($object->element);
11545 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
11547 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
11548 $out .= ajax_autoselect("directdownloadlink", 0);
11550 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
11564function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
11566 $dirName = dirname($file);
11567 if ($dirName == '.
') {
11571 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
11572 $fileName = basename($fileName);
11574 if (empty($extImgTarget)) {
11575 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
11577 if (empty($extImgTarget)) {
11578 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
11580 if (empty($extImgTarget)) {
11581 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
11583 if (empty($extImgTarget)) {
11584 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
11586 if (empty($extImgTarget)) {
11587 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
11589 if (empty($extImgTarget)) {
11590 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
11593 if (!$extImgTarget) {
11599 $subdir = 'thumbs/
';
11602 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
11615function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
11617 global $conf, $langs;
11619 if (empty($conf->use_javascript_ajax)) {
11623 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
11625 if ($alldata == 1) {
11626 if ($isAllowedForPreview) {
11627 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));
11633 // old behavior, return a string
11634 if ($isAllowedForPreview) {
11635 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
11636 $title = $langs->transnoentities("Preview");
11637 //$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().
11638 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg"); // An example of tmpurl that should be blocked by the dol_escape_uri()
11640 // 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,
11641 // 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.
11658function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
11661 $out = '<script nonce=
"'.getNonce().'">
11662 jQuery(document).ready(
function () {
11663 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
11667 if ($textonlink === 'image
') {
11668 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
11670 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
11683function dolIsAllowedForPreview($file)
11685 // Check .noexe extension in filename
11686 if (preg_match('/\.noexe$/i
', $file)) {
11690 // Check mime types
11691 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
11692 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
11693 $mime_preview[] = 'svg+xml
';
11695 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
11696 //$mime_preview[]='archive
';
11697 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
11698 if ($num_mime !== false) {
11702 // By default, not allowed for preview
11716function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
11719 $imgmime = 'other.png
';
11720 $famime = 'file-o
';
11723 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
11725 // Plain text files
11726 if (preg_match('/\.txt$/i
', $tmpfile)) {
11727 $mime = 'text/plain
';
11728 $imgmime = 'text.png
';
11729 $famime = 'file-alt
';
11730 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
11731 $mime = 'text/richtext
';
11732 $imgmime = 'text.png
';
11733 $famime = 'file-alt
';
11734 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
11735 $mime = 'text/csv
';
11736 $imgmime = 'text.png
';
11737 $famime = 'file-csv
';
11738 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
11739 $mime = 'text/tab-separated-values
';
11740 $imgmime = 'text.png
';
11741 $famime = 'file-alt
';
11742 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
11743 $mime = 'text/plain
';
11744 $imgmime = 'text.png
';
11745 $famime = 'file-alt
';
11746 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
11747 $mime = 'text/plain
';
11748 $imgmime = 'text.png
';
11750 $famime = 'file-alt
';
11751 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
11752 $mime = 'text/plain
';
11753 $imgmime = 'text.png
';
11755 $famime = 'file-alt
';
11756 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
11757 $mime = 'text/css
';
11758 $imgmime = 'css.png
';
11760 $famime = 'file-alt
';
11761 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
11762 $mime = 'text/plain
';
11763 $imgmime = 'text.png
';
11765 $famime = 'file-alt
';
11766 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11767 $mime = 'text/plain
';
11768 $imgmime = 'text.png
';
11769 $famime = 'file-alt
';
11770 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11771 $mime = 'text/html
';
11772 $imgmime = 'html.png
';
11774 $famime = 'file-alt
';
11775 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11776 $mime = 'text/xml
';
11777 $imgmime = 'other.png
';
11779 $famime = 'file-alt
';
11780 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11781 $mime = 'text/xml
';
11782 $imgmime = 'other.png
';
11784 $famime = 'file-alt
';
11785 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11786 $mime = 'text/plain
';
11787 $imgmime = 'text.png
';
11789 $famime = 'file-code
';
11790 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11791 $mime = 'text/plain
';
11792 $imgmime = 'text.png
';
11794 $famime = 'file-code
';
11795 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11796 $mime = 'text/plain
';
11797 $imgmime = 'text.png
';
11799 $famime = 'file-code
';
11800 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11801 $mime = 'text/plain
';
11802 $imgmime = 'text.png
';
11804 $famime = 'file-code
';
11805 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11806 $mime = 'text/plain
';
11807 $imgmime = 'text.png
';
11809 $famime = 'file-code
';
11810 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11811 $mime = 'text/plain
';
11812 $imgmime = 'text.png
';
11814 $famime = 'file-code
';
11815 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11816 $mime = 'text/plain
';
11817 $imgmime = 'php.png
';
11819 $famime = 'file-code
';
11820 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11821 $mime = 'text/plain
';
11822 $imgmime = 'php.png
';
11824 $famime = 'file-code
';
11825 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11826 $mime = 'text/plain
';
11827 $imgmime = 'pl.png
';
11829 $famime = 'file-code
';
11830 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11831 $mime = 'text/plain
';
11832 $imgmime = 'text.png
';
11834 $famime = 'file-code
';
11835 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11836 $mime = 'text/x-javascript
';
11837 $imgmime = 'jscript.png
';
11839 $famime = 'file-code
';
11840 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11841 $mime = 'application/vnd.oasis.opendocument.presentation
';
11842 $imgmime = 'ooffice.png
';
11843 $famime = 'file-powerpoint
';
11844 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11845 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11846 $imgmime = 'ooffice.png
';
11847 $famime = 'file-excel
';
11848 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11849 $mime = 'application/vnd.oasis.opendocument.text
';
11850 $imgmime = 'ooffice.png
';
11851 $famime = 'file-word
';
11852 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11853 $mime = 'application/msaccess
';
11854 $imgmime = 'mdb.png
';
11856 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11857 $mime = 'application/msword
';
11858 $imgmime = 'doc.png
';
11859 $famime = 'file-word
';
11860 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11861 $mime = 'application/msword
';
11862 $imgmime = 'doc.png
';
11863 $famime = 'file-word
';
11864 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11865 $mime = 'application/vnd.ms-excel
';
11866 $imgmime = 'xls.png
';
11867 $famime = 'file-excel
';
11868 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11869 $mime = 'application/vnd.ms-excel
';
11870 $imgmime = 'xls.png
';
11871 $famime = 'file-excel
';
11872 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11873 $mime = 'application/vnd.ms-excel
';
11874 $imgmime = 'xls.png
';
11875 $famime = 'file-excel
';
11876 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11877 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11878 $imgmime = 'xls.png
';
11879 $famime = 'file-excel
';
11880 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11881 $mime = 'application/vnd.ms-powerpoint
';
11882 $imgmime = 'ppt.png
';
11883 $famime = 'file-powerpoint
';
11884 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11885 $mime = 'application/x-mspowerpoint
';
11886 $imgmime = 'ppt.png
';
11887 $famime = 'file-powerpoint
';
11888 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11889 $mime = 'application/pdf
';
11890 $imgmime = 'pdf.png
';
11891 $famime = 'file-pdf
';
11892 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11893 $mime = 'text/x-bat
';
11894 $imgmime = 'script.png
';
11896 $famime = 'file-code
';
11897 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11898 $mime = 'text/x-sh
';
11899 $imgmime = 'script.png
';
11901 $famime = 'file-code
';
11902 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11903 $mime = 'text/x-ksh
';
11904 $imgmime = 'script.png
';
11906 $famime = 'file-code
';
11907 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11908 $mime = 'text/x-bash
';
11909 $imgmime = 'script.png
';
11911 $famime = 'file-code
';
11912 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11913 $mime = 'image/x-
icon';
11914 $imgmime = 'image.png
';
11915 $famime = 'file-image
';
11916 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11917 $mime = 'image/jpeg
';
11918 $imgmime = 'image.png
';
11919 $famime = 'file-image
';
11920 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11921 $mime = 'image/png
';
11922 $imgmime = 'image.png
';
11923 $famime = 'file-image
';
11924 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11925 $mime = 'image/gif
';
11926 $imgmime = 'image.png
';
11927 $famime = 'file-image
';
11928 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11929 $mime = 'image/bmp
';
11930 $imgmime = 'image.png
';
11931 $famime = 'file-image
';
11932 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11933 $mime = 'image/tiff
';
11934 $imgmime = 'image.png
';
11935 $famime = 'file-image
';
11936 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11937 $mime = 'image/svg+xml
';
11938 $imgmime = 'image.png
';
11939 $famime = 'file-image
';
11940 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11941 $mime = 'image/webp
';
11942 $imgmime = 'image.png
';
11943 $famime = 'file-image
';
11944 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11945 $mime = 'text/calendar
';
11946 $imgmime = 'other.png
';
11947 $famime = 'file-alt
';
11948 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11949 $mime = 'text/calendar
';
11950 $imgmime = 'other.png
';
11951 $famime = 'file-alt
';
11952 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11953 $mime = 'application/x-bittorrent
';
11954 $imgmime = 'other.png
';
11955 $famime = 'file-o
';
11956 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11958 $imgmime = 'audio.png
';
11959 $famime = 'file-audio
';
11960 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11961 $mime = 'video/mp4
';
11962 $imgmime = 'video.png
';
11963 $famime = 'file-video
';
11964 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11965 $mime = 'video/ogg
';
11966 $imgmime = 'video.png
';
11967 $famime = 'file-video
';
11968 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11969 $mime = 'video/webm
';
11970 $imgmime = 'video.png
';
11971 $famime = 'file-video
';
11972 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11973 $mime = 'video/x-msvideo
';
11974 $imgmime = 'video.png
';
11975 $famime = 'file-video
';
11976 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11977 $mime = 'video/divx
';
11978 $imgmime = 'video.png
';
11979 $famime = 'file-video
';
11980 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
11981 $mime = 'video/xvid
';
11982 $imgmime = 'video.png
';
11983 $famime = 'file-video
';
11984 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
11986 $imgmime = 'video.png
';
11987 $famime = 'file-video
';
11988 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
11989 // application/xxx where zzz is zip, ...
11991 $imgmime = 'archive.png
';
11992 $famime = 'file-archive
';
11993 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
11994 $mime = 'application/octet-stream
';
11995 $imgmime = 'other.png
';
11996 $famime = 'file-o
';
11997 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
11999 $imgmime = 'library.png
';
12000 $famime = 'file-o
';
12001 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
12003 $imgmime = 'error.png
';
12004 $famime = 'file-alt
';
12007 // Return mimetype string
12008 switch ((int) $mode) {
12010 $tmp = explode('/
', $mime);
12011 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
12033function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
12037 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
12039 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
12041 if (is_null($dictvalues)) {
12042 $dictvalues = array();
12044 $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
12045 if ($checkentity) {
12046 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
12049 $resql = $db->query($sql);
12051 while ($obj = $db->fetch_object($resql)) {
12052 $dictvalues[$obj->$rowidfield] = $obj;
12058 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
12061 if (!empty($dictvalues[$id])) {
12063 $tmp = $dictvalues[$id];
12064 return (property_exists($tmp, $field) ? $tmp->$field :
'');
12079 $stringcolor = str_replace(
'#',
'', $stringcolor);
12081 if (!empty($stringcolor)) {
12083 $tmp = explode(
',', $stringcolor);
12084 if (count($tmp) > 1) {
12089 $hexr = $stringcolor[0].$stringcolor[1];
12090 $hexg = $stringcolor[2].$stringcolor[3];
12091 $hexb = $stringcolor[4].$stringcolor[5];
12092 $r = hexdec($hexr);
12093 $g = hexdec($hexg);
12094 $b = hexdec($hexb);
12096 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
12097 if ($bright > 0.6) {
12118 if (empty($menuentry[
'enabled'])) {
12121 if ($type_user && $menuentry[
'module']) {
12122 $tmploops = explode(
'|', $menuentry[
'module']);
12124 foreach ($tmploops as $tmploop) {
12125 if (in_array($tmploop, $listofmodulesforexternal)) {
12134 if (!$menuentry[
'perms'] && $type_user) {
12140 if (!$menuentry[
'perms']) {
12155 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
12156 return (
int) $result;
12170function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
12172 $csstouse =
'badge';
12173 $csstouse .= (!empty($mode) ?
' badge-'.$mode :
'');
12174 $csstouse .= (!empty($type) ?
' badge-'.$type :
'');
12175 $csstouse .= (empty($params[
'css']) ?
'' :
' '.$params[
'css']);
12178 'class' => $csstouse
12181 if (empty($html)) {
12185 if (!empty($url)) {
12186 $attr[
'href'] = $url;
12189 if ($mode ===
'dot') {
12190 $attr[
'class'] .=
' classfortooltip';
12191 $attr[
'title'] = $html;
12192 $attr[
'aria-label'] = $label;
12197 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12198 foreach ($params[
'attr'] as $key => $value) {
12199 if ($key ==
'class') {
12200 $attr[
'class'] .=
' '.$value;
12201 } elseif ($key ==
'classOverride') {
12202 $attr[
'class'] = $value;
12204 $attr[$key] = $value;
12212 $attr = array_map(
'dol_escape_htmltag', $attr);
12214 $TCompiledAttr = array();
12215 foreach ($attr as $key => $value) {
12216 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12219 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
12221 $tag = !empty($url) ?
'a' :
'span';
12223 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
12239function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
12244 $dolGetBadgeParams = array();
12246 if (!empty($params[
'badgeParams'])) {
12247 $dolGetBadgeParams = $params[
'badgeParams'];
12251 if ($displayMode == 0) {
12252 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
12253 } elseif ($displayMode == 1) {
12254 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12258 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
12259 $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>' :
'');
12262 if (!empty($conf->dol_optimize_smallscreen)) {
12263 if ($displayMode == 0) {
12265 } elseif ($displayMode == 4) {
12267 } elseif ($displayMode == 6) {
12273 $statusImg = array(
12274 'status0' =>
'statut0',
12275 'status1' =>
'statut1',
12276 'status2' =>
'statut2',
12277 'status3' =>
'statut3',
12278 'status4' =>
'statut4',
12279 'status5' =>
'statut5',
12280 'status6' =>
'statut6',
12281 'status7' =>
'statut7',
12282 'status8' =>
'statut8',
12283 'status9' =>
'statut9'
12286 if (!empty($statusImg[$statusType])) {
12287 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
12289 $htmlImg =
img_picto($statusLabel, $statusType);
12292 if ($displayMode === 2) {
12293 $return = $htmlImg.
' '.$htmlLabelShort;
12294 } elseif ($displayMode === 3) {
12295 $return = $htmlImg;
12296 } elseif ($displayMode === 4) {
12297 $return = $htmlImg.
' '.$htmlLabel;
12298 } elseif ($displayMode === 5) {
12299 $return = $htmlLabelShort.
' '.$htmlImg;
12301 $return = $htmlLabel.
' '.$htmlImg;
12305 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12307 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
12308 if (empty($dolGetBadgeParams[
'attr'][
'title'])) {
12309 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
12311 $dolGetBadgeParams[
'attr'][
'class'] .=
' classfortooltip';
12313 $dolGetBadgeParams[
'attr'][
'title'] =
dol_htmlentitiesbr($dolGetBadgeParams[
'attr'][
'title'], 1);
12316 if ($displayMode == 3) {
12317 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
12318 } elseif ($displayMode === 5) {
12319 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
12321 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
12367function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
12369 global $hookmanager, $action,
$object, $langs;
12372 if (is_array($url)) {
12374 foreach ($url as $key => $subbutton) {
12375 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
12382 if (isset($params[
"areDropdownButtons"]) && $params[
"areDropdownButtons"] ===
false) {
12383 foreach ($url as $button) {
12384 if (!empty($button[
'lang'])) {
12385 $langs->load($button[
'lang']);
12387 $label = $langs->trans($button[
'label']);
12388 $text = $button[
'text'] ??
'';
12389 $actionType = $button[
'actionType'] ??
'';
12390 $tmpUrl = DOL_URL_ROOT.$button[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12391 $id = $button[
'id'] ??
'';
12392 $userRight = $button[
'perm'] ?? 1;
12393 $button[
'params'] = $button[
'params'] ?? [];
12395 $out .=
dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button[
'params']);
12400 if (count($url) > 1) {
12401 $out .=
'<div class="dropdown inline-block dropdown-holder">';
12402 $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>';
12403 $out .=
'<div class="dropdown-content">';
12404 foreach ($url as $subbutton) {
12405 if (!empty($subbutton[
'lang'])) {
12406 $langs->load($subbutton[
'lang']);
12409 if (!empty($subbutton[
'urlraw'])) {
12410 $tmpurl = $subbutton[
'urlraw'];
12412 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12416 $subbuttonparam = array();
12417 if (!empty($subbutton[
'attr'])) {
12418 $subbuttonparam[
'attr'] = $subbutton[
'attr'];
12420 $subbuttonparam[
'isDropDown'] = (empty($params[
'isDropDown']) ? ($subbutton[
'isDropDown']??
false) : $params[
'isDropDown']);
12422 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl, $subbutton[
'id'] ??
'', $subbutton[
'perm'], $subbuttonparam);
12427 foreach ($url as $subbutton) {
12428 if (!empty($subbutton[
'lang'])) {
12429 $langs->load($subbutton[
'lang']);
12432 if (!empty($subbutton[
'urlraw'])) {
12433 $tmpurl = $subbutton[
'urlraw'];
12435 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12439 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], $params);
12448 if (!empty($params[
'isDropdown']) || !empty($params[
'isDropDown'])) {
12449 $class =
"dropdown-item";
12451 $class =
'butAction';
12452 if ($actionType ==
'danger' || $actionType ==
'delete') {
12453 $class =
'butActionDelete';
12454 if (!empty($url) && strpos($url,
'token=') ===
false) {
12455 $url .=
'&token='.newToken();
12461 'href' => empty($url) ?
'' : $url,
12465 if (empty($text)) {
12467 $attr[
'title'] =
'';
12469 $attr[
'title'] = $label;
12470 $attr[
'aria-label'] = $label;
12473 if (empty($userRight)) {
12474 $attr[
'class'] =
'butActionRefused';
12475 $attr[
'href'] =
'';
12476 $attr[
'title'] = (($label && $text && $label != $text) ? $label :
'');
12477 $attr[
'title'] = ($attr[
'title'] ? $attr[
'title'].
'<br>' :
'').$langs->trans(
'NotEnoughPermissions');
12485 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12486 foreach ($params[
'attr'] as $key => $value) {
12487 if ($key ==
'class') {
12488 $attr[
'class'] .=
' '.$value;
12489 } elseif ($key ==
'classOverride') {
12490 $attr[
'class'] = $value;
12492 $attr[$key] = $value;
12498 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12499 $attr[
'class'] .=
' classfortooltip';
12503 if ($userRight && !empty($params[
'confirm'])) {
12504 if (!is_array($params[
'confirm'])) {
12505 $params[
'confirm'] = array();
12508 if (empty($params[
'confirm'][
'url'])) {
12509 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
12513 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
12514 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
12515 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
12516 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
12517 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
12518 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
12519 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
12521 $attr[
'class'] .=
' butActionConfirm';
12524 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12525 unset($attr[
'href']);
12529 if (!empty($params[
'use_unsecured_unescapedattr'])) {
12530 if (is_array($params[
'use_unsecured_unescapedattr'])) {
12531 foreach ($attr as $attrK => $attrV) {
12532 if (in_array($attrK, $params[
'use_unsecured_unescapedattr'])) {
12539 $attr = array_map(
'dol_htmlentities', $attr);
12542 $attr = array_map(
'dolPrintHTMLForAttribute', $attr);
12545 $TCompiledAttr = array();
12546 foreach ($attr as $key => $value) {
12547 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
12550 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
12552 $tag = !empty($attr[
'href']) ?
'a' :
'span';
12555 $parameters = array(
12556 'TCompiledAttr' => $TCompiledAttr,
12557 'compiledAttributes' => $compiledAttributes,
12562 'actionType' => $actionType,
12565 'userRight' => $userRight,
12566 'params' => $params
12569 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters,
$object, $action);
12570 if ($reshook < 0) {
12574 if (empty($reshook)) {
12576 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
12578 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
12581 return $hookmanager->resPrint;
12600 $parsedUrl = parse_url($url);
12601 if ((isset($parsedUrl[
'scheme']) && in_array($parsedUrl[
'scheme'], [
'javascript',
'mailto',
'tel'])) || strpos($url,
'#') === 0) {
12605 if (!empty($parsedUrl[
'query'])) {
12607 parse_str($parsedUrl[
'query'], $urlQuery);
12608 if (!isset($urlQuery[
'backtopage']) && isset($params[
'backtopage'])) {
12609 $url.=
'&backtopage='.urlencode($params[
'backtopage']);
12613 if (!isset($parsedUrl[
'scheme']) && $addDolUrlRoot) {
12614 $url = DOL_URL_ROOT.$url;
12629 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
12641 if (!empty($fieldValidationErrorMsg)) {
12642 $out .=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
12643 $out .=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
12662function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
12664 global $langs, $conf, $user;
12667 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
12671 $class =
'btnTitle';
12672 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
12673 $class .=
' btnTitlePlus';
12675 $useclassfortooltip = 1;
12677 if (!empty($params[
'morecss'])) {
12678 $class .=
' '.$params[
'morecss'];
12683 'href' => empty($url) ?
'' : $url
12686 if (!empty($helpText)) {
12688 } elseif (empty($attr[
'title']) && $label) {
12689 $attr[
'title'] = $label;
12690 $useclassfortooltip = 0;
12693 if ($status == 2) {
12694 $attr[
'class'] .=
' btnTitleSelected';
12695 } elseif ($status <= 0) {
12696 $attr[
'class'] .=
' refused';
12698 $attr[
'href'] =
'';
12700 if ($status == -1) {
12701 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
12702 } elseif ($status == 0) {
12703 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
12707 if (!empty($attr[
'title']) && $useclassfortooltip) {
12708 $attr[
'class'] .=
' classfortooltip';
12716 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12717 foreach ($params[
'attr'] as $key => $value) {
12718 if ($key ==
'class') {
12719 $attr[
'class'] .=
' '.$value;
12720 } elseif ($key ==
'classOverride') {
12721 $attr[
'class'] = $value;
12723 $attr[$key] = $value;
12728 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12729 unset($attr[
'href']);
12735 $attr = array_map(
'dol_escape_htmltag', $attr);
12737 $TCompiledAttr = array();
12738 foreach ($attr as $key => $value) {
12739 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12742 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
12744 $tag = (empty($attr[
'href']) ?
'span' :
'a');
12746 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
12747 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
12748 if (!empty($params[
'forcenohideoftext'])) {
12749 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
12751 $button .=
'</'.$tag.
'>';
12767 global $conf, $db, $hookmanager;
12773 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
12776 $module = $elementType;
12777 $element = $elementType;
12778 $subelement = $elementType;
12779 $table_element = $elementType;
12782 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $elementType, $regs)) {
12783 $element = $subelement = $regs[1];
12784 $module = $regs[2];
12789 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
12790 $module = $element = $regs[1];
12791 $subelement = $regs[2];
12795 if (substr($elementType, -3) ==
'det') {
12796 $module = preg_replace(
'/det$/',
'', $element);
12797 $subelement = preg_replace(
'/det$/',
'', $subelement);
12798 $classpath = $module.
'/class';
12799 $classfile = $module;
12800 $classname = preg_replace(
'/det$/',
'Line', $element);
12801 if (in_array($module, array(
'expedition',
'propale',
'facture',
'contrat',
'fichinter',
'commandefournisseur'))) {
12802 $classname = preg_replace(
'/det$/',
'Ligne', $element);
12806 if ($elementType ==
"action" || $elementType ==
"actioncomm") {
12807 $classpath =
'comm/action/class';
12808 $subelement =
'Actioncomm';
12809 $module =
'agenda';
12810 $table_element =
'actioncomm';
12811 } elseif ($elementType ==
'cronjob') {
12812 $classpath =
'cron/class';
12814 $table_element =
'cron';
12815 } elseif ($elementType ==
'adherent_type') {
12816 $classpath =
'adherents/class';
12817 $classfile =
'adherent_type';
12818 $module =
'adherent';
12819 $subelement =
'adherent_type';
12820 $classname =
'AdherentType';
12821 $table_element =
'adherent_type';
12822 } elseif ($elementType ==
'bank_account') {
12823 $classpath =
'compta/bank/class';
12825 $classfile =
'account';
12826 $classname =
'Account';
12827 } elseif ($elementType ==
'category') {
12828 $classpath =
'categories/class';
12829 $module =
'categorie';
12830 $subelement =
'categorie';
12831 $table_element =
'categorie';
12832 } elseif ($elementType ==
'contact') {
12833 $classpath =
'contact/class';
12834 $classfile =
'contact';
12835 $module =
'societe';
12836 $subelement =
'contact';
12837 $table_element =
'socpeople';
12838 } elseif ($elementType ==
'inventory') {
12839 $module =
'product';
12840 $classpath =
'product/inventory/class';
12841 } elseif ($elementType ==
'stock' || $elementType ==
'entrepot') {
12843 $classpath =
'product/stock/class';
12844 $classfile =
'entrepot';
12845 $classname =
'Entrepot';
12846 $table_element =
'entrepot';
12847 } elseif ($elementType ==
'project') {
12848 $classpath =
'projet/class';
12849 $module =
'projet';
12850 $table_element =
'projet';
12851 } elseif ($elementType ==
'project_task') {
12852 $classpath =
'projet/class';
12853 $module =
'projet';
12854 $subelement =
'task';
12855 $table_element =
'projet_task';
12856 } elseif ($elementType ==
'facture' || $elementType ==
'invoice') {
12857 $classpath =
'compta/facture/class';
12858 $module =
'facture';
12859 $subelement =
'facture';
12860 $table_element =
'facture';
12861 } elseif ($elementType ==
'facturerec') {
12862 $classpath =
'compta/facture/class';
12863 $module =
'facture';
12864 $classname =
'FactureRec';
12865 } elseif ($elementType ==
'commande' || $elementType ==
'order') {
12866 $classpath =
'commande/class';
12867 $module =
'commande';
12868 $subelement =
'commande';
12869 $table_element =
'commande';
12870 } elseif ($elementType ==
'propal') {
12871 $classpath =
'comm/propal/class';
12872 $table_element =
'propal';
12873 } elseif ($elementType ==
'shipping') {
12874 $classpath =
'expedition/class';
12875 $classfile =
'expedition';
12876 $classname =
'Expedition';
12877 $module =
'expedition';
12878 $table_element =
'expedition';
12879 } elseif ($elementType ==
'delivery_note') {
12880 $classpath =
'delivery/class';
12881 $subelement =
'delivery';
12882 $module =
'expedition';
12883 } elseif ($elementType ==
'delivery') {
12884 $classpath =
'delivery/class';
12885 $subelement =
'delivery';
12886 $module =
'expedition';
12887 } elseif ($elementType ==
'supplier_proposal') {
12888 $classpath =
'supplier_proposal/class';
12889 $module =
'supplier_proposal';
12890 $element =
'supplierproposal';
12891 $classfile =
'supplier_proposal';
12892 $subelement =
'supplierproposal';
12893 } elseif ($elementType ==
'contract') {
12894 $classpath =
'contrat/class';
12895 $module =
'contrat';
12896 $subelement =
'contrat';
12897 $table_element =
'contract';
12898 } elseif ($elementType ==
'mailing') {
12899 $classpath =
'comm/mailing/class';
12900 $module =
'mailing';
12901 $classfile =
'mailing';
12902 $classname =
'Mailing';
12904 } elseif ($elementType ==
'member' || $elementType ==
'adherent') {
12905 $classpath =
'adherents/class';
12906 $module =
'adherent';
12907 $subelement =
'adherent';
12908 $table_element =
'adherent';
12909 } elseif ($elementType ==
'usergroup') {
12910 $classpath =
'user/class';
12912 } elseif ($elementType ==
'mo') {
12913 $classpath =
'mrp/class';
12918 $table_element =
'mrp_mo';
12919 } elseif ($elementType ==
'cabinetmed_cons') {
12920 $classpath =
'cabinetmed/class';
12921 $module =
'cabinetmed';
12922 $subelement =
'cabinetmedcons';
12923 $table_element =
'cabinetmedcons';
12924 } elseif ($elementType ==
'fichinter') {
12925 $classpath =
'fichinter/class';
12926 $module =
'ficheinter';
12927 $subelement =
'fichinter';
12928 $table_element =
'fichinter';
12929 } elseif ($elementType ==
'dolresource' || $elementType ==
'resource') {
12930 $classpath =
'resource/class';
12931 $module =
'resource';
12932 $subelement =
'dolresource';
12933 $table_element =
'resource';
12934 } elseif ($elementType ==
'propaldet') {
12935 $classpath =
'comm/propal/class';
12936 $module =
'propal';
12937 $subelement =
'propaleligne';
12938 } elseif ($elementType ==
'opensurvey_sondage') {
12939 $classpath =
'opensurvey/class';
12940 $module =
'opensurvey';
12941 $subelement =
'opensurveysondage';
12942 } elseif ($elementType ==
'order_supplier') {
12943 $classpath =
'fourn/class';
12944 $module =
'fournisseur';
12945 $classfile =
'fournisseur.commande';
12946 $element =
'order_supplier';
12948 $classname =
'CommandeFournisseur';
12949 $table_element =
'commande_fournisseur';
12950 } elseif ($elementType ==
'commande_fournisseurdet') {
12951 $classpath =
'fourn/class';
12952 $module =
'fournisseur';
12953 $classfile =
'fournisseur.commande';
12954 $element =
'commande_fournisseurdet';
12956 $classname =
'CommandeFournisseurLigne';
12957 $table_element =
'commande_fournisseurdet';
12958 } elseif ($elementType ==
'invoice_supplier') {
12959 $classpath =
'fourn/class';
12960 $module =
'fournisseur';
12961 $classfile =
'fournisseur.facture';
12962 $element =
'invoice_supplier';
12964 $classname =
'FactureFournisseur';
12965 $table_element =
'facture_fourn';
12966 } elseif ($elementType ==
"service") {
12967 $classpath =
'product/class';
12968 $subelement =
'product';
12969 $table_element =
'product';
12970 } elseif ($elementType ==
'salary') {
12971 $classpath =
'salaries/class';
12972 $module =
'salaries';
12973 } elseif ($elementType ==
'payment_salary') {
12974 $classpath =
'salaries/class';
12975 $classfile =
'paymentsalary';
12976 $classname =
'PaymentSalary';
12977 $module =
'salaries';
12978 } elseif ($elementType ==
'productlot') {
12979 $module =
'productbatch';
12980 $classpath =
'product/stock/class';
12981 $classfile =
'productlot';
12982 $classname =
'Productlot';
12983 $element =
'productlot';
12985 $table_element =
'product_lot';
12986 } elseif ($elementType ==
'societeaccount') {
12987 $classpath =
'societe/class';
12988 $classfile =
'societeaccount';
12989 $classname =
'SocieteAccount';
12990 $module =
'societe';
12991 } elseif ($elementType ==
'websitepage') {
12992 $classpath =
'website/class';
12993 $classfile =
'websitepage';
12994 $classname =
'Websitepage';
12995 $module =
'website';
12996 $subelement =
'websitepage';
12997 $table_element =
'website_page';
12998 } elseif ($elementType ==
'fiscalyear') {
12999 $classpath =
'core/class';
13000 $module =
'accounting';
13001 $subelement =
'fiscalyear';
13002 } elseif ($elementType ==
'chargesociales') {
13003 $classpath =
'compta/sociales/class';
13005 $table_element =
'chargesociales';
13006 } elseif ($elementType ==
'tva') {
13007 $classpath =
'compta/tva/class';
13010 $table_element =
'tva';
13011 } elseif ($elementType ==
'emailsenderprofile') {
13013 $classpath =
'core/class';
13014 $classfile =
'emailsenderprofile';
13015 $classname =
'EmailSenderProfile';
13016 $table_element =
'c_email_senderprofile';
13018 } elseif ($elementType ==
'conferenceorboothattendee') {
13019 $classpath =
'eventorganization/class';
13020 $classfile =
'conferenceorboothattendee';
13021 $classname =
'ConferenceOrBoothAttendee';
13022 $module =
'eventorganization';
13023 } elseif ($elementType ==
'conferenceorbooth') {
13024 $classpath =
'eventorganization/class';
13025 $classfile =
'conferenceorbooth';
13026 $classname =
'ConferenceOrBooth';
13027 $module =
'eventorganization';
13028 } elseif ($elementType ==
'ccountry') {
13030 $classpath =
'core/class';
13031 $classfile =
'ccountry';
13032 $classname =
'Ccountry';
13033 $table_element =
'c_country';
13037 if (empty($classfile)) {
13038 $classfile = strtolower($subelement);
13040 if (empty($classname)) {
13041 $classname = ucfirst($subelement);
13043 if (empty($classpath)) {
13044 $classpath = $module.
'/class';
13050 if ($module && isset($conf->$module)) {
13051 if (!empty($conf->$module->multidir_output[$conf->entity])) {
13052 $dir_output = $conf->$module->multidir_output[$conf->entity];
13053 } elseif (!empty($conf->$module->output[$conf->entity])) {
13054 $dir_output = $conf->$module->output[$conf->entity];
13055 } elseif (!empty($conf->$module->dir_output)) {
13056 $dir_output = $conf->$module->dir_output;
13061 if ($element ==
'order_supplier') {
13062 $dir_output = $conf->fournisseur->commande->dir_output;
13063 } elseif ($element ==
'invoice_supplier') {
13064 $dir_output = $conf->fournisseur->facture->dir_output;
13066 $dir_output .= $subdir;
13068 $elementProperties = array(
13069 'module' => $module,
13070 'element' => $element,
13071 'table_element' => $table_element,
13072 'subelement' => $subelement,
13073 'classpath' => $classpath,
13074 'classfile' => $classfile,
13075 'classname' => $classname,
13076 'dir_output' => $dir_output
13081 if (!is_object($hookmanager)) {
13082 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
13085 $hookmanager->initHooks(array(
'elementproperties'));
13089 $parameters = array(
13090 'elementType' => $elementType,
13091 'elementProperties' => $elementProperties
13094 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
13097 $elementProperties = $hookmanager->resArray;
13098 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
13099 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
13103 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
13104 unset($hookmanager->contextarray[$key]);
13107 return $elementProperties;
13122function fetchObjectByElement($element_id, $element_type, $element_ref =
'', $useCache = 0, $maxCacheByType = 10)
13130 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
13135 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
13136 } elseif ($element_prop[
'module'] ==
'societeaccount') {
13137 $ismodenabled = isModEnabled(
'website') || isModEnabled(
'webportal');
13139 $ismodenabled = isModEnabled($element_prop[
'module']);
13144 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
13145 if ($useCache === 1
13146 && !empty($conf->cache[
'fetchObjectByElement'][$element_type])
13147 && !empty($conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13148 && is_object($conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13150 return $conf->cache[
'fetchObjectByElement'][$element_type][$element_id];
13153 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13155 if (class_exists($element_prop[
'classname'])) {
13156 $className = $element_prop[
'classname'];
13157 $objecttmp =
new $className($db);
13158 '@phan-var-force CommonObject $objecttmp';
13160 if ($element_id > 0 || !empty($element_ref)) {
13161 $ret = $objecttmp->fetch($element_id, $element_ref);
13163 if (empty($objecttmp->module)) {
13164 $objecttmp->module = $element_prop[
'module'];
13167 if ($useCache > 0) {
13168 if (!isset($conf->cache[
'fetchObjectByElement'][$element_type])) {
13169 $conf->cache[
'fetchObjectByElement'][$element_type] = [];
13173 if (! empty($conf->cache[
'fetchObjectByElement'][$element_type]) && is_array($conf->cache[
'fetchObjectByElement'][$element_type]) && count($conf->cache[
'fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
13174 array_shift($conf->cache[
'fetchObjectByElement'][$element_type]);
13177 $conf->cache[
'fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
13201 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)) {
13217 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
13229 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
13241 if (empty($conf->cache[
'nonce'])) {
13245 return $conf->cache[
'nonce'];
13262function startSimpleTable($header, $link =
"", $arguments =
"", $emptyColumns = 0, $number = -1, $pictofulllist =
'')
13266 print
'<div class="div-table-responsive-no-min">';
13267 print
'<table class="noborder centpercent">';
13268 print
'<tr class="liste_titre">';
13270 print ($emptyColumns < 1) ?
'<th>' :
'<th colspan="'.($emptyColumns + 1).
'">';
13272 print
'<span class="valignmiddle">'.$langs->trans($header).
'</span>';
13274 if (!empty($link)) {
13275 if (!empty($arguments)) {
13276 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
13278 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
13282 if ($number > -1) {
13283 print
'<span class="badge marginleftonlyshort">'.$number.
'</span>';
13284 } elseif (!empty($link)) {
13285 print
'<span class="badge marginleftonlyshort">...</span>';
13288 if (!empty($link)) {
13294 if ($number < 0 && !empty($link)) {
13295 print
'<th class="right">';
13315 if ($addLineBreak) {
13331function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
13336 print
'<tr class="oddeven">';
13337 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
13342 if ($nbofloop === 0) {
13348 $colspan = $tableColumnCount;
13349 } elseif ($num > $nbofloop) {
13350 $colspan = $tableColumnCount;
13352 $colspan = $tableColumnCount - 1;
13355 if ($extraRightColumn) {
13359 print
'<tr class="liste_total">';
13361 if ($nbofloop > 0 && $num > $nbofloop) {
13362 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
13364 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
13365 print
'<td class="right centpercent">'.price($total).
'</td>';
13368 if ($extraRightColumn) {
13385 if ($method == -1) {
13396 while (ob_get_level()) {
13401 if ($method == 0) {
13402 readfile($fullpath_original_file_osencoded);
13403 } elseif ($method == 1) {
13405 $handle = fopen($fullpath_original_file_osencoded,
"rb");
13406 while (!feof($handle)) {
13407 print fread($handle, 8192);
13410 } elseif ($method == 2) {
13412 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
13413 $handle2 = fopen(
"php://output",
"wb");
13414 stream_copy_to_stream($handle1, $handle2);
13439 if ($texttoshow ===
'none') {
13440 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPValueToPrint"></span><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
13441 } elseif ($texttoshow) {
13442 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPValueToPrint">'.
dol_escape_htmltag($texttoshow, 1, 1).
'</span><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
13444 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
13459 $result = json_decode($stringtodecode);
13460 if ($result ===
null) {
13461 $result = unserialize($stringtodecode);
13488 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
13491 if (!preg_match(
'/^\(.*\)$/', $filter)) {
13492 $filter =
'(' . $filter .
')';
13495 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
13496 $firstandlastparenthesis = 0;
13498 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
13502 return 'Filter syntax error - '.$errorstr;
13507 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
13508 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
13511 if (preg_match(
'/[^\(\)]/', $t)) {
13512 $tmperrorstr =
'Bad syntax of the search string';
13513 $errorstr =
'Bad syntax of the search string: '.$filter;
13517 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - ".$errorstr, LOG_WARNING);
13518 return 'Filter error - '.$tmperrorstr;
13522 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
13524 if (is_object($db)) {
13525 $ret = str_replace(
'__NOW__',
"'".$db->idate(
dol_now()).
"'", $ret);
13527 if (is_object($user)) {
13528 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
13543 $arrayofandtags = array();
13547 $parenthesislevel = 0;
13552 if ($parenthesislevel >= 1) {
13553 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
13558 $countparenthesis = 0;
13559 while ($i < $nbofchars) {
13562 if ($char ==
'(') {
13563 $countparenthesis++;
13564 } elseif ($char ==
')') {
13565 $countparenthesis--;
13568 if ($countparenthesis == 0) {
13569 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
13570 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
13571 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
13574 if (!preg_match(
'/^\(.*\)$/', $s)) {
13577 $arrayofandtags[] = $s;
13590 if (!preg_match(
'/^\(.*\)$/', $s)) {
13593 $arrayofandtags[] = $s;
13596 return $arrayofandtags;
13608function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
13612 $tmp = $sqlfilters;
13616 $parenthesislevel = 0;
13624 if ($char ==
'(') {
13625 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
13627 $parenthesislevel++;
13630 } elseif ($char ==
')') {
13631 $nbcharremaining = ($nb - $i - 1);
13632 if ($nbcharremaining >= $counter) {
13633 $parenthesislevel = min($parenthesislevel, $counter - 1);
13635 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
13636 $parenthesislevel = $counter;
13641 if ($counter < 0) {
13642 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13643 $parenthesislevel = 0;
13651 if ($counter > 0) {
13652 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13653 $parenthesislevel = 0;
13671 if (empty($matches[1])) {
13674 $tmp = explode(
':', $matches[1]);
13675 if (count($tmp) < 3) {
13695 if (empty($matches[1])) {
13698 $tmp = explode(
':', $matches[1], 3);
13699 if (count($tmp) < 3) {
13703 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
13705 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
13708 'NOTLIKE' =>
'NOT LIKE',
13709 'ISNOT' =>
'IS NOT',
13710 'NOTIN' =>
'NOT IN',
13714 if (array_key_exists($operator, $realOperator)) {
13715 $operator = $realOperator[$operator];
13718 $tmpescaped = $tmp[2];
13724 if ($operator ==
'IN' || $operator ==
'NOT IN') {
13726 $tmpescaped2 =
'(';
13728 $tmpelemarray = explode(
',', $tmpescaped);
13729 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
13731 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
13732 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
13734 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
13737 $tmpescaped2 .= implode(
',', $tmpelemarray);
13738 $tmpescaped2 .=
')';
13740 $tmpescaped = $tmpescaped2;
13741 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
13742 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
13743 $tmpescaped = $regbis[1];
13746 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
13747 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
13750 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
13752 if (strtoupper($tmpescaped) ==
'NULL') {
13753 $tmpescaped =
'NULL';
13754 } elseif (is_int($tmpescaped)) {
13755 $tmpescaped = (int) $tmpescaped;
13756 } elseif (is_numeric((
string) $tmpescaped)) {
13757 $tmpescaped = (float) $tmpescaped;
13759 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
13763 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
13780 $out =
'<!-- timeline icon -->'.
"\n";
13781 $iconClass =
'fa fa-comments';
13786 if ($histo[$key][
'percent'] == -1) {
13787 $colorClass =
'timeline-icon-not-applicble';
13788 $pictoTitle = $langs->trans(
'StatusNotApplicable');
13789 } elseif ($histo[$key][
'percent'] == 0) {
13790 $colorClass =
'timeline-icon-todo';
13791 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
13792 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
13793 $colorClass =
'timeline-icon-in-progress';
13794 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
13795 } elseif ($histo[$key][
'percent'] >= 100) {
13796 $colorClass =
'timeline-icon-done';
13797 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
13800 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
13801 $iconClass =
'fa fa-ticket';
13802 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
13803 $iconClass =
'fa fa-pencilxxx';
13804 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13805 $iconClass =
'fa fa-comments';
13806 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13807 $iconClass =
'fa fa-mask';
13809 if ($actionstatic->type_picto) {
13810 $img_picto =
img_picto(
'', $actionstatic->type_picto);
13812 if ($actionstatic->type_code ==
'AC_RDV') {
13813 $iconClass =
'fa fa-handshake';
13814 } elseif ($actionstatic->type_code ==
'AC_TEL') {
13815 $iconClass =
'fa fa-phone';
13816 } elseif ($actionstatic->type_code ==
'AC_FAX') {
13817 $iconClass =
'fa fa-fax';
13818 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
13819 $iconClass =
'fa fa-envelope';
13820 } elseif ($actionstatic->type_code ==
'AC_INT') {
13821 $iconClass =
'fa fa-shipping-fast';
13822 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
13823 $iconClass =
'fa fa-robot';
13824 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
13825 $iconClass =
'fa fa-robot';
13830 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
13844 $documents = array();
13846 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
13847 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
13848 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
13850 $sql .=
' ORDER BY ecm.position ASC';
13852 $resql = $db->query($sql);
13854 if ($db->num_rows($resql)) {
13855 while ($obj = $db->fetch_object($resql)) {
13856 $documents[$obj->id] = $obj;
13882function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
13884 global $user, $conf;
13887 global $param, $massactionbutton;
13889 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
13892 if (!is_object($filterobj) && !is_object($objcon)) {
13897 '@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';
13902 $sortfield_list = explode(
',', $sortfield);
13903 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
13904 $sortfield_new_list = array();
13905 foreach ($sortfield_list as $sortfield_value) {
13906 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
13908 $sortfield_new = implode(
',', $sortfield_new_list);
13913 if (isModEnabled(
'agenda')) {
13915 if (is_object($objcon) && $objcon->id > 0) {
13916 $sql =
"SELECT DISTINCT a.id, a.label as label,";
13918 $sql =
"SELECT a.id, a.label as label,";
13920 $sql .=
" a.datep as dp,";
13921 $sql .=
" a.note as message,";
13922 $sql .=
" a.datep2 as dp2,";
13923 $sql .=
" a.percent as percent, 'action' as type,";
13924 $sql .=
" a.fk_element, a.elementtype,";
13925 $sql .=
" a.fk_contact,";
13926 $sql .=
" a.email_from as msg_from,";
13927 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
13928 $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";
13929 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13930 $sql .=
", sp.lastname, sp.firstname";
13931 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13932 $sql .=
", m.lastname, m.firstname";
13933 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13935 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13937 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13939 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13941 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13944 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
13945 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
13946 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
13948 $force_filter_contact = $filterobj instanceof
User;
13950 if (is_object($objcon) && $objcon->id > 0) {
13951 $force_filter_contact =
true;
13952 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
13953 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
13956 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13957 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
13958 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
13959 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
13960 $sql .=
" ON er.resource_type = 'dolresource'";
13961 $sql .=
" AND er.element_id = a.id";
13962 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
13963 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13964 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
13965 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13966 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
13967 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13968 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
13969 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13970 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
13971 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13972 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
13973 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13974 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
13977 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
13978 if (!$force_filter_contact) {
13979 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
13980 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
13981 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
13982 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
13983 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13984 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
13985 if ($filterobj->id) {
13986 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13988 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13989 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
13990 if ($filterobj->id) {
13991 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13993 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13994 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
13995 if ($filterobj->id) {
13996 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13998 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13999 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
14000 if ($filterobj->id) {
14001 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14003 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14004 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
14005 if ($filterobj->id) {
14006 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14008 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14009 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
14010 if ($filterobj->id) {
14011 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14015 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
14019 if (!empty($actioncode)) {
14021 if ($actioncode ==
'AC_NON_AUTO') {
14022 $sql .=
" AND c.type != 'systemauto'";
14023 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14024 $sql .=
" AND c.type = 'systemauto'";
14026 if ($actioncode ==
'AC_OTH') {
14027 $sql .=
" AND c.type != 'systemauto'";
14028 } elseif ($actioncode ==
'AC_OTH_AUTO') {
14029 $sql .=
" AND c.type = 'systemauto'";
14033 if ($actioncode ==
'AC_NON_AUTO') {
14034 $sql .=
" AND c.type != 'systemauto'";
14035 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14036 $sql .=
" AND c.type = 'systemauto'";
14038 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
14042 if ($donetodo ==
'todo') {
14043 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
14044 } elseif ($donetodo ==
'done') {
14045 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
14047 if (is_array($filters) && $filters[
'search_agenda_label']) {
14048 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
14053 if (isModEnabled(
'mailing') && !empty($objcon->email)
14054 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
14055 $langs->load(
"mails");
14057 $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";
14058 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
14059 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
14060 $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";
14061 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14062 $sql2 .=
", '' as lastname, '' as firstname";
14063 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14064 $sql2 .=
", '' as lastname, '' as firstname";
14065 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14066 $sql2 .=
", '' as ref";
14067 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14068 $sql2 .=
", '' as ref";
14069 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14070 $sql2 .=
", '' as ref";
14072 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
14073 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
14074 $sql2 .=
" AND mc.statut = 1";
14075 $sql2 .=
" AND u.rowid = m.fk_user_valid";
14076 $sql2 .=
" AND mc.fk_mailing=m.rowid";
14079 if ($sql || $sql2) {
14080 if (!empty($sql) && !empty($sql2)) {
14081 $sql = $sql.
" UNION ".$sql2;
14082 } elseif (empty($sql) && !empty($sql2)) {
14091 $sql .= $db->order($sortfield_new, $sortorder);
14093 $sql .= $db->plimit($limit + 1, $offset);
14096 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
14097 $resql = $db->query($sql);
14100 $num = $db->num_rows($resql);
14102 $imaxinloop = ($limit ? min($num, $limit) : $num);
14103 while ($i < $imaxinloop) {
14104 $obj = $db->fetch_object($resql);
14106 if ($obj->type ==
'action') {
14108 $contactaction->id = $obj->id;
14109 $result = $contactaction->fetchResources();
14112 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
14118 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
14119 $tododone =
'todo';
14122 $histo[$numaction] = array(
14123 'type' => $obj->type,
14124 'tododone' => $tododone,
14126 'datestart' => $db->jdate($obj->dp),
14127 'dateend' => $db->jdate($obj->dp2),
14128 'note' => $obj->label,
14130 'percent' => $obj->percent,
14132 'userid' => $obj->user_id,
14133 'login' => $obj->user_login,
14134 'userfirstname' => $obj->user_firstname,
14135 'userlastname' => $obj->user_lastname,
14136 'userphoto' => $obj->user_photo,
14137 'msg_from' => $obj->msg_from,
14139 'contact_id' => $obj->fk_contact,
14140 'socpeopleassigned' => $contactaction->socpeopleassigned,
14141 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
14142 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
14143 'fk_element' => $obj->fk_element,
14144 'elementtype' => $obj->elementtype,
14146 'acode' => $obj->acode,
14147 'alabel' => $obj->alabel,
14148 'libelle' => $obj->alabel,
14149 'apicto' => $obj->apicto
14152 $histo[$numaction] = array(
14153 'type' => $obj->type,
14154 'tododone' =>
'done',
14156 'datestart' => $db->jdate($obj->dp),
14157 'dateend' => $db->jdate($obj->dp2),
14158 'note' => $obj->label,
14160 'percent' => $obj->percent,
14161 'acode' => $obj->acode,
14163 'userid' => $obj->user_id,
14164 'login' => $obj->user_login,
14165 'userfirstname' => $obj->user_firstname,
14166 'userlastname' => $obj->user_lastname,
14167 'userphoto' => $obj->user_photo
14182 if (!isModEnabled(
'agenda')) {
14183 $langs->loadLangs(array(
"admin",
"errors"));
14184 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
14187 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
14188 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
14190 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
14191 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
14192 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
14193 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
14198 $userstatic =
new User($db);
14199 $contactstatic =
new Contact($db);
14200 $userGetNomUrlCache = array();
14201 $contactGetNomUrlCache = array();
14203 $out .=
'<div class="filters-container" >';
14204 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
14205 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
14207 if ($objcon && get_class($objcon) ==
'Contact' &&
14208 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
14209 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
14211 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
14213 if (($filterobj && get_class($filterobj) ==
'Societe')) {
14214 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
14216 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
14221 $out .=
'<div class="div-table-responsive-no-min">';
14222 $out .=
'<table class="noborder borderbottom centpercent">';
14224 $out .=
'<tr class="liste_titre">';
14228 $out .=
'<th class="liste_titre width50 middle">';
14229 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14230 $out .= $searchpicto;
14234 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
14236 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
14238 $out .=
'<th class="liste_titre"></th>';
14240 $out .=
'<th class="liste_titre">';
14241 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
14243 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
14245 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
14246 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
14251 $out .=
'<th class="liste_titre width50 middle">';
14252 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14253 $out .= $searchpicto;
14260 $out .=
'</table>';
14267 $out .=
'<ul class="timeline">';
14271 if ($filterobj instanceof
Societe) {
14272 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14274 if ($filterobj instanceof
User) {
14275 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14277 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
14278 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
14279 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
14281 if ($filterobj instanceof
Societe) {
14284 if ($filterobj instanceof
User) {
14290 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
14292 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
14294 $actualCycleDate =
false;
14297 foreach ($histo as $key => $value) {
14298 $actionstatic->fetch($histo[$key][
'id']);
14300 $actionstatic->type_picto = $histo[$key][
'apicto'];
14301 $actionstatic->type_code = $histo[$key][
'acode'];
14303 $labeltype = $actionstatic->type_code;
14304 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
14305 $labeltype =
'AC_OTH';
14307 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14308 $labeltype = $langs->trans(
"Message");
14310 if (!empty($arraylist[$labeltype])) {
14311 $labeltype = $arraylist[$labeltype];
14313 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
14314 $labeltype .=
' - '.$arraylist[$actionstatic->code];
14318 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
14320 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
14322 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
14323 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
14324 $out .=
'<!-- timeline time label -->';
14325 $out .=
'<li class="time-label">';
14326 $out .=
'<span class="timeline-badge-date">';
14327 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
14330 $out .=
'<!-- /.timeline-label -->';
14334 $out .=
'<!-- timeline item -->'.
"\n";
14335 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
14338 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
14343 $out .=
'<div class="timeline-item">'.
"\n";
14345 $out .=
'<span class="time timeline-header-action2">';
14347 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
14348 $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").
' ';
14349 $out .= $histo[$key][
'id'];
14352 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
14355 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
14356 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
14357 $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).
'">';
14359 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
14366 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
14367 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
14368 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
14369 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
14370 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
14371 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
14372 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
14374 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
14378 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14381 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14384 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
14387 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14393 $out .=
"</span></span>\n";
14396 $out .=
'<h3 class="timeline-header">';
14399 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
14400 if ($histo[$key][
'userid'] > 0) {
14401 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
14402 $userstatic->fetch($histo[$key][
'userid']);
14403 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
14405 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
14406 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
14407 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
14408 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
14409 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
14411 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
14414 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
14419 $out .=
' <div class="messaging-title inline-block">';
14421 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
14422 $out .= $labeltype.
' - ';
14426 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14427 $out .= $langs->trans(
'TicketNewMessage');
14428 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14429 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
14430 } elseif (isset($histo[$key][
'type'])) {
14431 if ($histo[$key][
'type'] ==
'action') {
14432 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14433 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
14434 $libelle = $histo[$key][
'note'];
14435 $actionstatic->id = $histo[$key][
'id'];
14437 } elseif ($histo[$key][
'type'] ==
'mailing') {
14438 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
14439 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14440 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
14443 $libelle .= $histo[$key][
'note'];
14448 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
14449 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
14450 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
14452 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
14453 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
14455 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
14456 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
14459 $out .=
' - '.$link;
14468 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
14469 && $actionstatic->code !=
'AC_TICKET_CREATE'
14470 && $actionstatic->code !=
'AC_TICKET_MODIFY'
14472 $out .=
'<div class="timeline-body wordbreak small">';
14473 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
14475 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
14476 $out .=
'<div class="readmore-block --closed" >';
14477 $out .=
' <div class="readmore-block__excerpt">';
14479 $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>';
14481 $out .=
' <div class="readmore-block__full-text" >';
14483 $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>';
14497 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
14499 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
14500 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14502 $contact->fetch($cid);
14503 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14505 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14509 $contactList .= !empty($contactList) ?
', ' :
'';
14510 $contactList .= $contact->getNomUrl(1);
14511 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14512 if (!empty($contact->phone_pro)) {
14513 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
14519 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
14520 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
14521 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14523 $result = $contact->fetch($histo[$key][
'contact_id']);
14524 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14526 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14527 $result = ($contact instanceof
Contact) ? $contact->id : 0;
14531 $footer .= $contact->getNomUrl(1);
14532 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14533 if (!empty($contact->phone_pro)) {
14534 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
14541 if (!empty($documents)) {
14542 $footer .=
'<div class="timeline-documents-container">';
14543 foreach ($documents as $doc) {
14544 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
14545 $footer .=
' data-id="'.$doc->id.
'" ';
14546 $footer .=
' data-path="'.$doc->filepath.
'"';
14547 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
14550 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
14552 $file = $actionstatic->id.
'/'.$doc->filename;
14553 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
14554 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
14555 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
14557 $mimeAttr =
' mime="'.$mime.
'" ';
14559 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
14560 $class .=
' documentpreview';
14563 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
14564 $footer .=
img_mime($filePath).
' '.$doc->filename;
14567 $footer .=
'</span>';
14569 $footer .=
'</div>';
14572 if (!empty($footer)) {
14573 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
14576 $out .=
'</div>'.
"\n";
14579 $out .=
'<!-- END timeline item -->';
14585 jQuery(document).ready(function () {
14586 $(document).on("click", "[data-read-more-action]", function(e){
14587 let readMoreBloc = $(this).closest(".readmore-block");
14588 if(readMoreBloc.length > 0){
14589 e.preventDefault();
14590 if($(this).attr("data-read-more-action") == "close"){
14591 readMoreBloc.addClass("--closed").removeClass("--open");
14592 $("html, body").animate({
14593 scrollTop: readMoreBloc.offset().top - 200
14596 readMoreBloc.addClass("--open").removeClass("--closed");
14604 if (empty($histo)) {
14605 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
14626function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto')
14629 if ($hourTime ===
'getpost') {
14633 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
14634 $hour = intval($m[1]);
14635 $minute = intval($m[2]);
14636 $second = intval($m[3]);
14638 $hour = $minute = $second = 0;
14641 $hour = min($hour, 23);
14642 $minute = min($minute, 59);
14643 $second = min($second, 59);
14658function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
14660 if ($timestamp ===
null) {
14661 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
14668 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
14669 $TParam = array_merge($TParam, array(
14676 return '&' . http_build_query($TParam);
14698function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
14700 global $conf, $db, $langs, $hookmanager;
14703 if (!is_object($langs)) {
14704 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
14706 $langs->setDefaultLang();
14709 $langs->load(
"errors");
14711 if ($printheader) {
14712 if (function_exists(
"llxHeader")) {
14714 } elseif (function_exists(
"llxHeaderVierge")) {
14719 print
'<div class="error">';
14720 if (empty($message)) {
14721 print $langs->trans(
"ErrorRecordNotFound");
14723 print $langs->trans($message);
14728 if (empty($showonlymessage)) {
14729 if (empty($hookmanager)) {
14730 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
14733 $hookmanager->initHooks(array(
'main'));
14736 $parameters = array(
'message' => $message,
'params' => $params);
14737 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
14738 print $hookmanager->resPrint;
14741 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()
Header function.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='')
On/off button to change a property status of an object This uses the ajax service objectonoff....
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
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.
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.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
dolCheckFilters($sqlfilters, &$error='', &$parenthesislevel=0)
Return if a $sqlfilters parameter has a valid balance of parenthesis.
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)
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_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='')
Format phone numbers according to country.
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.
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.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
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_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.
print_fleche_navigation($page, $file, $options='', $nextpage=0, $betweenarrows='', $afterarrows='', $limit=-1, $totalnboflines=0, $hideselectlimit=0, $beforearrows='', $hidenavigation=0)
Function to show navigation arrows into lists.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
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.
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.
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.
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
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0)
Show EMail link formatted for HTML output.
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_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0)
Clean a string to keep only desirable HTML tags.
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_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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_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)
img_printer($titlealt="default", $other='')
Show printer logo.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
ascii_check($str)
Check if a string is in ASCII.
get_date_range($date_start, $date_end, $format='', $outputlangs=null, $withparenthesis=1)
Format output for start and end date.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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.
dol_bc($var, $moreclass='')
Return string to add class property on html element with pair/impair.
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).
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_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.
dol_nboflines($s, $maxchar=0)
Return nb of lines of a clear text.
dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox=0, $check='restricthtml')
Sanitize a HTML to remove js, dangerous content and external link.
jsonOrUnserialize($stringtodecode)
Decode an encode string.
addSummaryTableLine($tableColumnCount, $num, $nbofloop=0, $total=0, $noneWord="None", $extraRightColumn=false)
Add a summary line to the current open table ("None", "XMoreLines" or "Total xxx")
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
dol_escape_xml($stringtoescape)
Returns text escaped for inclusion into a XML string.
getActionCommEcmList($object)
getActionCommEcmList
dol_ucwords($string, $encoding="UTF-8")
Convert first character of all the words of a string to upper.
img_edit_add($titlealt='default', $other='')
Show logo +.
print_fiche_titre($title, $mesg='', $picto='generic', $pictoisfullpath=0, $id='')
Show a title with picto.
get_product_vat_for_country($idprod, $thirdpartytouse, $idprodfournprice=0)
Return vat rate of a product in a particular country, or default country vat if product is unknown.
dolForgeDummyCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
dolForgeCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
getDolGlobalString($key, $default='')
Return 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.
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 ...
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
table table fiche title col title div col center btnTitle icon
Automatically calls the icon named with the corresponding "object_" prefix.
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.
dol_setcache($memoryid, $data, $expire=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
dolGetRandomBytes($length)
Return a string of random bytes (hexa string) with length = $length for cryptographic purposes.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e rowid