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)) {
965 $regreplace = array();
968 while (preg_match(
'/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) {
972 if ($reg[1] ==
'DAY') {
974 $newout = $tmp[
'mday'];
975 } elseif ($reg[1] ==
'MONTH') {
977 $newout = $tmp[
'mon'];
978 } elseif ($reg[1] ==
'YEAR') {
980 $newout = $tmp[
'year'];
981 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
984 $newout = $tmp2[
'day'];
985 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
988 $newout = $tmp2[
'month'];
989 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
991 $newout = ($tmp[
'year'] - 1);
992 } elseif ($reg[1] ==
'NEXT_DAY') {
995 $newout = $tmp2[
'day'];
996 } elseif ($reg[1] ==
'NEXT_MONTH') {
999 $newout = $tmp2[
'month'];
1000 } elseif ($reg[1] ==
'NEXT_YEAR') {
1002 $newout = ($tmp[
'year'] + 1);
1003 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
1004 $newout = $mysoc->country_id;
1005 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
1006 $newout = $user->id;
1007 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1008 $newout = $user->fk_user;
1009 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1010 $newout = $conf->entity;
1011 } elseif ($reg[1] ==
'ID') {
1014 $newout =
'REGREPLACE_'.$loopnb;
1015 $regreplace[$loopnb] = $reg[0];
1018 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1020 if (!empty($regreplace)) {
1021 foreach ($regreplace as $key => $value) {
1022 $out = preg_replace(
'/REGREPLACE_'.$key.
'/', $value, $out);
1028 if (preg_match(
'/^array/', $check)) {
1029 if (!is_array($out) || empty($out)) {
1032 $tmparray = explode(
':', $check);
1033 if (!empty($tmparray[1])) {
1034 $tmpcheck = $tmparray[1];
1036 $tmpcheck =
'alphanohtml';
1038 foreach ($out as $outkey => $outval) {
1039 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1045 if (strpos($paramname,
'search_') === 0) {
1046 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1050 $out =
sanitizeVal($out, $check, $filter, $options);
1055 if (preg_match(
'/backtopage/', $paramname) || $paramname ==
'backtolist' || $paramname ==
'backtourl') {
1056 $out = str_replace(
'\\',
'/', $out);
1057 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1059 $oldstringtoclean = $out;
1060 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1061 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1062 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1063 }
while ($oldstringtoclean != $out);
1068 if (empty($method) || $method == 3 || $method == 4) {
1069 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1076 if ($out !=
'' && isset($user)) {
1077 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1096 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1125function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1127 return sanitizeVal($out, $check, $filter, $options);
1139function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1147 if (!is_numeric($out)) {
1152 if (is_array($out)) {
1153 $out = implode(
',', $out);
1155 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1160 $out = filter_var($out, FILTER_SANITIZE_STRING);
1163 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1166 if (!is_array($out)) {
1168 if (preg_match(
'/[^a-z]+/i', $out)) {
1174 if (!is_array($out)) {
1176 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1182 if (!is_array($out)) {
1184 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1190 if (!is_array($out)) {
1192 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1199 if (!is_array($out)) {
1202 $oldstringtoclean = $out;
1206 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1213 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1214 }
while ($oldstringtoclean != $out);
1218 case 'alphawithlgt':
1219 if (!is_array($out)) {
1222 $oldstringtoclean = $out;
1226 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1233 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1234 }
while ($oldstringtoclean != $out);
1240 case 'restricthtmlnolink':
1241 case 'restricthtml':
1242 case 'restricthtmlallowclass':
1243 case 'restricthtmlallowunvalid':
1248 if (empty($filter)) {
1249 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1251 if (is_null($options)) {
1254 $out = filter_var($out, $filter, $options);
1258 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1259 $out =
GETPOST($out,
'alphanohtml');
1267if (!function_exists(
'dol_getprefix')) {
1278 function dol_getprefix($mode =
'')
1281 if ($mode ==
'email') {
1286 return $conf->global->MAIL_PREFIX_FOR_EMAIL_ID;
1287 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1288 return $_SERVER[
"SERVER_NAME"];
1293 if (!empty($conf->file->instance_unique_id)) {
1294 return sha1(
'dolibarr'.$conf->file->instance_unique_id);
1298 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1302 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1303 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1306 if (!empty($tmp_instance_unique_id)) {
1307 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1311 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1312 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1314 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1331 global $conf, $langs, $user, $mysoc;
1335 if (!file_exists($fullpath)) {
1336 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1340 if (!empty($classname) && !class_exists($classname)) {
1341 return include $fullpath;
1343 return include_once $fullpath;
1361function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1365 $path = preg_replace(
'/^\//',
'', $path);
1368 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1369 if (is_array($conf->file->dol_document_root)) {
1370 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1371 if ($key ==
'main') {
1375 if (@file_exists($dirroot.
'/'.$path)) {
1376 $res = $dirroot.
'/'.$path;
1381 if ($returnemptyifnotfound) {
1383 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1395 $res = DOL_URL_ROOT.
'/'.$path;
1398 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1401 $res = DOL_URL_ROOT.
'/'.$path;
1404 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1405 if ($key ==
'main') {
1410 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1411 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1414 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1419 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1420 if (!empty($regs[1])) {
1423 if (@file_exists($dirroot.
'/'.$regs[1])) {
1425 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1426 } elseif ($type == 2) {
1427 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1428 } elseif ($type == 3) {
1432 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1433 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1436 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).$conf->file->dol_url_root[$key].
'/'.$path;
1460 if (empty($properties)) {
1461 return get_object_vars($obj);
1464 $existingProperties = [];
1465 $realProperties = get_object_vars($obj);
1468 foreach ($properties as $property) {
1469 if (array_key_exists($property, $realProperties)) {
1471 $existingProperties[$property] = $obj->{$property};
1472 } elseif (property_exists($obj, $property)) {
1474 $existingProperties[$property] = $obj->{$property};
1478 return $existingProperties;
1506 $myclone = unserialize(serialize(
$object));
1508 if (!empty($tmpsavdb)) {
1511 } elseif ($native == 2) {
1514 $tmparray = get_object_vars(
$object);
1516 if (is_array($tmparray)) {
1517 foreach ($tmparray as $propertykey => $propertyval) {
1518 if (is_scalar($propertyval) || is_array($propertyval)) {
1519 $myclone->$propertykey = $propertyval;
1539function dol_size($size, $type =
'')
1542 if (empty($conf->dol_optimize_smallscreen)) {
1545 if ($type ==
'width' && $size > 250) {
1570 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1572 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1573 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1574 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1575 $tmp = str_replace(
'..',
'', $tmp);
1596 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1598 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1599 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1600 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1601 $tmp = str_replace(
'..',
'', $tmp);
1616 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1618 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1620 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1624 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1628 $oldstringtoclean = $stringtoclean;
1631 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1632 }
while ($oldstringtoclean != $stringtoclean);
1636 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1639 return $stringtoclean;
1651 $oldstringtoclean = $stringtoclean;
1652 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1653 }
while ($oldstringtoclean != $stringtoclean);
1655 return $stringtoclean;
1670 if (is_null($str)) {
1675 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1676 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1677 return $transliterator->transliterate($str);
1680 $string = rawurlencode($str);
1681 $replacements = array(
1682 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1684 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1685 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1687 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1689 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1690 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1691 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1693 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1694 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1696 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1698 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1699 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1701 $string = strtr($string, $replacements);
1702 return rawurldecode($string);
1707 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1708 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1709 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1710 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1711 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1712 \xF9\xFA\xFB\xFC\xFD\xFF",
1720 $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"));
1738function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1740 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1741 if (empty($keepspaces)) {
1742 $forbidden_chars_to_replace[] =
" ";
1744 $forbidden_chars_to_remove = array();
1747 if (is_array($badcharstoreplace)) {
1748 $forbidden_chars_to_replace = $badcharstoreplace;
1750 if (is_array($badcharstoremove)) {
1751 $forbidden_chars_to_remove = $badcharstoremove;
1755 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1774 if ($removetabcrlf) {
1775 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1777 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1789function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
1791 if (is_null($stringtoescape)) {
1796 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
1798 if (empty($noescapebackslashn)) {
1799 $substitjs[
"\n"] =
'\\n';
1800 $substitjs[
'\\'] =
'\\\\';
1803 $substitjs[
"'"] =
"\\'";
1804 $substitjs[
'"'] =
"\\'";
1805 } elseif ($mode == 1) {
1806 $substitjs[
"'"] =
"\\'";
1807 } elseif ($mode == 2) {
1808 $substitjs[
'"'] =
'\\"';
1809 } elseif ($mode == 3) {
1810 $substitjs[
"'"] =
"\\'";
1811 $substitjs[
'"'] =
"\\\"";
1813 return strtr($stringtoescape, $substitjs);
1827 return rawurlencode($stringtoescape);
1838 return str_replace(
'"',
'\"', $stringtoescape);
1850 if (is_null($stringtoescape)) {
1854 if ($stringforquotes == 2) {
1855 return str_replace(
'"',
"'", $stringtoescape);
1856 } elseif ($stringforquotes == 1) {
1862 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
1863 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1866 return 'Bad parameter for stringforquotes in dol_escape_php';
1877 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
1888 return $stringtoescape;
1928 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
1952 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
1972function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1974 if ($noescapetags ==
'common') {
1975 $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';
1977 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
1979 if ($cleanalsojavascript) {
1984 if ($escapeonlyhtmltags) {
1985 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1987 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1988 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE', $tmp);
1991 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
1994 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
1995 } elseif ($keepn == -1) {
1996 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
1999 if ($escapeonlyhtmltags) {
2000 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
2003 $tmparrayoftags = array();
2004 if ($noescapetags) {
2005 $tmparrayoftags = explode(
',', $noescapetags);
2007 if (count($tmparrayoftags)) {
2009 $tmp = str_ireplace(
'__DOUBLEQUOTE',
'', $tmp);
2011 foreach ($tmparrayoftags as $tagtoreplace) {
2012 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2013 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2014 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
2020 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)>/', $tmp, $reg)) {
2022 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2023 $tmpattributes = str_ireplace(
'href="http:',
'__HREFHTTPA', $tmpattributes);
2024 $tmpattributes = str_ireplace(
'href="https:',
'__HREFHTTPSA', $tmpattributes);
2025 $tmpattributes = str_ireplace(
'src="http:',
'__SRCHTTPIMG', $tmpattributes);
2026 $tmpattributes = str_ireplace(
'src="https:',
'__SRCHTTPSIMG', $tmpattributes);
2027 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2028 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2034 $tmp = str_replace(
'<'.$tagtoreplace.$reg[1].$reg[2].
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2037 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'(\s+)([^>]+)(\s+)\/>/', $tmp, $reg)) {
2039 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[2]);
2040 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
2041 $tmpattributes = preg_replace(
'/[^a-z0-9_%,\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
2044 $tmp = str_replace(
'<'.$tagtoreplace.$reg[1].$reg[2].$reg[3].
'/>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
2047 $diff = strcmp($tmpold, $tmp);
2052 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2056 if (count($tmparrayoftags)) {
2057 foreach ($tmparrayoftags as $tagtoreplace) {
2058 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2059 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2060 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2061 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2062 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2065 $result = str_ireplace(
'__HREFHTTPA',
'href="http:', $result);
2066 $result = str_ireplace(
'__HREFHTTPSA',
'href="https:', $result);
2067 $result = str_ireplace(
'__SRCHTTPIMG',
'src="http:', $result);
2068 $result = str_ireplace(
'__SRCHTTPSIMG',
'src="https:', $result);
2069 $result = str_ireplace(
'__DOUBLEQUOTE',
'"', $result);
2072 $result = str_ireplace(
'__SIMPLEQUOTE',
''', $result);
2089 if (function_exists(
'mb_strtolower')) {
2090 return mb_strtolower($string, $encoding);
2092 return strtolower($string);
2106 if (function_exists(
'mb_strtoupper')) {
2107 return mb_strtoupper($string, $encoding);
2109 return strtoupper($string);
2123 if (function_exists(
'mb_substr')) {
2124 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2126 return ucfirst($string);
2140 if (function_exists(
'mb_convert_case')) {
2141 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2143 return ucwords($string);
2169function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2171 global $conf, $user, $debugbar;
2174 if (!isModEnabled(
'syslog')) {
2179 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2180 global $website, $websitekey;
2181 if (is_object($website) && !empty($website->ref)) {
2182 $suffixinfilename .=
'_website_'.$website->ref;
2183 } elseif (!empty($websitekey)) {
2184 $suffixinfilename .=
'_website_'.$websitekey;
2189 if (defined(
'USESUFFIXINLOG')) {
2190 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2194 foreach ($conf->loghandlers as $loghandlerinstance) {
2195 $loghandlerinstance->setIdent($ident);
2199 if (!empty($message)) {
2202 $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');
2204 if (!array_key_exists($level, $logLevels)) {
2205 dol_syslog(
'Error Bad Log Level '.$level, LOG_ERR);
2206 $level = $logLevels[LOG_ERR];
2213 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2217 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2218 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2219 $ospid = sprintf(
"%7s",
dol_trunc(getmypid(), 7,
'right',
'UTF-8', 1));
2220 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2222 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2228 print
"\n\n<!-- Log start\n";
2230 print
"Log end -->\n";
2234 'message' => $message,
2235 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') : false),
2237 'user' => ((is_object($user) && $user->id) ? $user->login : false),
2239 'osuser' => function_exists(
'posix_getuid') ? posix_getuid() : false,
2240 'ospid' => getmypid()
2244 if (!empty($remoteip)) {
2245 $data[
'ip'] = $remoteip;
2247 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
2248 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
2249 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
2250 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
2252 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2254 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
2255 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2257 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'];
2259 $data[
'ip'] =
'???';
2262 if (!empty($_SERVER[
'USERNAME'])) {
2264 $data[
'osuser'] = $_SERVER[
'USERNAME'];
2265 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2267 $data[
'osuser'] = $_SERVER[
'LOGNAME'];
2271 foreach ($conf->loghandlers as $loghandlerinstance) {
2272 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2275 $loghandlerinstance->export($data, $suffixinfilename);
2281 foreach ($conf->loghandlers as $loghandlerinstance) {
2282 $loghandlerinstance->setIdent($ident);
2302 $form =
new Form($db);
2304 $templatenameforexport = $website->name_template;
2305 if (empty($templatenameforexport)) {
2306 $templatenameforexport =
'website_'.$website->ref;
2310 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2313 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2314 $out .=
'jQuery(document).ready(function () {';
2315 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2316 $out .=
' var dialogHtml = \'';
2318 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2319 $dialogcontent .=
' <div style="margin-top: 20px;">';
2320 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2321 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2322 $dialogcontent .=
' </div>';
2323 $dialogcontent .=
' <br>';
2324 $dialogcontent .=
' <div style="margin-top: 20px;">';
2325 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2326 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2327 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2328 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2329 $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>';
2330 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2331 $dialogcontent .=
' </form>';
2332 $dialogcontent .=
' </div>';
2333 $dialogcontent .=
' </div>';
2340 // Add the content of the dialog to the body of the page
2341 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2342 $out .= ' if ($dialog.length > 0) {
2345 jQuery(
"body").append(dialogHtml);
';
2347 // Configuration of popup
2348 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2349 $out .= ' autoOpen:
false,
';
2350 $out .= ' modal:
true,
';
2351 $out .= ' height: 290,
';
2352 $out .= ' width:
"40%",
';
2353 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2356 // Simulate a click on the original "submit" input to export the site.
2357 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2358 $out .= ' console.log(
"Clic on exportsite.");
';
2359 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2360 $out .= ' console.log(
"element founded:", target.length > 0);
';
2361 $out .= ' if (target.length > 0) { target.click(); }
';
2362 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2366 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2367 $out .= ' return false;
';
2370 $out .= '</script>
';
2392function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $backtopagejsfields = '', $accesskey = '')
2396 if (strpos($url, '?
') > 0) {
2397 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2399 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2404 $backtopagejsfieldsid = '';
2405 $backtopagejsfieldslabel = '';
2406 if ($backtopagejsfields) {
2407 $tmpbacktopagejsfields = explode(':
', $backtopagejsfields);
2408 if (empty($tmpbacktopagejsfields[1])) { // If the part 'keyforpopupid:
' is missing, we add $name for it.
2409 $backtopagejsfields = $name.":".$backtopagejsfields;
2410 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[0]);
2412 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[1]);
2414 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ? '' : $tmp2backtopagejsfields[0];
2415 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ? '' : $tmp2backtopagejsfields[1];
2416 $url .= '&backtopagejsfields=
'.urlencode($backtopagejsfields);
2419 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2420 $out .= '<!-- a link
for button to open url into a dialog popup with backtopagejsfields =
'.$backtopagejsfields.' -->
';
2421 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2422 if (empty($conf->use_javascript_ajax)) {
2423 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2424 } elseif ($jsonopen) {
2425 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2427 $out .= ' href=
"#"';
2429 $out .= '>
'.$buttonstring.'</a>
';
2431 if (!empty($conf->use_javascript_ajax)) {
2432 // Add code to open url using the popup. Add also hidden field to retrieve the returned variables
2433 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2434 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2435 $out .= '<div
id=
"varforreturndialogid'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned
id' : '').'</div>
';
2436 $out .= '<div
id=
"varforreturndialoglabel'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned label
' : '').'</div>
';
2438 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2439 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2440 jQuery(document).ready(
function () {
2441 jQuery(
".button_'.$name.'").click(
function () {
2442 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2443 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2444 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2448 height: (window.innerHeight - 150),
2451 open: function (event, ui) {
2452 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2454 close:
function (event, ui) {
2455 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2456 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2457 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2458 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2459 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2461 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2462 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2467 $tmpdialog.dialog(\
'open\');
2492function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2494 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2513function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2515 global $conf, $langs, $hookmanager;
2519 if (!empty($conf->dol_optimize_smallscreen)) {
2523 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2525 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2526 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2530 if ($morehtmlright) {
2531 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2535 if (!empty($title) && $showtitle && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
2537 $out .=
'<a class="tabTitle">';
2539 $noprefix = $pictoisfullpath;
2540 if (strpos($picto,
'fontawesome_') !==
false) {
2543 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2545 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2553 if (is_array($links) && !empty($links)) {
2554 $keys = array_keys($links);
2556 $maxkey = max($keys);
2562 if (empty($limittoshow)) {
2563 $limittoshow = (!
getDolGlobalString(
'MAIN_MAXTABS_IN_CARD') ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2565 if (!empty($conf->dol_optimize_smallscreen)) {
2573 for ($i = 0; $i <= $maxkey; $i++) {
2574 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2576 if ($i >= $limittoshow) {
2582 for ($i = 0; $i <= $maxkey; $i++) {
2583 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2589 if ($i < $limittoshow || $isactive) {
2591 $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])).
' -->';
2593 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2594 if (!empty($links[$i][0])) {
2595 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2597 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2599 } elseif (!empty($links[$i][1])) {
2601 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2602 if (!empty($links[$i][0])) {
2603 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2604 $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).
'">';
2606 $out .= $links[$i][1];
2607 if (!empty($links[$i][0])) {
2608 $out .=
'</a>'.
"\n";
2610 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2619 $outmore .=
'<div class="popuptabset wordwrap">';
2621 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2622 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2623 if (!empty($links[$i][0])) {
2624 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2626 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2628 } elseif (!empty($links[$i][1])) {
2629 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2630 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2631 $outmore .=
'</a>'.
"\n";
2633 $outmore .=
'</div>';
2640 $outmore .=
'</div>';
2644 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2645 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2646 $widthofpopup = 200;
2648 $tabsname = $moretabssuffix;
2649 if (empty($tabsname)) {
2650 $tabsname = str_replace(
"@",
"", $picto);
2652 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2654 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2656 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2659 $out .=
'<div></div>';
2662 $out .=
'<script nonce="'.getNonce().
'">';
2663 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2664 var x = this.offsetLeft, y = this.offsetTop;
2665 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2666 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2667 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2669 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2672 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2673 $out .=
"</script>";
2676 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2680 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2681 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom')));
2684 if (!empty($dragdropfile)) {
2685 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2688 $parameters = array(
'tabname' => $active,
'out' => $out);
2689 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2691 $out = $hookmanager->resPrint;
2717 if (!$notab || $notab == -1) {
2718 return "\n</div>\n";
2743function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2745 global $conf, $form, $user, $langs, $hookmanager, $action;
2749 $maxvisiblephotos = 1;
2751 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
2753 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
2754 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2757 $modulepart =
'unknown';
2759 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
2760 $modulepart =
$object->element;
2761 } elseif (
$object->element ==
'member') {
2762 $modulepart =
'memberphoto';
2763 } elseif (
$object->element ==
'user') {
2764 $modulepart =
'userphoto';
2767 if (class_exists(
"Imagick")) {
2768 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
2769 $modulepart =
$object->element;
2770 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
2771 $modulepart =
'ficheinter';
2772 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2773 $modulepart =
'contract';
2774 } elseif (
$object->element ==
'order_supplier') {
2775 $modulepart =
'supplier_order';
2776 } elseif (
$object->element ==
'invoice_supplier') {
2777 $modulepart =
'supplier_invoice';
2781 if (
$object->element ==
'product') {
2783 '@phan-var-force Product $object';
2785 $cssclass =
'photowithmargin photoref';
2786 $showimage =
$object->is_photo_available($conf->product->multidir_output[$entity]);
2788 if ($conf->browser->layout ==
'phone') {
2789 $maxvisiblephotos = 1;
2792 $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>';
2796 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2798 $nophoto =
'/public/theme/common/nophoto.png';
2799 $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>';
2802 } elseif (
$object->element ==
'category') {
2804 '@phan-var-force Categorie $object';
2806 $cssclass =
'photowithmargin photoref';
2807 $showimage =
$object->isAnyPhotoAvailable($conf->categorie->multidir_output[$entity]);
2809 if ($conf->browser->layout ==
'phone') {
2810 $maxvisiblephotos = 1;
2813 $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>';
2817 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2819 $nophoto =
'/public/theme/common/nophoto.png';
2820 $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>';
2823 } elseif (
$object->element ==
'bom') {
2825 '@phan-var-force Bom $object';
2827 $cssclass =
'photowithmargin photoref';
2828 $showimage =
$object->is_photo_available($conf->bom->multidir_output[$entity]);
2830 if ($conf->browser->layout ==
'phone') {
2831 $maxvisiblephotos = 1;
2834 $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>';
2838 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2840 $nophoto =
'/public/theme/common/nophoto.png';
2841 $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>';
2844 } elseif (
$object->element ==
'ticket') {
2846 $cssclass =
'photoref';
2848 '@phan-var-force Ticket $object';
2849 $showimage =
$object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
2851 if ($conf->browser->layout ==
'phone') {
2852 $maxvisiblephotos = 1;
2856 $showphoto =
$object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2858 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2866 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2868 $nophoto =
img_picto(
'No photo',
'object_ticket');
2869 $morehtmlleft .=
'<!-- No photo to show -->';
2870 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2871 $morehtmlleft .= $nophoto;
2872 $morehtmlleft .=
'</div></div>';
2877 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
2880 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2882 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2883 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2885 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2889 if (empty($subdir)) {
2890 $subdir =
'errorgettingsubdirofobject';
2893 $filepath = $dir_output.$subdir.
"/";
2895 $filepdf = $filepath.$objectref.
".pdf";
2896 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2899 $fileimage = $filepdf.
'_preview.png';
2900 $relativepathimage = $relativepath.
'_preview.png';
2902 $pdfexists = file_exists($filepdf);
2907 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2909 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2918 if ($pdfexists && !$error) {
2919 $heightforphotref = 80;
2920 if (!empty($conf->dol_optimize_smallscreen)) {
2921 $heightforphotref = 60;
2924 if (file_exists($fileimage)) {
2925 $phototoshow =
'<div class="photoref">';
2926 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2927 $phototoshow .=
'</div>';
2930 } elseif (!$phototoshow) {
2931 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2935 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2936 $morehtmlleft .= $phototoshow;
2937 $morehtmlleft .=
'</div>';
2941 if (empty($phototoshow)) {
2942 if (
$object->element ==
'action') {
2944 $cssclass =
'photorefcenter';
2945 $nophoto =
img_picto(
'No photo',
'title_agenda');
2948 $cssclass =
'photorefcenter';
2950 $prefix =
'object_';
2954 if (strpos($picto,
'fontawesome_') !==
false) {
2957 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2959 $morehtmlleft .=
'<!-- No photo to show -->';
2960 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2961 $morehtmlleft .= $nophoto;
2962 $morehtmlleft .=
'</div></div>';
2969 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
2972 if (
$object->element ==
'societe') {
2973 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2976 $morehtmlstatus .=
$object->getLibStatut(6);
2978 } elseif (
$object->element ==
'product') {
2980 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2981 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2983 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2985 $morehtmlstatus .=
' ';
2987 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2988 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2990 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2992 } elseif (in_array(
$object->element, array(
'salary'))) {
2994 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2997 $morehtmlstatus .= $tmptxt;
2998 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
2999 $totalallpayments =
$object->getSommePaiement(0);
3000 $totalallpayments +=
$object->getSumCreditNotesUsed(0);
3001 $totalallpayments +=
$object->getSumDepositsUsed(0);
3002 $tmptxt =
$object->getLibStatut(6, $totalallpayments);
3003 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3004 $tmptxt =
$object->getLibStatut(5, $totalallpayments);
3006 $morehtmlstatus .= $tmptxt;
3007 } elseif (in_array(
$object->element, array(
'chargesociales',
'loan',
'tva'))) {
3009 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3012 $morehtmlstatus .= $tmptxt;
3013 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
3015 $morehtmlstatus .=
$object->getLibStatut(5);
3017 $morehtmlstatus .=
$object->getLibStatut(4);
3019 } elseif (
$object->element ==
'facturerec') {
3020 '@phan-var-force FactureRec $object';
3021 if (
$object->frequency == 0) {
3022 $morehtmlstatus .=
$object->getLibStatut(2);
3024 $morehtmlstatus .=
$object->getLibStatut(5);
3026 } elseif (
$object->element ==
'project_task') {
3031 if (
$object->progress >= 100) {
3034 $tmptxt =
$object->getLibStatut(5);
3035 $morehtmlstatus .= $tmptxt;
3036 } elseif (method_exists(
$object,
'getLibStatut')) {
3037 $tmptxt =
$object->getLibStatut(6);
3038 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
3039 $tmptxt =
$object->getLibStatut(5);
3041 $morehtmlstatus .= $tmptxt;
3045 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
3047 if (method_exists(
$object,
'getVentilExportCompta')) {
3048 $accounted =
$object->getVentilExportCompta();
3049 $langs->load(
"accountancy");
3050 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
3055 if (!empty(
$object->name_alias)) {
3056 '@phan-var-force Societe $object';
3057 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3061 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3063 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3067 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3070 $morehtmlref .=
'<div class="refidno refaddress">';
3071 $morehtmlref .= $moreaddress;
3072 $morehtmlref .=
'</div>';
3076 $morehtmlref .=
'<div style="clear: both;"></div>';
3077 $morehtmlref .=
'<div class="refidno opacitymedium">';
3078 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3079 $morehtmlref .=
'</div>';
3082 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3083 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3086 } elseif (empty($reshook)) {
3087 $morehtmlref .= $hookmanager->resPrint;
3088 } elseif ($reshook > 0) {
3089 $morehtmlref = $hookmanager->resPrint;
3097 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3098 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3100 print
'<div class="underrefbanner clearboth"></div>';
3112function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3116 if ($fieldrequired) {
3117 $ret .=
'<span class="fieldrequired">';
3119 $ret .=
'<label for="'.$fieldkey.
'">';
3120 $ret .= $langs->trans($langkey);
3122 if ($fieldrequired) {
3135function dol_bc($var, $moreclass =
'')
3138 $ret =
' '.$bc[$var];
3140 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
3160 global $langs, $hookmanager;
3163 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3168 $ret .= ($extralangcode ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->address)));
3171 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3173 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3174 $ret .= (($ret && $town) ? $sep :
'').$town;
3177 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3180 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3182 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3184 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3185 $ret .= ($ret ? $sep :
'').$town;
3187 $ret .= ($ret ?
", " :
'').
$object->state;
3190 $ret .= ($ret ? $sep :
'').
$object->zip;
3192 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3194 $ret .= ($ret ? $sep :
'').
$object->zip;
3195 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3196 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3198 $ret .= $sep.$object->state;
3200 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3203 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3205 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3207 $ret .= ($ret ? $sep :
'').
$object->zip;
3208 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3209 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3210 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3213 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3214 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3215 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3216 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3217 $ret .= ($ret ?
", " :
'').
$object->state;
3221 if (!is_object($outputlangs)) {
3222 $outputlangs = $langs;
3225 $langs->load(
"dict");
3226 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3229 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3230 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3234 $ret .= $hookmanager->resPrint;
3251function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3253 if ((abs($ts) <= 0x7FFFFFFF)) {
3256 return 'Error date outside supported range';
3281function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3283 global $conf, $langs;
3290 if ($tzoutput ===
'auto') {
3291 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
3296 $offsettz = $offsetdst = 0;
3299 if (is_string($tzoutput)) {
3300 if ($tzoutput ==
'tzserver') {
3302 $offsettzstring = @date_default_timezone_get();
3307 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3309 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3311 if (class_exists(
'DateTimeZone')) {
3312 $user_date_tz =
new DateTimeZone($offsettzstring);
3313 $user_dt =
new DateTime();
3314 $user_dt->setTimezone($user_date_tz);
3315 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3316 $offsettz = $user_dt->getOffset();
3318 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3319 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3324 if (!is_object($outputlangs)) {
3325 $outputlangs = $langs;
3328 $format =
'daytextshort';
3333 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3334 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3335 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3336 if ($formatwithoutreduce != $format) {
3337 $format = $formatwithoutreduce;
3343 if ($format ==
'day') {
3344 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
3345 } elseif ($format ==
'hour') {
3346 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
3347 } elseif ($format ==
'hourduration') {
3348 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
3349 } elseif ($format ==
'daytext') {
3350 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
3351 } elseif ($format ==
'daytextshort') {
3352 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
3353 } elseif ($format ==
'dayhour') {
3354 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
3355 } elseif ($format ==
'dayhoursec') {
3356 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
3357 } elseif ($format ==
'dayhourtext') {
3358 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
3359 } elseif ($format ==
'dayhourtextshort') {
3360 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
3361 } elseif ($format ==
'dayhourlog') {
3363 $format =
'%Y%m%d%H%M%S';
3364 } elseif ($format ==
'dayhourlogsmall') {
3366 $format =
'%y%m%d%H%M';
3367 } elseif ($format ==
'dayhourldap') {
3368 $format =
'%Y%m%d%H%M%SZ';
3369 } elseif ($format ==
'dayhourxcard') {
3370 $format =
'%Y%m%dT%H%M%SZ';
3371 } elseif ($format ==
'dayxcard') {
3373 } elseif ($format ==
'dayrfc') {
3374 $format =
'%Y-%m-%d';
3375 } elseif ($format ==
'dayhourrfc') {
3376 $format =
'%Y-%m-%dT%H:%M:%SZ';
3377 } elseif ($format ==
'standard') {
3378 $format =
'%Y-%m-%d %H:%M:%S';
3381 if ($reduceformat) {
3382 $format = str_replace(
'%Y',
'%y', $format);
3383 $format = str_replace(
'yyyy',
'yy', $format);
3387 if (preg_match(
'/%b/i', $format)) {
3389 $format = str_replace(
'%b',
'__b__', $format);
3390 $format = str_replace(
'%B',
'__B__', $format);
3392 if (preg_match(
'/%a/i', $format)) {
3394 $format = str_replace(
'%a',
'__a__', $format);
3395 $format = str_replace(
'%A',
'__A__', $format);
3400 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)) {
3401 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"]));
3403 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3405 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);
3408 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3409 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3410 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3411 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3412 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3413 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3415 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
3418 $tzo =
new DateTimeZone(
'UTC');
3420 $tzo =
new DateTimeZone(date_default_timezone_get());
3422 $dtts =
new DateTime();
3423 $dtts->setTimestamp($time);
3424 $dtts->setTimezone($tzo);
3425 $newformat = str_replace(
3426 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3427 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3430 $ret = $dtts->format($newformat);
3432 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3433 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3438 if ($time < 100000000000) {
3439 $timetouse = $time + $offsettz + $offsetdst;
3442 $tzo =
new DateTimeZone(
'UTC');
3444 $tzo =
new DateTimeZone(date_default_timezone_get());
3446 $dtts =
new DateTime();
3447 $dtts->setTimestamp($timetouse);
3448 $dtts->setTimezone($tzo);
3449 $newformat = str_replace(
3450 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3451 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3454 $ret = $dtts->format($newformat);
3456 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3457 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3462 $ret =
'Bad value '.$time.
' for date';
3466 if (preg_match(
'/__b__/i', $format)) {
3467 $timetouse = $time + $offsettz + $offsetdst;
3470 $tzo =
new DateTimeZone(
'UTC');
3472 $tzo =
new DateTimeZone(date_default_timezone_get());
3474 $dtts =
new DateTime();
3475 $dtts->setTimestamp($timetouse);
3476 $dtts->setTimezone($tzo);
3477 $month = (int) $dtts->format(
"m");
3478 $month = sprintf(
"%02d", $month);
3479 if ($encodetooutput) {
3480 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3481 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3483 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3484 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3487 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3488 $ret = str_replace(
'__B__', $monthtext, $ret);
3492 if (preg_match(
'/__a__/i', $format)) {
3494 $timetouse = $time + $offsettz + $offsetdst;
3497 $tzo =
new DateTimeZone(
'UTC');
3499 $tzo =
new DateTimeZone(date_default_timezone_get());
3501 $dtts =
new DateTime();
3502 $dtts->setTimestamp($timetouse);
3503 $dtts->setTimezone($tzo);
3504 $w = $dtts->format(
"w");
3505 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3507 $ret = str_replace(
'__A__', $dayweek, $ret);
3508 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3535function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3537 if ($timestamp ===
'') {
3541 $datetimeobj =
new DateTime();
3542 $datetimeobj->setTimestamp($timestamp);
3543 if ($forcetimezone) {
3544 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3547 'year' => ((
int) date_format($datetimeobj,
'Y')),
3548 'mon' => ((
int) date_format($datetimeobj,
'm')),
3549 'mday' => ((
int) date_format($datetimeobj,
'd')),
3550 'wday' => ((
int) date_format($datetimeobj,
'w')),
3551 'yday' => ((
int) date_format($datetimeobj,
'z')),
3552 'hours' => ((
int) date_format($datetimeobj,
'H')),
3553 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3554 'seconds' => ((
int) date_format($datetimeobj,
's')),
3582function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3587 if ($gm ===
'auto') {
3588 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3593 if ($hour == -1 || empty($hour)) {
3596 if ($minute == -1 || empty($minute)) {
3599 if ($second == -1 || empty($second)) {
3605 if (!$month || !$day) {
3614 if ($hour < 0 || $hour > 24) {
3617 if ($minute < 0 || $minute > 60) {
3620 if ($second < 0 || $second > 60) {
3625 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3626 $default_timezone = @date_default_timezone_get();
3627 $localtz =
new DateTimeZone($default_timezone);
3628 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3630 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3632 $localtz =
new DateTimeZone($default_timezone);
3634 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3635 $default_timezone = @date_default_timezone_get();
3637 } elseif (strrpos($gm,
"tz,") !==
false) {
3638 $timezone = str_replace(
"tz,",
"", $gm);
3640 $localtz =
new DateTimeZone($timezone);
3642 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3646 if (empty($localtz)) {
3647 $localtz =
new DateTimeZone(
'UTC');
3651 $dt =
new DateTime(
'now', $localtz);
3652 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3653 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3654 $date = $dt->getTimestamp();
3670function dol_now($mode =
'auto')
3674 if ($mode ===
'auto') {
3678 if ($mode ==
'gmt') {
3680 } elseif ($mode ==
'tzserver') {
3681 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3683 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3689 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3692 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3693 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3694 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3711 global $conf, $langs;
3714 if (!empty($conf->dol_optimize_smallscreen)) {
3719 if (empty($shortvalue) || $size < ($level * 10)) {
3721 $textunitshort = $langs->trans(
"b");
3722 $textunitlong = $langs->trans(
"Bytes");
3724 $ret = round($size / $level, 0);
3725 $textunitshort = $langs->trans(
"Kb");
3726 $textunitlong = $langs->trans(
"KiloBytes");
3729 if (empty($shortunit)) {
3730 $ret .=
' '.$textunitlong;
3732 $ret .=
' '.$textunitshort;
3748function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3756 $linkstart =
'<a href="';
3757 if (!preg_match(
'/^http/i', $url)) {
3758 $linkstart .=
'http://';
3763 $linkstart .=
' target="'.$target.
'"';
3765 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3769 if (!preg_match(
'/^http/i', $url)) {
3776 if ($morecss ==
'float') {
3777 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3779 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3795function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3797 global $user, $langs, $hookmanager;
3808 if (empty($email)) {
3812 if (!empty($addlink)) {
3813 $newemail =
'<a class="paddingrightonly" style="text-overflow: ellipsis;" href="';
3814 if (!preg_match(
'/^mailto:/i', $email)) {
3815 $newemail .=
'mailto:';
3817 $newemail .= $email;
3820 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3823 $newemail .=
'</a>';
3825 $langs->load(
"errors");
3826 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3829 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3831 $linktoaddaction =
'';
3833 $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>';
3835 if ($linktoaddaction) {
3836 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3840 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3843 $langs->load(
"errors");
3844 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3854 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3856 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3860 $rep .= $hookmanager->resPrint;
3875 $socialnetworks = array();
3877 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3878 $cachekey =
'socialnetworks_' . $conf->entity;
3880 if (!is_null($dataretrieved)) {
3881 $socialnetworks = $dataretrieved;
3883 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3884 $sql .=
" WHERE entity=".$conf->entity;
3885 $resql = $db->query($sql);
3887 while ($obj = $db->fetch_object($resql)) {
3888 $socialnetworks[$obj->code] = array(
3889 'rowid' => $obj->rowid,
3890 'label' => $obj->label,
3892 'icon' => $obj->icon,
3893 'active' => $obj->active,
3899 return $socialnetworks;
3914 global $user, $langs;
3918 if (empty($value)) {
3922 if (!empty($type)) {
3923 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3925 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3926 if ($type ==
'skype') {
3928 $htmllink .=
' <a href="skype:';
3930 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3931 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3932 $htmllink .=
'</a><a href="skype:';
3934 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3935 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3936 $htmllink .=
'</a>';
3937 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3938 $addlink =
'AC_SKYPE';
3941 $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>';
3943 $htmllink .= ($link ?
' '.$link :
'');
3946 if (!empty($dictsocialnetworks[$type][
'url'])) {
3947 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3948 if (preg_match(
'/^https?:\/\//i', $value)) {
3949 $htmllink .=
'<a href="'.dol_sanitizeUrl($value, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3951 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3957 $htmllink .=
'</div>';
3971function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
3975 if (empty($profID) || empty($profIDtype)) {
3978 if (empty($countrycode)) {
3979 $countrycode = $mysoc->country_code;
3981 $newProfID = $profID;
3982 $id = substr($profIDtype, -1);
3984 if (strtoupper($countrycode) ==
'FR') {
3988 if ($id == 1 &&
dol_strlen($newProfID) == 9) {
3990 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
3992 if ($id == 2 &&
dol_strlen($newProfID) == 14) {
3994 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
3996 if ($id == 3 &&
dol_strlen($newProfID) == 5) {
3998 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
4000 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
4002 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
4005 if (!empty($addcpButton)) {
4028function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'')
4030 global $conf, $user, $langs, $mysoc, $hookmanager;
4033 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
4034 if (empty($phone)) {
4040 if (empty($countrycode) && is_object($mysoc)) {
4041 $countrycode = $mysoc->country_code;
4045 if (!empty($conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4050 $newphonewa = $phone;
4051 if (strtoupper($countrycode) ==
"FR") {
4054 $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);
4056 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4058 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4060 $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);
4062 $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);
4064 $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);
4066 } elseif (strtoupper($countrycode) ==
"CA") {
4068 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4070 } elseif (strtoupper($countrycode) ==
"PT") {
4072 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4074 } elseif (strtoupper($countrycode) ==
"SR") {
4076 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4078 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4080 } elseif (strtoupper($countrycode) ==
"DE") {
4082 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4084 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4086 } elseif (strtoupper($countrycode) ==
"ES") {
4088 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4090 } elseif (strtoupper($countrycode) ==
"BF") {
4092 $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);
4094 } elseif (strtoupper($countrycode) ==
"RO") {
4096 $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);
4098 } elseif (strtoupper($countrycode) ==
"TR") {
4100 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4102 } elseif (strtoupper($countrycode) ==
"US") {
4104 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4106 } elseif (strtoupper($countrycode) ==
"MX") {
4108 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4110 $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);
4112 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4114 } elseif (strtoupper($countrycode) ==
"ML") {
4116 $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);
4118 } elseif (strtoupper($countrycode) ==
"TH") {
4120 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4122 $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);
4124 } elseif (strtoupper($countrycode) ==
"MU") {
4127 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4129 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4131 } elseif (strtoupper($countrycode) ==
"ZA") {
4133 $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);
4135 } elseif (strtoupper($countrycode) ==
"SY") {
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 $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);
4141 } elseif (strtoupper($countrycode) ==
"AE") {
4143 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4145 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4147 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4149 } elseif (strtoupper($countrycode) ==
"DZ") {
4151 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4153 } elseif (strtoupper($countrycode) ==
"BE") {
4155 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4157 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4159 } elseif (strtoupper($countrycode) ==
"PF") {
4161 $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);
4163 } elseif (strtoupper($countrycode) ==
"CO") {
4165 $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);
4167 } elseif (strtoupper($countrycode) ==
"JO") {
4169 $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);
4171 } elseif (strtoupper($countrycode) ==
"JM") {
4173 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4175 } elseif (strtoupper($countrycode) ==
"MG") {
4177 $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);
4179 } elseif (strtoupper($countrycode) ==
"GB") {
4181 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4183 } elseif (strtoupper($countrycode) ==
"CH") {
4185 $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);
4187 $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);
4189 } elseif (strtoupper($countrycode) ==
"TN") {
4191 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4193 } elseif (strtoupper($countrycode) ==
"GF") {
4195 $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);
4197 } elseif (strtoupper($countrycode) ==
"GP") {
4199 $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);
4201 } elseif (strtoupper($countrycode) ==
"MQ") {
4203 $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);
4205 } elseif (strtoupper($countrycode) ==
"IT") {
4207 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4209 $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);
4211 } elseif (strtoupper($countrycode) ==
"AU") {
4215 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4217 } elseif (strtoupper($countrycode) ==
"LU") {
4220 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4222 $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);
4224 $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);
4226 $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);
4228 } elseif (strtoupper($countrycode) ==
"PE") {
4231 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4233 $newphonewa =
'+51'.$newphone;
4234 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4236 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4238 $newphonewa = $newphone;
4239 $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);
4243 $newphoneastart = $newphoneaend =
'';
4244 if (!empty($addlink)) {
4245 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4246 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4247 $newphoneaend .=
'</a>';
4248 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4249 if (empty($user->clicktodial_loaded)) {
4250 $user->fetch_clicktodial();
4254 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4255 if (!empty($user->clicktodial_url)) {
4256 $urlmask = $user->clicktodial_url;
4259 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4260 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4261 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4263 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4265 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4266 '__PHONETO__' => urlencode($phone),
4267 '__LOGIN__' => $clicktodial_login,
4268 '__PASS__' => $clicktodial_password);
4272 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4273 $newphoneaend =
'</a>';
4276 $newphoneastart =
'<a href="'.$url.
'"';
4278 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4280 $newphoneastart .=
'>';
4281 $newphoneaend .=
'</a>';
4286 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4288 $addlinktoagenda =
'';
4289 if ($addlink ==
'AC_FAX') {
4293 $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>';
4295 if ($addlinktoagenda) {
4296 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4301 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4303 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4304 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4307 if (empty($titlealt)) {
4308 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4313 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4314 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4315 $rep .= $hookmanager->resPrint;
4317 if (empty($reshook)) {
4320 if ($withpicto ==
'fax') {
4321 $picto =
'phoning_fax';
4322 } elseif ($withpicto ==
'phone') {
4324 } elseif ($withpicto ==
'mobile') {
4325 $picto =
'phoning_mobile';
4330 if ($adddivfloat == 1) {
4331 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">';
4332 } elseif (empty($adddivfloat)) {
4333 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
' style="margin-right: 10px;">';
4336 $rep .= $newphoneastart;
4337 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4338 if ($separ !=
'hidenum') {
4339 $rep .= ($withpicto ?
' ' :
'').$newphone;
4341 $rep .= $newphoneaend;
4343 if ($adddivfloat == 1) {
4345 } elseif (empty($adddivfloat)) {
4373 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4374 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
4376 $ret .=
' ('.$countrycode.
')';
4396 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4397 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4398 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4399 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4401 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4404 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
4407 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
4423 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4425 } 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') {
4443 if (!empty($conf->geoipmaxmind->enabled)) {
4447 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4448 $geoip =
new DolGeoIP(
'country', $datafile);
4450 $countrycode = $geoip->getCountryCodeFromIP($ip);
4453 return $countrycode;
4465 global $conf, $langs, $user;
4469 if (!empty($conf->geoipmaxmind->enabled)) {
4474 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4475 $geoip =
new DolGeoIP(
'country', $datafile);
4476 $countrycode = $geoip->getCountryCodeFromIP($ip);
4477 $ret = $countrycode;
4494function dol_print_address($address, $htmlid, $element, $id, $noprint = 0, $charfornl =
'')
4496 global $conf, $user, $langs, $hookmanager;
4502 $parameters = array(
'element' => $element,
'id' => $id);
4503 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4504 $out .= $hookmanager->resPrint;
4506 if (empty($reshook)) {
4507 if (empty($charfornl)) {
4508 $out .= nl2br($address);
4510 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4514 $showgmap = $showomap = 0;
4515 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4518 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4521 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4524 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4527 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4530 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4533 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4536 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4540 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
4541 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4544 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
4545 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4566function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4568 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4571 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4574 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4592 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4593 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4596 if (function_exists(
'getmxrr')) {
4599 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4600 if (count($mxhosts) > 1) {
4603 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
4640 $tmparray = explode(
' ', $s);
4641 foreach ($tmparray as $tmps) {
4656function dol_strlen($string, $stringencoding =
'UTF-8')
4658 if (is_null($string)) {
4662 if (function_exists(
'mb_strlen')) {
4663 return mb_strlen($string, $stringencoding);
4665 return strlen($string);
4679function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4683 if (empty($stringencoding)) {
4684 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
4688 if (empty($trunconbytes)) {
4689 if (function_exists(
'mb_substr')) {
4690 $ret = mb_substr($string, $start, $length, $stringencoding);
4692 $ret = substr($string, $start, $length);
4695 if (function_exists(
'mb_strcut')) {
4696 $ret = mb_strcut($string, $start, $length, $stringencoding);
4698 $ret = substr($string, $start, $length);
4718function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4726 if (empty($stringencoding)) {
4727 $stringencoding =
'UTF-8';
4730 if (!empty($conf->dol_optimize_smallscreen) && $conf->dol_optimize_smallscreen == 1 && $display == 1) {
4731 $size = round($size / 3);
4735 if ($trunc ==
'right') {
4737 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4739 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4744 } elseif ($trunc ==
'middle') {
4746 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4747 $size1 = round($size / 2);
4748 $size2 = round($size / 2);
4749 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4753 } elseif ($trunc ==
'left') {
4755 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4757 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4761 } elseif ($trunc ==
'wrap') {
4763 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4769 return 'BadParam3CallingDolTrunc';
4783 $type2picto = array(
4784 'varchar' =>
'font',
4787 'int' =>
'sort-numeric-down',
4788 'double' =>
'sort-numeric-down',
4789 'price' =>
'currency',
4790 'pricecy' =>
'multicurrency',
4791 'password' =>
'key',
4792 'boolean' =>
'check-square',
4793 'date' =>
'calendar',
4794 'datetime' =>
'calendar',
4800 'sellist' =>
'list',
4801 'radio' =>
'check-circle',
4802 'checkbox' =>
'list',
4803 'chkbxlst' =>
'list',
4805 'icon' =>
"question",
4806 'point' =>
"country",
4807 'multipts' =>
'country',
4808 'linestrg' =>
"country",
4809 'polygon' =>
"country",
4810 'separate' =>
'minus'
4813 if (!empty($type2picto[$key])) {
4814 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4817 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4842function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4847 $url = DOL_URL_ROOT;
4848 $theme = isset($conf->theme) ? $conf->theme :
null;
4849 $path =
'theme/'.$theme;
4850 if (empty($picto)) {
4855 if ($pictoisfullpath) {
4857 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4860 $fullpathpicto = $picto;
4862 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4863 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4864 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4867 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', (is_null($picto) ?
'' : $picto));
4868 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4869 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4871 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
4873 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4874 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4877 if ($pictowithouttext ==
'file-o') {
4878 $pictowithouttext =
'file';
4881 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4882 $marginleftonlyshort = 0;
4884 if (!empty($pictowithouttextarray[1])) {
4886 $fakey =
'fa-'.$pictowithouttextarray[0];
4887 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
4888 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4889 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4891 $fakey =
'fa-'.$pictowithouttext;
4901 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4902 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4903 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4905 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4906 $morestyle = $reg[1];
4907 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4909 $moreatt = trim($moreatt);
4911 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4912 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4916 $enabledisablehtml .=
'</span>';
4918 return $enabledisablehtml;
4921 if (empty($srconly) && in_array($pictowithouttext, array(
4922 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4923 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
4924 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
4925 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4926 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4927 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
4928 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
4929 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
4930 'commercial',
'companies',
4931 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4932 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4933 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
4934 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4935 'hands-helping',
'help',
'holiday',
4936 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4937 'key',
'knowledgemanagement',
4938 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4939 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4940 'off',
'on',
'order',
4941 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4942 'stock',
'resize',
'service',
'stats',
4943 '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',
4944 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4945 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4946 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4947 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4948 'technic',
'ticket',
4950 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4951 'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4952 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
4953 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4954 'conferenceorbooth',
'eventorganization',
4955 'stamp',
'signature',
4958 $fakey = $pictowithouttext;
4962 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'))) {
4965 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4969 $arrayconvpictotofa = array(
4970 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
4971 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
4972 'bank_account' =>
'university',
4973 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
4974 'bookcal' =>
'calendar-check',
4975 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
4977 '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',
4978 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
4979 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
4980 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
4981 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
4982 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
4983 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
4984 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
4985 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
4986 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
4987 'info' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
4988 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
4989 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
4990 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
4991 'sign-out' =>
'sign-out-alt',
4992 'switch_off' =>
'toggle-off',
'switch_on' =>
'toggle-on',
'switch_on_warning' =>
'toggle-on',
'switch_on_red' =>
'toggle-on',
'check' =>
'check',
'bookmark' =>
'star',
4993 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
4994 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
4995 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
4996 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
4997 'other' =>
'square',
4998 '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',
4999 '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',
5000 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
5001 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
5002 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
5003 'service' =>
'concierge-bell',
5004 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
5005 'status' =>
'stop-circle',
5006 'stripe' =>
'stripe-s',
'supplier' =>
'building',
5007 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
5008 'title_agenda' =>
'calendar-alt',
5009 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
5010 'jabber' =>
'comment-o',
5011 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
5012 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
5013 'webportal' =>
'door-open'
5015 if ($conf->currency ==
'EUR') {
5016 $arrayconvpictotofa[
'currency'] =
'euro-sign';
5017 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
5019 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
5020 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
5022 if ($pictowithouttext ==
'off') {
5023 $fakey =
'fa-square';
5025 } elseif ($pictowithouttext ==
'on') {
5026 $fakey =
'fa-check-square';
5028 } elseif ($pictowithouttext ==
'listlight') {
5029 $fakey =
'fa-download';
5030 $marginleftonlyshort = 1;
5031 } elseif ($pictowithouttext ==
'printer') {
5032 $fakey =
'fa-print';
5034 } elseif ($pictowithouttext ==
'note') {
5035 $fakey =
'fa-sticky-note';
5036 $marginleftonlyshort = 1;
5037 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5038 $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');
5039 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5040 if (preg_match(
'/selected/', $pictowithouttext)) {
5043 $marginleftonlyshort = 1;
5044 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5045 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5047 $fakey =
'fa-'.$pictowithouttext;
5050 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5051 $morecss .=
' em092';
5053 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
5054 $morecss .=
' em088';
5056 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5057 $morecss .=
' em080';
5061 $arrayconvpictotomarginleftonly = array(
5062 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5063 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
5064 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5066 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
5067 $marginleftonlyshort = 0;
5071 $arrayconvpictotomorcess = array(
5072 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5073 'bank_account' =>
'infobox-bank_account',
5074 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5075 'bookcal' =>
'infobox-action',
5076 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5077 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5078 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5079 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5080 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5081 'incoterm' =>
'infobox-supplier_proposal',
5082 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5083 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5084 'order' =>
'infobox-commande',
5085 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5086 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5087 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'invoice' =>
'infobox-commande',
5088 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5089 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5090 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5091 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5092 'resource' =>
'infobox-action',
5093 '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',
5094 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5095 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5096 'vat' =>
'infobox-bank_account',
5098 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode'
5100 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5101 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5105 $arrayconvpictotocolor = array(
5106 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5107 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5108 'dynamicprice' =>
'#a69944',
5109 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5111 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5112 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5113 'other' =>
'#ddd',
'world' =>
'#986c6a',
5114 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5116 'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5117 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5118 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5119 'website' =>
'#304',
'workstation' =>
'#a69944'
5121 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5122 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5129 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5130 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5131 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5133 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5134 $morestyle = $reg[1];
5135 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5137 $moreatt = trim($moreatt);
5139 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5140 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5144 $enabledisablehtml .=
'</span>';
5146 return $enabledisablehtml;
5153 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
5154 $path = $theme.
'/theme/'.$theme;
5159 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5165 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5170 foreach ($conf->file->dol_document_root as $type => $dirroot) {
5171 if ($type ==
'main') {
5175 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5176 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5182 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5186 return $fullpathpicto;
5190 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 :
'').
'"').
'>';
5206function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0)
5208 if (strpos($picto,
'^') === 0) {
5209 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
5211 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
5226function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5230 if (is_numeric($picto)) {
5233 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5234 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5238 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
5240 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5254function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5258 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5262 if ($pictoisfullpath) {
5265 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5268 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
5270 if (file_exists($themepath)) {
5276 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5292function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5296 if (empty($titlealt) || $titlealt ==
'default') {
5297 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5299 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5300 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5302 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5303 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5305 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5306 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5308 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5309 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5311 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5313 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5317 if (!is_numeric($numaction)) {
5321 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5331function img_pdf($titlealt =
'default', $size = 3)
5335 if ($titlealt ==
'default') {
5336 $titlealt = $langs->trans(
'Show');
5339 return img_picto($titlealt,
'pdf'.$size.
'.png');
5349function img_edit_add($titlealt =
'default', $other =
'')
5353 if ($titlealt ==
'default') {
5354 $titlealt = $langs->trans(
'Add');
5357 return img_picto($titlealt,
'edit_add.png', $other);
5370 if ($titlealt ==
'default') {
5371 $titlealt = $langs->trans(
'Remove');
5374 return img_picto($titlealt,
'edit_remove.png', $other);
5385function img_edit($titlealt =
'default', $float = 0, $other =
'')
5389 if ($titlealt ==
'default') {
5390 $titlealt = $langs->trans(
'Modify');
5393 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5404function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5408 if ($titlealt ==
'default') {
5409 $titlealt = $langs->trans(
'View');
5412 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5414 return img_picto($titlealt,
'eye', $moreatt);
5425function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5429 if ($titlealt ==
'default') {
5430 $titlealt = $langs->trans(
'Delete');
5433 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5443function img_printer($titlealt =
"default", $other =
'')
5446 if ($titlealt ==
"default") {
5447 $titlealt = $langs->trans(
"Print");
5449 return img_picto($titlealt,
'printer.png', $other);
5459function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5463 if ($titlealt ==
'default') {
5464 $titlealt = $langs->trans(
'Split');
5467 return img_picto($titlealt,
'split.png', $other);
5477function img_help($usehelpcursor = 1, $usealttitle = 1)
5482 if (is_string($usealttitle)) {
5485 $usealttitle = $langs->trans(
'Info');
5489 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5498function img_info($titlealt =
'default')
5502 if ($titlealt ==
'default') {
5503 $titlealt = $langs->trans(
'Informations');
5506 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5517function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5521 if ($titlealt ==
'default') {
5522 $titlealt = $langs->trans(
'Warning');
5526 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5535function img_error($titlealt =
'default')
5539 if ($titlealt ==
'default') {
5540 $titlealt = $langs->trans(
'Error');
5543 return img_picto($titlealt,
'error.png');
5553function img_next($titlealt =
'default', $moreatt =
'')
5557 if ($titlealt ==
'default') {
5558 $titlealt = $langs->trans(
'Next');
5562 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5572function img_previous($titlealt =
'default', $moreatt =
'')
5576 if ($titlealt ==
'default') {
5577 $titlealt = $langs->trans(
'Previous');
5581 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5592function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5596 if ($titlealt ==
'default') {
5597 $titlealt = $langs->trans(
'Down');
5600 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5611function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5615 if ($titlealt ==
'default') {
5616 $titlealt = $langs->trans(
'Up');
5619 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5630function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5634 if ($titlealt ==
'default') {
5635 $titlealt = $langs->trans(
'Left');
5638 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5649function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5653 if ($titlealt ==
'default') {
5654 $titlealt = $langs->trans(
'Right');
5657 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5667function img_allow($allow, $titlealt =
'default')
5671 if ($titlealt ==
'default') {
5672 $titlealt = $langs->trans(
'Active');
5676 return img_picto($titlealt,
'tick.png');
5691 if (is_null($morecss)) {
5695 if ($brand ==
'visa' || $brand ==
'Visa') {
5697 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5698 $brand =
'cc-mastercard';
5699 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5701 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5702 $brand =
'cc-discover';
5703 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5705 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5706 $brand =
'cc-diners-club';
5707 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5708 $brand =
'credit-card';
5711 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5722function img_mime($file, $titlealt =
'', $morecss =
'')
5724 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5730 if (empty($titlealt)) {
5731 $titlealt =
'Mime type: '.$mimetype;
5735 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5746function img_search($titlealt =
'default', $other =
'')
5750 if ($titlealt ==
'default') {
5751 $titlealt = $langs->trans(
'Search');
5754 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
5756 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5757 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5773 if ($titlealt ==
'default') {
5774 $titlealt = $langs->trans(
'Search');
5777 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
5779 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5780 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5797function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
5799 global $conf, $langs;
5801 if ($infoonimgalt) {
5802 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5804 if (empty($conf->use_javascript_ajax)) {
5805 $textfordropdown =
'';
5808 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5809 $fa =
'info-circle';
5810 if ($picto ==
'warning') {
5811 $fa =
'exclamation-triangle';
5813 $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> ';
5815 $result .= ($nodiv ?
'' :
'</div>');
5817 if ($textfordropdown) {
5818 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5819 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5820 jQuery(document).ready(function() {
5821 jQuery(".'.$class.
'text").click(function() {
5822 console.log("toggle text");
5823 jQuery(".'.$class.
'").toggle();
5828 $result = $tmpresult.$result;
5849 global $conf, $langs, $user, $argv;
5850 global $dolibarr_main_prod;
5857 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5859 $langs->load(
"main");
5863 $langs->loadLangs(array(
'main',
'errors'));
5865 if ($_SERVER[
'DOCUMENT_ROOT']) {
5866 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5868 $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";
5870 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5872 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5873 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5874 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5875 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5877 if ($user instanceof
User) {
5878 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
5880 if (function_exists(
"phpversion")) {
5881 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5883 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5884 if (function_exists(
"php_uname")) {
5885 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5887 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5889 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5890 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5891 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5893 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5894 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5896 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5897 $syslog .=
"pid=".dol_getmypid();
5900 if (!empty($conf->modules)) {
5901 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ', $conf->modules).
"<br>\n";
5904 if (is_object($db)) {
5905 if ($_SERVER[
'DOCUMENT_ROOT']) {
5906 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5907 $lastqueryerror = $db->lastqueryerror();
5909 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5911 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5912 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5913 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5917 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5918 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5919 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5920 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5922 $syslog .=
", sql=".$db->lastquery();
5923 $syslog .=
", db_error=".$db->lasterror();
5926 if ($error || $errors) {
5928 if (is_array($error) && is_array($errors)) {
5929 $errors = array_merge($error, $errors);
5930 } elseif (is_array($error)) {
5932 } elseif (is_array($errors) && !empty($error)) {
5933 $errors = array_merge(array($error), $errors);
5934 } elseif (!empty($error)) {
5935 $errors = array_merge(array($error), array($errors));
5938 $langs->load(
"errors");
5940 foreach ($errors as $msg) {
5944 if ($_SERVER[
'DOCUMENT_ROOT']) {
5947 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5949 $syslog .=
", msg=".$msg;
5952 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5953 xdebug_print_function_stack();
5954 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
5955 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5956 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5957 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5962 if (!headers_sent()) {
5963 if (function_exists(
'top_httphead')) {
5967 http_response_code(202);
5970 if (empty($dolibarr_main_prod)) {
5973 if (empty($langs->defaultlang)) {
5974 $langs->setDefaultLang();
5976 $langs->loadLangs(array(
"main",
"errors"));
5978 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";
5979 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5980 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5981 if (!defined(
"MAIN_CORE_ERROR")) {
5982 define(
"MAIN_CORE_ERROR", 1);
5999function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
6003 if (empty($email)) {
6007 $langs->load(
"errors");
6010 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
6011 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
6012 if ($errormessage) {
6013 print
'<br><br>'.$errormessage;
6015 if (is_array($errormessages) && count($errormessages)) {
6016 foreach ($errormessages as $mesgtoshow) {
6017 print
'<br><br>'.$mesgtoshow;
6020 print
'</div></div>';
6039function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6041 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6062function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6064 global $langs, $form;
6067 if ($moreattrib ==
'class="right"') {
6068 $prefix .=
'right ';
6071 $sortorder = strtoupper($sortorder);
6080 $tmpsortfield = explode(
',', $sortfield);
6081 $sortfield1 = trim($tmpsortfield[0]);
6082 $tmpfield = explode(
',', $field);
6083 $field1 = trim($tmpfield[0]);
6085 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6086 $prefix =
'wrapcolumntitle '.$prefix;
6092 $liste_titre =
'liste_titre';
6093 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6094 $liste_titre =
'liste_titre_sel';
6097 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6102 if (empty($thead) && $field && empty($disablesortlink)) {
6103 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6104 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6105 $options = preg_replace(
'/&+/i',
'&', $options);
6106 if (!preg_match(
'/^&/', $options)) {
6107 $options =
'&'.$options;
6110 $sortordertouseinlink =
'';
6111 if ($field1 != $sortfield1) {
6112 if (preg_match(
'/^DESC/i', $sortorder)) {
6113 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6115 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6118 if (preg_match(
'/^ASC/i', $sortorder)) {
6119 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6121 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6124 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6125 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
6131 if (preg_match(
'/:\w+$/', $tooltip)) {
6132 $tmptooltip = explode(
':', $tooltip);
6134 $tmptooltip = array($tooltip);
6136 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6138 $out .= $langs->trans($name);
6141 if (empty($thead) && $field && empty($disablesortlink)) {
6145 if (empty($thead) && $field) {
6146 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6147 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6148 $options = preg_replace(
'/&+/i',
'&', $options);
6149 if (!preg_match(
'/^&/', $options)) {
6150 $options =
'&'.$options;
6153 if (!$sortorder || ($field1 != $sortfield1)) {
6157 if (preg_match(
'/^DESC/', $sortorder)) {
6160 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6162 if (preg_match(
'/^ASC/', $sortorder)) {
6165 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6170 $tagend =
'</'.$tag.
'>';
6172 $out = $tagstart.$sortimg.$out.$tagend;
6187 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6189 print
'<div class="titre">'.$title.
'</div>';
6203function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'')
6221function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6225 if ($picto ==
'setup') {
6230 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6231 $return .=
'<tr class="titre">';
6233 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6235 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6236 $return .=
'<div class="titre inline-block">';
6238 $return .=
'</div>';
6241 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6244 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6246 $return .=
'</tr></table>'.
"\n";
6274function 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 =
'')
6279 $savtotalnboflines = $totalnboflines;
6280 if (is_numeric($totalnboflines)) {
6281 $totalnboflines = abs($totalnboflines);
6284 $page = (int) $page;
6286 if ($picto ==
'setup') {
6287 $picto =
'title_setup.png';
6289 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
6290 $picto =
'title.gif';
6293 $limit = $conf->liste_limit;
6296 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6304 print
"<!-- Begin title -->\n";
6305 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
6309 if ($picto && $title) {
6310 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
6313 print
'<td class="nobordernopadding valignmiddle col-title">';
6314 print
'<div class="titre inline-block">';
6316 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
6317 print
'<span class="opacitymedium colorblack paddingleft totalnboflines">('.$totalnboflines.
')</span>';
6319 print
'</div></td>';
6322 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
6323 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6327 print
'<td class="nobordernopadding valignmiddle right col-right">';
6328 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6330 $options .=
"&sortfield=".urlencode($sortfield);
6333 $options .=
"&sortorder=".urlencode($sortorder);
6337 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6338 if ($totalnboflines) {
6340 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
6343 $nbpages = ceil($totalnboflines / $limit);
6347 $cpt = ($page - $maxnbofpage);
6353 if (empty($pagenavastextinput)) {
6354 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6356 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6357 } elseif ($cpt == 2) {
6358 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6364 if ($pagenavastextinput) {
6365 if ($cpt == $page) {
6366 $pagelist .=
'<li class="pagination pageplusone valignmiddle"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
6370 if ($cpt == $page) {
6371 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6373 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6377 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6379 if (empty($pagenavastextinput)) {
6380 if ($cpt < $nbpages) {
6381 if ($cpt < $nbpages - 2) {
6382 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6383 } elseif ($cpt == $nbpages - 2) {
6384 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6386 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6390 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6393 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6397 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6398 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
6402 if ($pagenavastextinput) {
6409 print
'</table>'.
"\n";
6412 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
6413 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6416 print
"<!-- End title -->\n\n";
6435function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
6437 global $conf, $langs;
6439 print
'<div class="pagination"><ul>';
6440 if ($beforearrows) {
6441 print
'<li class="paginationbeforearrows">';
6442 print $beforearrows;
6446 if (empty($hidenavigation)) {
6447 if ((
int) $limit > 0 && empty($hideselectlimit)) {
6448 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6449 $pagesizechoices .=
',5000:5000,10000:10000';
6458 print
'<li class="pagination">';
6459 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.
'">';
6460 print
'<datalist id="limitlist">';
6462 print
'<li class="paginationcombolimit valignmiddle">';
6463 print
'<select id="limit" class="flat selectlimit nopadding maxwidth75 center" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
6465 $tmpchoice = explode(
',', $pagesizechoices);
6466 $tmpkey = $limit.
':'.$limit;
6467 if (!in_array($tmpkey, $tmpchoice)) {
6468 $tmpchoice[] = $tmpkey;
6470 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
6471 if (!in_array($tmpkey, $tmpchoice)) {
6472 $tmpchoice[] = $tmpkey;
6474 asort($tmpchoice, SORT_NUMERIC);
6475 foreach ($tmpchoice as $val) {
6477 $tmp = explode(
':', $val);
6480 if ($key !=
'' && $val !=
'') {
6481 if ((
int) $key == (
int) $limit) {
6482 $selected =
' selected="selected"';
6484 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6488 print
'</datalist>';
6491 print
ajax_combobox(
"limit", array(), 0, 0,
'resolve', -1,
'limit');
6495 if ($conf->use_javascript_ajax) {
6496 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6498 jQuery(document).ready(function () {
6499 jQuery(".selectlimit").change(function() {
6500 console.log("Change limit. Send submit");
6501 $(this).parents(\'form:first\').submit();
6510 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>';
6512 if ($betweenarrows) {
6513 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6514 print $betweenarrows;
6515 print
'<!--</div>-->';
6517 if ($nextpage > 0) {
6518 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>';
6521 print
'<li class="paginationafterarrows">';
6526 print
'</ul></div>'.
"\n";
6541function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6545 if (preg_match(
'/%/', $rate)) {
6546 $rate = str_replace(
'%',
'', $rate);
6550 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6551 $morelabel =
' ('.$reg[1].
')';
6552 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6553 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6555 if (preg_match(
'/\*/', $rate)) {
6556 $rate = str_replace(
'*',
'', $rate);
6561 if (!preg_match(
'/\//', $rate)) {
6562 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6565 $ret = $rate.($addpercent ?
'%' :
'');
6567 if (($info_bits & 1) && $usestarfornpr >= 0) {
6590function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6592 global $langs, $conf;
6595 if (empty($amount)) {
6598 $amount = (is_numeric($amount) ? $amount : 0);
6599 if ($rounding == -1) {
6602 $nbdecimal = $rounding;
6604 if ($outlangs ===
'none') {
6614 if (!($outlangs instanceof
Translate)) {
6618 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6619 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6621 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6622 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6624 if ($thousand ==
'None') {
6626 } elseif ($thousand ==
'Space') {
6633 $amount = str_replace(
',',
'.', $amount);
6635 $data = explode(
'.', $amount);
6636 $decpart = isset($data[1]) ? $data[1] :
'';
6637 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6647 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6648 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6649 $nbdecimal = $nbdecimalmaxshown;
6657 if ((
string) $forcerounding !=
'-1') {
6658 if ($forcerounding ===
'MU') {
6660 } elseif ($forcerounding ===
'MT') {
6662 } elseif ($forcerounding >= 0) {
6663 $nbdecimal = $forcerounding;
6668 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
6670 $output = preg_replace(
'/\s/',
' ', $output);
6671 $output = preg_replace(
'/\'/',
''', $output);
6674 $cursymbolbefore = $cursymbolafter =
'';
6675 if ($currency_code && is_object($outlangs)) {
6676 if ($currency_code ==
'auto') {
6677 $currency_code = $conf->currency;
6680 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6681 $listoflanguagesbefore = array(
'nl_NL');
6682 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6683 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6685 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6686 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6689 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6718function price2num($amount, $rounding =
'', $option = 0)
6720 global $langs, $conf;
6723 if (is_null($amount)) {
6732 if (is_null($langs)) {
6736 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6737 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6739 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6740 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6743 if ($thousand ==
'None') {
6745 } elseif ($thousand ==
'Space') {
6753 if (!is_numeric($amount)) {
6754 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6757 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6758 $amount = str_replace($thousand,
'', $amount);
6764 if (is_numeric($amount)) {
6766 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6767 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6769 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6774 if ($thousand !=
',' && $thousand !=
'.') {
6775 $amount = str_replace(
',',
'.', $amount);
6778 $amount = str_replace(
' ',
'', $amount);
6779 $amount = str_replace($thousand,
'', $amount);
6780 $amount = str_replace($dec,
'.', $amount);
6782 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6788 $nbofdectoround =
'';
6789 if ($rounding ==
'MU') {
6791 } elseif ($rounding ==
'MT') {
6793 } elseif ($rounding ==
'MS') {
6794 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6795 } elseif ($rounding ==
'CU') {
6797 } elseif ($rounding ==
'CT') {
6799 } elseif (is_numeric($rounding)) {
6800 $nbofdectoround = (int) $rounding;
6805 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6807 return 'ErrorBadParameterProvidedToFunction';
6813 if (is_numeric($amount)) {
6815 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6816 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6818 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6824 if ($thousand !=
',' && $thousand !=
'.') {
6825 $amount = str_replace(
',',
'.', $amount);
6828 $amount = str_replace(
' ',
'', $amount);
6829 $amount = str_replace($thousand,
'', $amount);
6830 $amount = str_replace($dec,
'.', $amount);
6832 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6850function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6852 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6854 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6855 $dimension *= 1000000;
6857 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6860 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6861 $dimension /= 1000000;
6863 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6880 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6882 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6900function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
6902 global $db, $conf, $mysoc;
6904 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6905 $thirdparty_seller = $mysoc;
6908 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);
6910 $vatratecleaned = $vatrate;
6912 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
6913 $vatratecleaned = trim($reg[1]);
6914 $vatratecode = $reg[2];
6923 if ($mysoc->country_code ==
'ES') {
6925 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6928 if ($thirdparty_seller->id == $mysoc->id) {
6929 if (!$thirdparty_buyer->localtax1_assuj) {
6933 if (!$thirdparty_seller->localtax1_assuj) {
6941 if (!$mysoc->localtax2_assuj) {
6944 if ($thirdparty_seller->id == $mysoc->id) {
6945 if (!$thirdparty_buyer->localtax2_assuj) {
6949 if (!$thirdparty_seller->localtax2_assuj) {
6955 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6958 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6964 if (in_array($mysoc->country_code, array(
'ES'))) {
6965 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6971 if ($thirdparty_seller != $mysoc) {
6973 return $thirdparty_seller->localtax1_value;
6977 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6982 if ($thirdparty_seller != $mysoc) {
6985 return $thirdparty_seller->localtax2_value;
6988 if (in_array($mysoc->country_code, array(
'ES'))) {
6989 return $thirdparty_buyer->localtax2_value;
6991 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6998 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6999 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7000 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
7001 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7002 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7003 if (!empty($vatratecode)) {
7004 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
7006 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
7009 $resql = $db->query($sql);
7012 $obj = $db->fetch_object($resql);
7015 return $obj->localtax1;
7016 } elseif ($local == 2) {
7017 return $obj->localtax2;
7038 $valors = explode(
":", $tax);
7040 if (count($valors) > 1) {
7057 $sql =
" SELECT t.localtax".$local.
" as localtax";
7058 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7059 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7060 $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";
7061 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7062 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7063 $sql .=
" ORDER BY t.rowid DESC";
7065 $resql = $db->query($sql);
7067 $obj = $db->fetch_object($resql);
7069 return $obj->localtax;
7090function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7094 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7097 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7098 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7099 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7100 if ($firstparamisid) {
7101 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7103 $vatratecleaned = $vatrate;
7106 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7107 $vatratecleaned = $reg[1];
7108 $vatratecode = $reg[2];
7111 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7114 $sql .=
" WHERE t.fk_pays = c.rowid";
7116 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
7118 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
7120 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7121 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7123 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7127 $resql = $db->query($sql);
7129 $obj = $db->fetch_object($resql);
7132 'rowid' => $obj->rowid,
7133 'code' => $obj->code,
7134 'rate' => $obj->rate,
7135 'localtax1' => $obj->localtax1,
7136 'localtax1_type' => $obj->localtax1_type,
7137 'localtax2' => $obj->localtax2,
7138 'localtax2_type' => $obj->localtax2_type,
7140 'accountancy_code_sell' => $obj->accountancy_code_sell,
7141 'accountancy_code_buy' => $obj->accountancy_code_buy
7173 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7176 $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";
7177 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7178 if ($firstparamisid) {
7179 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7181 $vatratecleaned = $vatrate;
7184 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7185 $vatratecleaned = $reg[1];
7186 $vatratecode = $reg[2];
7189 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7190 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7191 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7192 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7194 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7195 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7197 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7199 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7203 $resql = $db->query($sql);
7205 $obj = $db->fetch_object($resql);
7208 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7211 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7212 } elseif ($local == 2) {
7213 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7215 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);
7237 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7245 $product->fetch($idprod);
7247 if (($mysoc->country_code == $thirdpartytouse->country_code)
7248 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7249 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7252 if ($idprodfournprice > 0) {
7253 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
7255 $ret = $product->vatrate_supplier;
7256 if ($product->default_vat_code_supplier) {
7257 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7263 $ret = $product->tva_tx;
7264 if ($product->default_vat_code) {
7265 $ret .=
' ('.$product->default_vat_code.
')';
7278 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7279 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7280 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7281 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7282 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7283 $sql .= $db->plimit(1);
7285 $resql = $db->query($sql);
7287 $obj = $db->fetch_object($resql);
7289 $ret = $obj->vat_rate;
7290 if ($obj->default_vat_code) {
7291 $ret .=
' ('.$obj->default_vat_code.
')';
7315 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7332 if (!class_exists(
'Product')) {
7333 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7342 $result = $product->fetch($idprod);
7344 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7358 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7359 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7360 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7361 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7362 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7363 $sql .= $db->plimit(1);
7365 $resql = $db->query($sql);
7367 $obj = $db->fetch_object($resql);
7370 $ret = $obj->localtax1;
7371 } elseif ($local == 2) {
7372 $ret = $obj->localtax2;
7380 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7404 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7407 $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;
7409 $seller_country_code = $thirdparty_seller->country_code;
7410 $seller_in_cee =
isInEEC($thirdparty_seller);
7412 $buyer_country_code = $thirdparty_buyer->country_code;
7413 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7415 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 :
''));
7420 if ($seller_in_cee && $buyer_in_cee) {
7421 $isacompany = $thirdparty_buyer->isACompany();
7422 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7423 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7437 if (!$seller_use_vat) {
7443 if (($seller_country_code == $buyer_country_code)
7444 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7445 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7450 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7454 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
7456 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
7457 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
7459 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
7471 if (($seller_in_cee && $buyer_in_cee)) {
7472 $isacompany = $thirdparty_buyer->isACompany();
7473 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7474 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7491 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
7492 $isacompany = $thirdparty_buyer->isACompany();
7520 if ($idprodfournprice > 0) {
7521 if (!class_exists(
'ProductFournisseur')) {
7522 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7525 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7526 return $prodprice->fourn_tva_npr;
7527 } elseif ($idprod > 0) {
7528 if (!class_exists(
'Product')) {
7529 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7532 $prod->fetch($idprod);
7533 return $prod->tva_npr;
7556 if (!is_object($thirdparty_seller)) {
7559 if (!is_object($thirdparty_buyer)) {
7564 if ($mysoc->country_code ==
'ES') {
7565 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7570 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7573 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7577 } elseif ($local == 2) {
7579 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7582 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7587 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7602function yn($yesno, $case = 1, $color = 0)
7606 $result =
'unknown';
7608 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7609 $result = $langs->trans(
'yes');
7610 if ($case == 1 || $case == 3) {
7611 $result = $langs->trans(
"Yes");
7614 $result =
'<input type="checkbox" value="1" checked disabled>';
7617 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7624 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7625 $result = $langs->trans(
"no");
7626 if ($case == 1 || $case == 3) {
7627 $result = $langs->trans(
"No");
7630 $result =
'<input type="checkbox" value="0" disabled>';
7633 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7636 $result =
img_picto(
'uncheck',
'uncheck');
7642 $classname =
'error';
7646 return '<span class="'.$classname.
'">'.$result.
'</span>';
7669function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
7671 if (empty($modulepart) && is_object(
$object)) {
7672 if (!empty(
$object->module)) {
7673 $modulepart =
$object->module;
7674 } elseif (!empty(
$object->element)) {
7675 $modulepart =
$object->element;
7682 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
7684 $arrayforoldpath[
'product'] = 2;
7687 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7688 $level = $arrayforoldpath[$modulepart];
7690 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7692 if (empty($num) && is_object(
$object)) {
7695 if (empty($alpha)) {
7696 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7698 $num = preg_replace(
'/^.*\-/i',
'', $num);
7700 $num = substr(
"000".$num, -$level);
7702 $path = substr($num, 0, 1);
7705 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7708 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7714 if (in_array($modulepart, array(
'societe',
'thirdparty')) &&
$object instanceOf
Societe) {
7722 if (empty($withoutslash) && !empty($path)) {
7737function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
7741 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7744 if (@is_dir($dir_osencoded)) {
7752 if (!empty($dataroot)) {
7754 $dir = str_replace($dataroot.
'/',
'', $dir);
7755 $ccdir = $dataroot.
'/';
7758 $cdir = explode(
"/", $dir);
7759 $num = count($cdir);
7760 for ($i = 0; $i < $num; $i++) {
7762 $ccdir .=
'/'.$cdir[$i];
7764 $ccdir .= $cdir[$i];
7767 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7775 if (!@is_dir($ccdir_osencoded)) {
7776 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7779 $dirmaskdec = octdec((
string) $newmask);
7780 if (empty($newmask)) {
7781 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7783 $dirmaskdec |= octdec(
'0111');
7784 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7786 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7789 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7798 return ($nberr ? -$nberr : $nbcreated);
7809function dolChmod($filepath, $newmask =
'')
7813 if (!empty($newmask)) {
7814 @chmod($filepath, octdec($newmask));
7816 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7828 return '<span class="fieldrequired">*</span>';
7848function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7850 if (is_null($stringtoclean)) {
7854 if ($removelinefeed == 2) {
7855 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7857 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7862 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7863 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
7866 $temp = strip_tags($temp);
7869 $pattern =
"/<[^<>]+>/";
7876 $tempbis = str_replace(
'<>',
'', $temp);
7877 $tempbis = preg_replace($pattern,
'', $tempbis);
7879 }
while ($tempbis != $temp);
7884 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7890 if ($removelinefeed == 1) {
7891 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7895 if ($removedoublespaces) {
7896 while (strpos($temp,
" ")) {
7897 $temp = str_replace(
" ",
" ", $temp);
7901 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7902 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
7922function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7924 if (empty($allowed_tags)) {
7925 $allowed_tags = array(
7926 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7927 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7928 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7931 $allowed_tags[] =
"comment";
7933 if (!in_array(
'iframe', $allowed_tags)) {
7934 $allowed_tags[] =
"iframe";
7938 if (!in_array(
'link', $allowed_tags)) {
7939 $allowed_tags[] =
"link";
7943 $allowed_tags_string = implode(
"><", $allowed_tags);
7944 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7946 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7951 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7953 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7954 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7957 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7959 if ($cleanalsosomestyles) {
7960 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7962 if ($removeclassattribute) {
7963 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7968 if ($cleanalsojavascript) {
7969 $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);
7972 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7974 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7995 if (is_null($allowed_attributes)) {
7996 $allowed_attributes = array(
7997 "allow",
"allowfullscreen",
"alt",
"async",
"class",
"contenteditable",
"crossorigin",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"property",
"rel",
"src",
"style",
"target",
"title",
"type",
"width",
7999 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
8003 if (!in_array(
"content", $allowed_attributes)) {
8004 $allowed_attributes[] =
"content";
8006 if (!in_array(
"http-equiv", $allowed_attributes)) {
8007 $allowed_attributes[] =
"http-equiv";
8010 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
8011 $stringtoclean =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>'.$stringtoclean.
'</body></html>';
8014 $dom =
new DOMDocument(
'',
'UTF-8');
8016 $savwarning = error_reporting();
8017 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
8018 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
8019 error_reporting($savwarning);
8021 if ($dom instanceof DOMDocument) {
8022 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
8023 $el = $els->item($i);
8024 if (!$el instanceof DOMElement) {
8027 $attrs = $el->attributes;
8028 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
8030 if (!empty($attrs->item($ii)->name)) {
8031 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
8033 $els->item($i)->removeAttribute($attrs->item($ii)->name);
8034 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
8036 $valuetoclean = $attrs->item($ii)->value;
8038 if (isset($valuetoclean)) {
8040 $oldvaluetoclean = $valuetoclean;
8041 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
8042 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
8043 if ($els->item($i)->tagName ==
'a') {
8044 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
8045 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
8046 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
8050 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
8051 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8052 }
while ($oldvaluetoclean != $valuetoclean);
8055 $attrs->item($ii)->value = $valuetoclean;
8062 $dom->encoding =
'UTF-8';
8064 $return = $dom->saveHTML();
8067 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
8068 $return = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]*'.preg_quote(
'></head><body>',
'/').
'/',
'', $return);
8069 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', trim($return));
8071 return trim($return);
8073 return $stringtoclean;
8090 $temp = $stringtoclean;
8091 foreach ($disallowed_tags as $tagtoremove) {
8092 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8093 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8096 if ($cleanalsosomestyles) {
8097 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8115 if ($nboflines == 1) {
8117 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8118 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8121 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8126 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8130 $text = preg_replace(
'/\n/',
'', $text);
8132 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8134 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8137 $text = strtr($text, $repTable);
8138 if ($charset ==
'UTF-8') {
8139 $pattern =
'/(<br[^>]*>)/Uu';
8142 $pattern =
'/(<br[^>]*>)/U';
8144 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8149 $lastaddediscontent = 1;
8150 while ($countline < $nboflines && isset($a[$i])) {
8151 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8152 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8153 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8155 if (!$lastaddediscontent) {
8158 $lastaddediscontent = 0;
8161 $firstline .= $a[$i];
8162 $lastaddediscontent = 1;
8168 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8170 $ret = $firstline.($adddots ?
'...' :
'');
8188function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8190 if (is_null($stringtoencode)) {
8195 return nl2br($stringtoencode, $forxml);
8197 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8211function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8213 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8218 return $stringtoencode;
8220 $out = $stringtoencode;
8224 $oldstringtoclean = $out;
8226 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8228 libxml_use_internal_errors(
false);
8229 if (LIBXML_VERSION < 20900) {
8233 libxml_disable_entity_loader(
true);
8236 $dom =
new DOMDocument();
8242 $out =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.$out.
'</div></body></html>';
8244 $out =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.dol_nl2br($out).
'</div></body></html>';
8247 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8249 $dom->encoding =
'UTF-8';
8251 $out = trim($dom->saveHTML());
8254 $out = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $out);
8255 $out = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]+'.preg_quote(
'></head><body><div class="tricktoremove">',
'/').
'/',
'', $out);
8256 $out = preg_replace(
'/'.preg_quote(
'</div></body></html>',
'/').
'$/',
'', trim($out));
8263 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8267 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
8270 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8276 'quote-marks' =>
false,
8277 'doctype' =>
'strict',
8278 'show-body-only' =>
true,
8279 "indent-attributes" =>
false,
8280 "vertical-space" =>
false,
8292 $out = $tidy->repairString($out, $config,
'utf8');
8299 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8304 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8307 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8311 $out = preg_replace(
'/'/i',
''', $out);
8316 $out = preg_replace_callback(
8317 '/&#(x?[0-9][0-9a-f]+;?)/i',
8322 static function ($m) {
8329 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8332 if ($check ==
'restricthtmlallowclass' || $check ==
'restricthtmlallowunvalid') {
8344 $out = preg_replace(
'/'/i',
"'", $out);
8348 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8349 $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);
8350 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8351 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8352 $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);
8353 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8355 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8356 }
while ($oldstringtoclean != $out);
8363 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8364 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8365 $nblinks = count($reg[0]);
8366 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8367 $out =
'ErrorTooManyLinksIntoHTMLString';
8370 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8372 $out =
'ErrorHTMLLinksNotAllowed';
8374 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8377 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8380 if (preg_match_all($pattern, $out, $matches)) {
8382 $urls = $matches[1];
8385 foreach ($urls as $url) {
8387 echo
"Found url = ".$url .
"\n";
8390 $out =
'ErrorHTMLExternalLinksNotAllowed';
8419function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
8421 if (is_null($stringtoencode)) {
8425 $newstring = $stringtoencode;
8427 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
8428 if ($removelasteolbr) {
8429 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
8431 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
8432 $newstring = strtr($newstring, array(
'&' =>
'__and__',
'<' =>
'__lt__',
'>' =>
'__gt__',
'"' =>
'__dquot__'));
8434 $newstring = strtr($newstring, array(
'__and__' =>
'&',
'__lt__' =>
'<',
'__gt__' =>
'>',
'__dquot__' =>
'"'));
8436 if ($removelasteolbr) {
8437 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
8456 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
8457 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
8458 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
8459 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
8471 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
8472 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
8488 if ($keepsomeentities) {
8489 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
8491 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
8492 if ($keepsomeentities) {
8493 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
8509function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
8511 return htmlentities($string, $flags, $encoding, $double_encode);
8530 for ($scursor = 0; $scursor < $len; $scursor++) {
8531 $ordchar = ord($s[$scursor]);
8533 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
8536 } elseif ($ordchar > 126 && $ordchar < 160) {
8540 $out .= $s[$scursor];
8562 $arraystring = explode(
"\n", $s);
8563 $nb = count($arraystring);
8580 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8582 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8585 $text = strtr($text, $repTable);
8586 if ($charset ==
'UTF-8') {
8587 $pattern =
'/(<br[^>]*>)/Uu';
8590 $pattern =
'/(<br[^>]*>)/U';
8592 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8594 $nblines = (int) floor((count($a) + 1) / 2);
8597 foreach ($a as $line) {
8600 $line_dec = html_entity_decode($line);
8602 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8603 $nblines += substr_count($line_dec,
'\n');
8623 if (is_null($msg)) {
8628 if (preg_match(
'/<html/i', $msg)) {
8630 } elseif (preg_match(
'/<body/i', $msg)) {
8632 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8634 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8636 } elseif (preg_match(
'/<br/i', $msg)) {
8642 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8643 if (preg_match(
'/<html/i', $msg)) {
8645 } elseif (preg_match(
'/<body/i', $msg)) {
8647 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8649 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8651 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8653 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8655 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8657 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8659 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8661 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8663 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8666 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8688function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
8690 if (!empty($invert)) {
8698 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8720 global $db, $conf, $mysoc, $user, $extrafields;
8722 $substitutionarray = array();
8724 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8728 $emailsendersignature = $user->signature;
8729 $usersignature = $user->signature;
8730 $substitutionarray = array_merge($substitutionarray, array(
8731 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8735 if (is_object($user) && ($user instanceof
User)) {
8736 $substitutionarray = array_merge($substitutionarray, array(
8737 '__USER_ID__' => (
string) $user->id,
8738 '__USER_LOGIN__' => (
string) $user->login,
8739 '__USER_EMAIL__' => (
string) $user->email,
8740 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8741 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8742 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8743 '__USER_FAX__' => (
string) $user->office_fax,
8744 '__USER_LASTNAME__' => (
string) $user->lastname,
8745 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8746 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8747 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8748 '__USER_JOB__' => (string) $user->job,
8750 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8754 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8755 $substitutionarray = array_merge($substitutionarray, array(
8756 '__MYCOMPANY_NAME__' => $mysoc->name,
8757 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8758 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8759 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8760 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8761 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8762 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8763 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8764 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8765 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8766 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
8767 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
8768 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
8769 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
8770 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8771 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8772 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8773 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8774 '__MYCOMPANY_TOWN__' => $mysoc->town,
8775 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8776 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8777 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8778 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8782 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8784 $substitutionarray[
'__ID__'] =
'__ID__';
8785 $substitutionarray[
'__REF__'] =
'__REF__';
8786 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8787 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8788 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8789 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8790 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8791 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8792 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8794 if (isModEnabled(
"societe")) {
8795 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8796 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8797 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8798 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8799 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8800 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8802 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8803 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8804 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8805 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8806 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8807 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8808 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8809 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8810 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8811 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8812 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8813 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
8814 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
8815 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
8816 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
8817 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8818 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8819 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8821 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8822 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8823 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8824 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8825 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8826 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8831 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8832 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8833 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8834 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8835 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8836 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8837 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8838 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8839 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8840 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8843 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8844 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8845 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8846 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8848 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8849 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8850 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8851 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8855 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8856 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8857 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8858 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8859 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8861 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8862 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8864 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8865 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8867 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8868 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8869 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8870 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8871 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8872 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8873 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8875 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8876 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8877 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8878 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8879 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8881 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
8882 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8883 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8884 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8886 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
8887 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
8888 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8891 '@phan-var-force Adherent|Delivery $object';
8892 $substitutionarray[
'__ID__'] =
$object->id;
8893 $substitutionarray[
'__REF__'] =
$object->ref;
8894 $substitutionarray[
'__NEWREF__'] =
$object->newref;
8896 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8897 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8898 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
8899 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
8901 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day', 0, $outputlangs) :
'');
8902 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day', 0, $outputlangs) :
'');
8903 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day', 0, $outputlangs) :
'');
8906 $date_delivery =
null;
8907 if (property_exists(
$object,
'date_delivery')) {
8908 $date_delivery =
$object->date_delivery;
8909 } elseif (property_exists(
$object,
'delivery_date')) {
8910 $date_delivery =
$object->delivery_date;
8912 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day', 0, $outputlangs) :
'');
8913 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%d") :
'');
8914 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%A") :
'');
8915 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%m") :
'');
8916 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%b") :
'');
8917 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%Y") :
'');
8918 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%H") :
'');
8919 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%M") :
'');
8920 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
"%S") :
'');
8923 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8924 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8925 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($date_delivery) ?
dol_print_date($date_delivery,
'day', 0, $outputlangs) :
'');
8926 $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 :
'')) :
'');
8930 '@phan-var-force Adherent $object';
8933 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
8934 if (method_exists(
$object,
'getCivilityLabel')) {
8935 $substitutionarray[
'__MEMBER_CIVILITY__'] =
$object->getCivilityLabel();
8937 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
8938 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
8939 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8940 if (method_exists(
$object,
'getFullName')) {
8941 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
8943 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
8944 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
8945 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
8946 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
8947 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
8948 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
8949 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8950 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
8951 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
8952 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
8956 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
8957 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
8959 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
8960 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
8961 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
8962 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
8963 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
8964 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
8965 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
8966 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
8967 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
8968 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
8969 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
8973 '@phan-var-force Societe $object';
8974 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object) ?
$object->id :
'');
8975 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object) ?
$object->name :
'');
8976 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object) ?
$object->name_alias :
'');
8977 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object) ?
$object->code_client :
'');
8978 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object) ?
$object->code_fournisseur :
'');
8979 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object) ?
$object->email :
'');
8980 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object) ?
$object->email :
'');
8983 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object) ?
$object->address :
'');
8984 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object) ?
$object->zip :
'');
8985 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object) ?
$object->town :
'');
8986 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object) ?
$object->country_id :
'');
8987 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object) ?
$object->country_code :
'');
8988 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object) ?
$object->idprof1 :
'');
8989 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object) ?
$object->idprof2 :
'');
8990 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object) ?
$object->idprof3 :
'');
8991 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object) ?
$object->idprof4 :
'');
8992 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object) ?
$object->idprof5 :
'');
8993 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object) ?
$object->idprof6 :
'');
8994 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object) ?
$object->tva_intra :
'');
8997 } elseif (is_object(
$object->thirdparty)) {
8998 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->id :
'');
8999 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name :
'');
9000 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name_alias :
'');
9001 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_client :
'');
9002 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_fournisseur :
'');
9003 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9004 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
9007 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->address :
'');
9008 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->zip :
'');
9009 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->town :
'');
9010 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_id :
'');
9011 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_code :
'');
9012 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof1 :
'');
9013 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof2 :
'');
9014 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof3 :
'');
9015 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof4 :
'');
9016 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof5 :
'');
9017 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof6 :
'');
9018 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->tva_intra :
'');
9023 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
9024 '@phan-var-force RecruitmentCandidature $object';
9025 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
9026 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9027 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9029 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
9030 '@phan-var-force ConferenceOrBoothAttendee $object';
9031 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
9032 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
9033 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
9037 '@phan-var-force Project $object';
9038 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
9039 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
9040 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
9041 } elseif (is_object(
$object)) {
9043 if (!empty(
$object->project)) {
9045 } elseif (!empty(
$object->projet)) {
9048 if (!is_null($project) && is_object($project)) {
9049 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
9050 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
9051 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
9056 $project_id =
$object->fk_project;
9057 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
9058 $project_id =
$object->fk_project;
9060 if ($project_id > 0) {
9062 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9063 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9064 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
9070 '@phan-var-force Facture $object';
9071 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
9074 '@phan-var-force Expedition $object';
9075 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9076 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9077 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9080 '@phan-var-force Reception $object';
9081 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9082 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9086 '@phan-var-force Contrat $object';
9087 $dateplannedstart =
'';
9088 $datenextexpiration =
'';
9089 foreach (
$object->lines as $line) {
9090 if ($line->date_start > $dateplannedstart) {
9091 $dateplannedstart = $line->date_start;
9093 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9094 $datenextexpiration = $line->date_end;
9097 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9098 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9099 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9101 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9102 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9103 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9107 '@phan-var-force Ticket $object';
9108 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9109 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9110 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9111 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9112 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9113 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9114 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9115 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9116 $userstat =
new User($db);
9117 if (
$object->fk_user_assign > 0) {
9118 $userstat->fetch(
$object->fk_user_assign);
9119 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9122 if (
$object->fk_user_create > 0) {
9123 $userstat->fetch(
$object->fk_user_create);
9124 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9130 if (!is_object($extrafields)) {
9133 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9135 if (
$object->fetch_optionals() > 0) {
9136 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9137 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9138 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9139 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9140 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9141 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9142 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9143 $datetime =
$object->array_options[
'options_'.$key];
9144 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9145 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9146 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9147 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9148 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9149 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9150 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9151 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9152 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9153 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9154 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9155 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9163 if (empty($substitutionarray[
'__REF__'])) {
9167 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9168 $outputlangs->loadLangs(array(
'paypal',
'other'));
9171 $typeforonlinepayment =
'free';
9173 $typeforonlinepayment =
'order';
9176 $typeforonlinepayment =
'invoice';
9179 $typeforonlinepayment =
'member';
9180 if (!empty(
$object->last_subscription_amount)) {
9181 $amounttouse =
$object->last_subscription_amount;
9185 $typeforonlinepayment =
'contract';
9188 $typeforonlinepayment =
'ficheinter';
9191 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9196 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9197 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9200 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9202 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9205 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9207 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9210 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9212 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9215 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9217 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9220 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9222 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9225 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9227 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9231 '@phan-var-force Propal $object';
9232 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9233 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9234 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9237 '@phan-var-force Commande $object';
9238 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9241 '@phan-var-force Facture $object';
9242 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9245 '@phan-var-force Contrat $object';
9246 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9247 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9248 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9251 '@phan-var-force Fichinter $object';
9252 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9253 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9254 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9256 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9257 '@phan-var-force SupplierProposal $object';
9258 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9260 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9261 '@phan-var-force FactureFournisseur $object';
9262 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9265 '@phan-var-force Expedition $object';
9266 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9271 '@phan-var-force ActionComm $object';
9272 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9273 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9275 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9279 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9280 '@phan-var-force Facture|FactureRec $object';
9281 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9284 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day', 0, $outputlangs) : null) :
'';
9286 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext', 0, $outputlangs) : null) :
'';
9288 $already_payed_all = 0;
9293 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9295 $substitutionarray[
'__AMOUNT_EXCL_TAX_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ht, $outputlangs, $conf->currency,
true) :
'';
9297 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9301 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9303 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9307 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9308 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9310 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9311 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9315 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9316 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9317 $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) :
'';
9318 $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)) :
'';
9319 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9320 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9322 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9323 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9326 if ($onlykey != 2) {
9327 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9328 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9329 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9330 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9331 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9332 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9334 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9335 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9339 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9340 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9341 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9345 if ($onlykey != 2) {
9346 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9347 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
9353 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
9354 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
9364 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
9366 $substitutionarray = array_merge($substitutionarray, array(
9367 '__NOW_TMS__' => (
string) $now,
9368 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
9369 '__DAY__' => (
string) $tmp[
'mday'],
9370 '__DAY_TEXT__' => $daytext,
9371 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
9372 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
9373 '__MONTH__' => (
string) $tmp[
'mon'],
9374 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
9375 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
9376 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
9377 '__YEAR__' => (
string) $tmp[
'year'],
9378 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
9379 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
9380 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
9381 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
9382 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
9383 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
9384 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
9385 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
9386 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
9390 if (isModEnabled(
'multicompany')) {
9391 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
9393 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
9394 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
9395 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
9396 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
9397 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
9402 return $substitutionarray;
9421function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
9423 global $conf, $db, $langs;
9425 if (!is_array($substitutionarray)) {
9426 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
9429 if (empty($outputlangs)) {
9430 $outputlangs = $langs;
9440 if (is_object($outputlangs)) {
9442 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
9444 $tmp = explode(
'|', $reg[1]);
9445 if (!empty($tmp[1])) {
9446 $outputlangs->load($tmp[1]);
9449 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
9451 if (empty($converttextinhtmlifnecessary)) {
9453 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9467 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
9475 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
9476 $keyfound = $reg[1];
9478 $value =
'*****forbidden*****';
9480 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
9483 if (empty($converttextinhtmlifnecessary)) {
9485 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9498 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
9503 foreach ($substitutionarray as $key => $value) {
9504 if (!isset($value)) {
9508 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
9512 if (empty($converttextinhtmlifnecessary)) {
9513 $text = str_replace(
"$key",
"$value", $text);
9525 $text = str_replace(
"$key",
"$value", $text);
9541 $memory_object_list = array();
9542 foreach ($substitutionarray as $key => $value) {
9543 $lazy_load_arr = array();
9544 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
9545 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
9546 $key_to_substitute = $lazy_load_arr[1];
9547 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
9548 $param_arr = explode(
':', $value);
9550 if (count($param_arr) == 4) {
9551 $path = $param_arr[0];
9552 $class = $param_arr[1];
9553 $method = $param_arr[2];
9554 $id = (int) $param_arr[3];
9557 if (!isset($memory_object_list[$class])) {
9559 require_once DOL_DOCUMENT_ROOT . $path;
9560 if (class_exists($class)) {
9561 $memory_object_list[$class] = array(
9569 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
9570 if (method_exists($class, $method)) {
9571 if (!isset($memory_object_list[$class][
'list'][$id])) {
9572 $tmpobj =
new $class($db);
9574 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
9575 $memory_object_list[$class][
'list'][$id] = $tmpobj;
9578 $tmpobj = $memory_object_list[$class][
'list'][$id];
9580 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
9583 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
9609 global $conf, $user;
9611 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9616 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
9618 foreach ($dirsubstitutions as $reldir) {
9626 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
9627 foreach ($substitfiles as $substitfile) {
9629 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
9632 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
9634 require_once $dir.$substitfile[
'name'];
9636 $function_name = $module.
"_".$callfunc;
9637 if (function_exists($function_name)) {
9638 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
9646 foreach ($substitutionarray as $key => $value) {
9647 $tags .=
'{'.$key.
'} => '.$value.
"\n";
9649 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9662function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
9664 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9677function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
9683 if (!is_object($outputlangs)) {
9684 $outputlangs = $langs;
9687 if ($date_start && $date_end) {
9688 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9690 if ($date_start && !$date_end) {
9691 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9693 if (!$date_start && $date_end) {
9694 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9714 if ($nameorder < 0) {
9717 if ($nameorder == 1) {
9719 if ($firstname && $lastname) {
9723 } elseif ($nameorder == 2 || $nameorder == 3) {
9725 if (empty($ret) && $nameorder == 3) {
9730 if (empty($ret) && $nameorder == 5) {
9733 if ($nameorder == 0) {
9734 if ($firstname && $lastname) {
9758 if (!is_array($mesgs)) {
9759 $mesgs = trim((
string) $mesgs);
9762 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9765 $_SESSION[
'dol_events'][$style][] = $mesgs;
9769 foreach ($mesgs as $mesg) {
9770 $mesg = trim((
string) $mesg);
9772 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9775 $_SESSION[
'dol_events'][$style][] = $mesg;
9793function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0)
9795 if (empty($mesg) && empty($mesgs)) {
9796 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9803 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9804 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9805 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
9807 if (empty($mesgs)) {
9810 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9831 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9832 if (empty($disabledoutputofmessages)) {
9835 unset($_SESSION[
'dol_events'][
'mesgs']);
9838 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9839 if (empty($disabledoutputofmessages)) {
9842 unset($_SESSION[
'dol_events'][
'errors']);
9846 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9847 if (empty($disabledoutputofmessages)) {
9850 unset($_SESSION[
'dol_events'][
'warnings']);
9868function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
9870 global $conf, $langs;
9875 $divstart = $divend =
'';
9878 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9879 $divstart =
'<div class="'.$style.
' clearboth">';
9883 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9884 $langs->load(
"errors");
9886 if (is_array($mesgarray) && count($mesgarray)) {
9887 foreach ($mesgarray as $message) {
9889 $out .= $langs->trans($message);
9890 if ($ret < count($mesgarray)) {
9897 $out .= $langs->trans($mesgstring);
9903 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9904 $return =
'<script nonce="'.getNonce().
'">
9905 $(document).ready(function() {
9910 /* jnotify(message, preset of message type, keepmessage) */
9912 "'.($style ==
"ok" ? 3000 : $style).
'",
9913 '.($style ==
"ok" ?
"false" :
"true").
',
9914 { remove: function (){} } );
9955function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
9957 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9963 if (is_array($mesgarray)) {
9964 foreach ($mesgarray as $val) {
9965 if ($val && preg_match(
'/class="error"/i', $val)) {
9969 if ($val && preg_match(
'/class="warning"/i', $val)) {
9974 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9976 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9979 if ($style ==
'error') {
9982 if ($style ==
'warning') {
9986 if ($iserror || $iswarning) {
9988 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9989 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9990 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9992 if (is_array($mesgarray)) {
9993 $newmesgarray = array();
9994 foreach ($mesgarray as $val) {
9995 if (is_string($val)) {
9996 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9997 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9998 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
9999 $newmesgarray[] = $tmpmesgstring;
10001 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
10004 $mesgarray = $newmesgarray;
10006 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
10041function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
10044 $order = strtolower($order);
10046 if (is_array($array)) {
10047 $sizearray = count($array);
10048 if ($sizearray > 0) {
10050 foreach (array_keys($array) as $key) {
10051 if (is_object($array[$key])) {
10052 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
10055 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
10057 if ($natsort == -1) {
10058 $temp[$key] =
'___'.$temp[$key];
10062 if (empty($natsort) || $natsort == -1) {
10063 if ($order ==
'asc') {
10069 if ($case_sensitive) {
10072 natcasesort($temp);
10074 if ($order !=
'asc') {
10075 $temp = array_reverse($temp,
true);
10081 foreach (array_keys($temp) as $key) {
10082 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10101 $str = (string) $str;
10104 $strLength = strlen($str);
10105 for ($i = 0; $i < $strLength; $i++) {
10106 if (ord($str[$i]) < 0x80) {
10108 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10110 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10112 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10114 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10116 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10121 for ($j = 0; $j < $n; $j++) {
10122 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10143 return preg_match(
'//u', $str) ? true :
false;
10155 if (function_exists(
'mb_check_encoding')) {
10157 if (!mb_check_encoding($str,
'ASCII')) {
10161 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10179 $tmp = ini_get(
"unicode.filesystem_encoding");
10180 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10181 $tmp =
'iso-8859-1';
10190 if ($tmp ==
'iso-8859-1') {
10191 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10212function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
10222 if ($useCache && isset($conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10223 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10226 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10228 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10229 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10230 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10231 if (!empty($entityfilter)) {
10232 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10238 $resql = $db->query($sql);
10240 $obj = $db->fetch_object($resql);
10243 $valuetoget = $obj->valuetoget;
10244 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $valuetoget;
10246 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10250 return $valuetoget;
10267 if ($matchrule == 1) {
10268 if ($var ==
'mainmenu') {
10270 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10271 } elseif ($var ==
'leftmenu') {
10273 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10275 return 'This variable is not accessible with dol_eval';
10278 return 'This value for matchrule is not implemented';
10292function verifCond($strToEvaluate, $onlysimplestring =
'1')
10296 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10299 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10300 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10320function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10324 global $db, $langs, $user, $website, $websitepage;
10325 global $action, $mainmenu, $leftmenu;
10327 global $objectoffield;
10333 $isObBufferActive =
false;
10334 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
10335 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
10340 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
10346 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
10347 if ($onlysimplestring ==
'2') {
10348 $specialcharsallowed .=
'[]';
10351 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
10353 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
10354 if ($returnvalue) {
10355 return 'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s;
10357 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s, LOG_WARNING);
10363 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
10364 if ($returnvalue) {
10365 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;
10367 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);
10375 while ($scheck && $savescheck != $scheck) {
10376 $savescheck = $scheck;
10377 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10378 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
10379 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
10380 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10381 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10382 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
10385 if (strpos($scheck,
'(') !==
false) {
10386 if ($returnvalue) {
10387 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
10389 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);
10398 if (is_array($s) || $s ===
'Array') {
10399 if ($returnvalue) {
10400 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
10402 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
10407 if (!
getDolGlobalString(
'MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL') && strpos($s,
'::') !==
false) {
10408 if ($returnvalue) {
10409 return 'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s;
10411 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s, LOG_WARNING);
10416 if (strpos($s,
'`') !==
false) {
10417 if ($returnvalue) {
10418 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
10420 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
10427 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
10428 if ($returnvalue) {
10429 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
10431 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
10438 $forbiddenphpstrings = array(
'$$',
'$_',
'}[');
10439 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
10444 $forbiddenphpfunctions = array();
10446 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
10448 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
10449 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
10450 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
10452 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"array_all",
"array_any",
"array_diff_ukey",
"array_filter",
"array_find",
"array_find_key",
"array_map",
"array_reduce",
"array_intersect_uassoc",
"array_intersect_ukey",
"array_walk",
"array_walk_recursive"));
10453 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
10454 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"set_error_handler",
"set_exception_handler",
"libxml_set_external_entity_loader",
"register_shutdown_function",
"register_tick_function",
"unregister_tick_function"));
10455 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
10456 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
10458 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
10460 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
10461 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
10462 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
10463 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace",
"mb_ereg_replace_callback"));
10464 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
10465 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
10466 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
10467 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
10469 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
10471 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
10473 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
10476 $oldstringtoclean = $s;
10477 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
10478 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
10479 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
10481 }
while ($oldstringtoclean != $s);
10484 if (strpos($s,
'__forbiddenstring__') !==
false) {
10485 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
10486 if ($returnvalue) {
10487 return 'Bad string syntax to evaluate: '.$s;
10489 dol_syslog(
'Bad string syntax to evaluate: '.$s);
10495 if ($returnvalue) {
10498 $isObBufferActive =
true;
10499 $tmps = @eval(
'return '.$s.
';');
10500 $tmpo = ob_get_clean();
10501 $isObBufferActive =
false;
10503 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10508 $isObBufferActive =
true;
10509 $tmps = eval(
'return '.$s.
';');
10510 $tmpo = ob_get_clean();
10511 $isObBufferActive =
false;
10513 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10518 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
10526 }
catch (Error $e) {
10527 if ($isObBufferActive) {
10529 $tmpo = ob_get_clean();
10530 $isObBufferActive =
false;
10532 $error =
'dol_eval try/catch error : ';
10533 $error .= $e->getMessage();
10535 if ($returnvalue) {
10536 return 'Exception during evaluation: '.$s;
10552 return (trim($element) !=
'');
10565 if (empty($codelang)) {
10569 if ($codelang ==
'auto') {
10570 return '<span class="fa fa-language"></span>';
10573 $langtocountryflag = array(
10575 'ca_ES' =>
'catalonia',
10579 'sw_SW' =>
'unknown',
10589 if (isset($langtocountryflag[$codelang])) {
10590 $flagImage = $langtocountryflag[$codelang];
10592 $tmparray = explode(
'_', $codelang);
10593 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
10598 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
10599 $morecss = $reg[1];
10604 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
10618 if (empty($countrycode)) {
10622 if (strtoupper($countrycode) ==
'MQ') {
10625 if (strtoupper($countrycode) ==
'SE') {
10628 if (strtoupper($countrycode) ==
'CH') {
10629 if ($mysoc->country_code ==
'FR') {
10632 if ($mysoc->country_code ==
'DE') {
10635 if ($mysoc->country_code ==
'IT') {
10817 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10818 if (in_array($buildprimarykeytotest, $locales)) {
10819 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10822 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10823 foreach ($locales as $locale) {
10824 $locale_language = locale_get_primary_language($locale);
10825 $locale_region = locale_get_region($locale);
10826 if (strtoupper($countrycode) == $locale_region) {
10828 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10832 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
10870 global $hookmanager, $db;
10872 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10873 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10874 $values = explode(
':', $value);
10877 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10882 $posstart = strpos($str,
'(');
10883 if ($posstart > 0) {
10884 $posend = strpos($str,
')');
10885 if ($posstart > 0) {
10886 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
10887 if (is_numeric($res1)) {
10888 $postab = (int) $res1;
10889 $values[1] =
'+' . substr($str, $posend + 1);
10893 if (count($values) == 6) {
10897 if ($values[0] != $type) {
10903 if ($filterorigmodule) {
10904 if (strpos($values[3],
'@')) {
10905 if ($filterorigmodule !=
'external') {
10909 if ($filterorigmodule !=
'core') {
10914 $langs->load($values[3]);
10916 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10918 $substitutionarray = array();
10923 $labeltemp = explode(
',', $values[2]);
10924 $label = $langs->trans($labeltemp[0]);
10926 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
10928 $classtoload = $labeltemp[1];
10929 if (class_exists($classtoload)) {
10930 $obj =
new $classtoload($db);
10931 $function = $labeltemp[3];
10932 if ($obj && $function && method_exists($obj, $function)) {
10934 $nbrec = $obj->$function(
$object->id, $obj);
10935 if (!empty($nbrec)) {
10936 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10944 $newtab[1] = $label;
10945 $newtab[2] = str_replace(
'+',
'', $values[1]);
10950 } elseif (count($values) == 5) {
10951 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10953 if ($values[0] != $type) {
10957 if ($filterorigmodule) {
10958 if (strpos($values[3],
'@')) {
10959 if ($filterorigmodule !=
'external') {
10963 if ($filterorigmodule !=
'core') {
10968 $langs->load($values[3]);
10970 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10971 $substitutionarray = array();
10975 $label = $langs->trans($values[2]);
10979 $newtab[1] = $label;
10980 $newtab[2] = str_replace(
'+',
'', $values[1]);
10984 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10985 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10986 if ($values[0] != $type) {
10989 $tabname = str_replace(
'-',
'', $values[1]);
10990 foreach ($head as $key => $val) {
10991 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
10993 if ($head[$key][2] == $tabname && $condition) {
10994 unset($head[$key]);
11003 if (!empty($hookmanager)) {
11004 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
11005 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
11006 if ($reshook > 0) {
11007 $head = $hookmanager->resArray;
11009 $head = array_merge($head, $hookmanager->resArray);
11028 global $conf, $hookmanager, $user, $langs;
11031 global $micro_start_time;
11033 if ($zone ==
'private') {
11034 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
11036 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
11040 print
"\n<!-- A div to store page_y POST parameter -->\n";
11041 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
11043 $parameters = array();
11044 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
11045 if (empty($reshook)) {
11051 if (!empty($conf->use_javascript_ajax)) {
11052 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
11053 print
'<script>'.
"\n";
11054 print
'jQuery(document).ready(function() {'.
"\n";
11056 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
11058 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
11059 print
'jQuery("li.menuhider").click(function(event) {';
11060 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
11061 print
' console.log("We click on .menuhider");'.
"\n";
11062 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
11067 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"])))) {
11068 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
11069 $relativepathstring = $_SERVER[
"PHP_SELF"];
11071 if (constant(
'DOL_URL_ROOT')) {
11072 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
11074 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
11075 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
11078 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
11079 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
11081 if ($defkey !=
'_noquery_') {
11082 $tmpqueryarraytohave = explode(
'&', $defkey);
11084 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11085 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
11087 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
11091 if (!$foundintru) {
11100 print
'console.log("set the focus by executing jQuery(...).focus();")'.
"\n";
11101 foreach ($defval as $paramkey => $paramval) {
11103 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
11104 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // TODO KO with ckeditor
11105 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
11110 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
11111 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
11113 if ($defkey != '_noquery_') {
11114 $tmpqueryarraytohave = explode('&', $defkey);
11116 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11117 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
11118 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
11119 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
11123 if (!$foundintru) {
11126 //var_dump($defkey.'-'.$qualified);
11132 print 'console.log("set the js code to manage fields that are
set as mandatory
");'."\n
";
11134 foreach ($defval as $paramkey => $paramval) {
11135 // Solution 1: Add handler on submit to check if mandatory fields are empty
11136 print 'var form = $(\'#'.dol_escape_js($paramkey).'\').closest("form
");'."\n
";
11137 print "form.on(
'submit',
function(event) {
11138 var submitter = $(
this).find(
':submit:focus').get(0);
11140 var buttonName = $(submitter).attr(
'name');
11141 if (buttonName ==
'cancel') {
11142 console.log(
'We click on cancel button so we accept submit with no need to check mandatory fields');
11147 console.log(
'We did not click on cancel button but on something else, we check that field #".dol_escape_js($paramkey)." is not empty');
11149 var tmpvalue = jQuery(
'#".dol_escape_js($paramkey)."').val();
11150 let tmptypefield = jQuery(
'#".dol_escape_js($paramkey)."').prop(
'nodeName').toLowerCase();
11152 if (tmptypefield ==
'textarea') {
11154 var tmpeditor = CKEDITOR.instances[
'".dol_escape_js($paramkey)."'];
11156 tmpvalue = tmpeditor.getData();
11157 console.log(
'For textarea tmpvalue is '+tmpvalue);
11161 let tmpvalueisempty =
false;
11162 if (tmpvalue ===
null || tmpvalue === undefined || tmpvalue ===
'') {
11163 tmpvalueisempty =
true;
11165 if (tmpvalue ===
'0' && (tmptypefield ==
'select' || tmptypefield ==
'input')) {
11166 tmpvalueisempty =
true;
11168 if (tmpvalueisempty && (buttonName ==
'save')) {
11169 console.log(
'field has type '+tmptypefield+
' and is empty, we cancel the submit');
11170 event.preventDefault();
11171 event.stopPropagation();
11172 alert(
'".dol_escape_js($langs->trans("ErrorFieldRequired", $paramkey).' (
'.$langs->trans("CustomMandatoryFieldRule").')
')."');
11175 console.log(
'field has type '+tmptypefield+
' and is defined to '+tmpvalue);
11180 // Solution 2: Add property 'required' on input
11181 // so browser will check value and try to focus on it when submitting the form.
11182 //print 'setTimeout(function() {'; // If we want to wait that ckeditor beuatifier has finished its job.
11183 //print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11184 //print 'jQuery("textarea[
id=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11185 //print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";*/
11186 //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
";
11187 //print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
11193 print
'jQuery(\':input[name="' .
dol_escape_js($paramkey) .
'"]\').closest("tr").find("td:first").addClass("fieldrequired");'.
"\n";
11198 print
'jQuery("input[name=\'cancel\']").click(function() {
11199 console.log("We click on cancel button so removed all required attribute");
11200 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
11210 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
11212 print
"/* JS CODE TO ENABLE to add memory info */\n";
11213 print
'window.console && console.log("';
11218 if (!empty($micro_start_time)) {
11219 $micro_end_time = microtime(
true);
11220 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
11223 if (function_exists(
"memory_get_usage")) {
11224 print
' - Mem: '.memory_get_usage();
11226 if (function_exists(
"memory_get_peak_usage")) {
11227 print
' - Real mem peak: '.memory_get_peak_usage(
true);
11229 if (function_exists(
"zend_loader_file_encoded")) {
11230 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
11235 print
"\n".
'</script>'.
"\n";
11241 foreach ($tmptagarray as $tmptag) {
11243 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
11245 <!-- Global site tag (gtag.js) - Google Analytics -->
11246 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
11248 window.dataLayer = window.dataLayer || [];
11249 function gtag(){dataLayer.push(arguments);}
11250 gtag(\'js\', new Date());
11252 gtag(\'config\', \''.trim($tmptag).
'\');
11259 // Add Xdebug coverage of code
11260 if (defined('XDEBUGCOVERAGE
')) {
11261 print_r(xdebug_get_code_coverage());
11264 // Add DebugBar data
11265 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
11266 if (isset($debugbar['time
'])) {
11267 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
11268 $debugbar['time
']->stopMeasure('pageaftermaster
');
11270 print '<!-- Output debugbar data -->
'."\n";
11271 $renderer = $debugbar->getJavascriptRenderer();
11272 print $renderer->render();
11273 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
11275 print "<!-- Start of log output\n";
11276 //print '<div
class=
"hidden">
'."\n";
11277 foreach ($conf->logbuffer as $logline) {
11278 print $logline."<br>\n";
11280 //print '</div>
'."\n";
11281 print "End of log output -->\n";
11295function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
11297 if (is_null($string)) {
11301 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
11302 // This is a regex string
11303 $newdelimiter = $delimiter;
11305 // This is a simple string
11306 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
11307 $newdelimiter = preg_quote($delimiter, '/
');
11310 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
11312 foreach ($a as $s) { // each part
11314 if ($pos = strpos($s, $kv)) { // key/value delimiter
11315 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
11316 } else { // key delimiter not found
11334function dol_set_focus($selector)
11336 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
11337 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
11348function dol_getmypid()
11350 if (!function_exists('getmypid
')) {
11351 return mt_rand(99900000, 99965535);
11353 return getmypid(); // May be a number on 64 bits (depending on OS)
11379function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
11381 global $db, $langs;
11383 $value = trim($value);
11386 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
11389 $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
11392 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
11394 //natural mode search type 3 allow spaces into search ...
11395 if ($mode == 3 || $mode == -3) {
11396 $crits = explode(',
', $value);
11398 $crits = explode(' ', $value);
11401 if (!is_array($fields)) {
11402 $fields = array($fields);
11405 $i1 = 0; // count the nb of and criteria added (all fields / criteria)
11406 foreach ($crits as $crit) { // Loop on each AND criteria
11407 $crit = trim($crit);
11408 $i2 = 0; // count the nb of valid criteria added for this this first criteria
11410 foreach ($fields as $field) {
11412 $tmpcrits = explode('|
', $crit);
11413 $i3 = 0; // count the nb of valid criteria added for this current field
11414 foreach ($tmpcrits as $tmpcrit) {
11415 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11418 $tmpcrit = trim($tmpcrit);
11420 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11423 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
11426 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
11427 if (!empty($reg[1])) {
11428 $operator = $reg[1];
11430 if ($newcrit != '') {
11431 $numnewcrit = price2num($newcrit);
11432 if (is_numeric($numnewcrit)) {
11433 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
11435 $newres .= '1 = 2
'; // force false, we received a corrupted data
11437 $i3++; // a criteria was added to string
11440 $i2++; // a criteria for 1 more field was added to string
11441 } elseif ($mode == 2 || $mode == -2) {
11442 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
11443 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
11444 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
11446 $newres .= ' OR
'.$field.' IS NULL
';
11448 $i2++; // a criteria for 1 more field was added to string
11449 } elseif ($mode == 3 || $mode == -3) {
11450 $tmparray = explode(',
', $crit);
11451 if (count($tmparray)) {
11453 foreach ($tmparray as $val) {
11456 $listofcodes .= ($listofcodes ? ',
' : '');
11457 $listofcodes .= "'".$db->escape($val)."'";
11460 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1, 0, 1).")";
11461 $i2++; // a criteria for 1 more field was added to string
11464 $newres .= ' OR
'.$field.' IS NULL
';
11466 } elseif ($mode == 4) {
11467 $tmparray = explode(',
', $crit);
11468 if (count($tmparray)) {
11470 foreach ($tmparray as $val) {
11473 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
11474 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
11475 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
11476 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
11478 $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)
11482 } else { // $mode=0
11483 $tmpcrits = explode('|
', $crit);
11484 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
11485 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
11486 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11489 $tmpcrit = trim($tmpcrit);
11491 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
11492 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
11494 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11497 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
11498 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
11500 $tmpcrit2 = $tmpcrit;
11505 if (preg_match('/^!/
', $tmpcrit)) {
11506 $tmps .= $field." NOT LIKE "; // ! as exclude character
11507 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
11509 $tmps .= $field." LIKE ";
11513 if (preg_match('/^[\^\$]/', $tmpcrit)) {
11515 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
11517 if (preg_match('/[\^\$]$/', $tmpcrit)) {
11519 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
11522 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
11526 $newres .= $tmpbefore;
11527 $newres .= $db->escape($tmpcrit2);
11528 $newres .= $tmpafter;
11530 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
11531 $newres .= " OR ".$field." IS NULL)";
11538 $i2++; // a criteria for 1 more field was added to string
11543 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
11547 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
11558function showDirectDownloadLink($object)
11560 global $conf, $langs;
11563 $url = $object->getLastMainDocLink($object->element);
11565 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
11567 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
11568 $out .= ajax_autoselect("directdownloadlink", 0);
11570 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
11584function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
11586 $dirName = dirname($file);
11587 if ($dirName == '.
') {
11591 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
11592 $fileName = basename($fileName);
11594 if (empty($extImgTarget)) {
11595 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
11597 if (empty($extImgTarget)) {
11598 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
11600 if (empty($extImgTarget)) {
11601 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
11603 if (empty($extImgTarget)) {
11604 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
11606 if (empty($extImgTarget)) {
11607 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
11609 if (empty($extImgTarget)) {
11610 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
11613 if (!$extImgTarget) {
11619 $subdir = 'thumbs/
';
11622 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
11635function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
11637 global $conf, $langs;
11639 if (empty($conf->use_javascript_ajax)) {
11643 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
11645 if ($alldata == 1) {
11646 if ($isAllowedForPreview) {
11647 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));
11653 // old behavior, return a string
11654 if ($isAllowedForPreview) {
11655 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
11656 $title = $langs->transnoentities("Preview");
11657 //$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().
11658 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg"); // An example of tmpurl that should be blocked by the dol_escape_uri()
11660 // 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,
11661 // 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.
11678function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
11681 $out = '<script nonce=
"'.getNonce().'">
11682 jQuery(document).ready(
function () {
11683 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
11687 if ($textonlink === 'image
') {
11688 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
11690 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
11703function dolIsAllowedForPreview($file)
11705 // Check .noexe extension in filename
11706 if (preg_match('/\.noexe$/i
', $file)) {
11710 // Check mime types
11711 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
11712 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
11713 $mime_preview[] = 'svg+xml
';
11715 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
11716 //$mime_preview[]='archive
';
11717 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
11718 if ($num_mime !== false) {
11722 // By default, not allowed for preview
11736function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
11739 $imgmime = 'other.png
';
11740 $famime = 'file-o
';
11743 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
11745 // Plain text files
11746 if (preg_match('/\.txt$/i
', $tmpfile)) {
11747 $mime = 'text/plain
';
11748 $imgmime = 'text.png
';
11749 $famime = 'file-alt
';
11750 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
11751 $mime = 'text/richtext
';
11752 $imgmime = 'text.png
';
11753 $famime = 'file-alt
';
11754 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
11755 $mime = 'text/csv
';
11756 $imgmime = 'text.png
';
11757 $famime = 'file-csv
';
11758 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
11759 $mime = 'text/tab-separated-values
';
11760 $imgmime = 'text.png
';
11761 $famime = 'file-alt
';
11762 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
11763 $mime = 'text/plain
';
11764 $imgmime = 'text.png
';
11765 $famime = 'file-alt
';
11766 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
11767 $mime = 'text/plain
';
11768 $imgmime = 'text.png
';
11770 $famime = 'file-alt
';
11771 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
11772 $mime = 'text/plain
';
11773 $imgmime = 'text.png
';
11775 $famime = 'file-alt
';
11776 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
11777 $mime = 'text/css
';
11778 $imgmime = 'css.png
';
11780 $famime = 'file-alt
';
11781 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
11782 $mime = 'text/plain
';
11783 $imgmime = 'text.png
';
11785 $famime = 'file-alt
';
11786 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11787 $mime = 'text/plain
';
11788 $imgmime = 'text.png
';
11789 $famime = 'file-alt
';
11790 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11791 $mime = 'text/html
';
11792 $imgmime = 'html.png
';
11794 $famime = 'file-alt
';
11795 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11796 $mime = 'text/xml
';
11797 $imgmime = 'other.png
';
11799 $famime = 'file-alt
';
11800 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11801 $mime = 'text/xml
';
11802 $imgmime = 'other.png
';
11804 $famime = 'file-alt
';
11805 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11806 $mime = 'text/plain
';
11807 $imgmime = 'text.png
';
11809 $famime = 'file-code
';
11810 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11811 $mime = 'text/plain
';
11812 $imgmime = 'text.png
';
11814 $famime = 'file-code
';
11815 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11816 $mime = 'text/plain
';
11817 $imgmime = 'text.png
';
11819 $famime = 'file-code
';
11820 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11821 $mime = 'text/plain
';
11822 $imgmime = 'text.png
';
11824 $famime = 'file-code
';
11825 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11826 $mime = 'text/plain
';
11827 $imgmime = 'text.png
';
11829 $famime = 'file-code
';
11830 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11831 $mime = 'text/plain
';
11832 $imgmime = 'text.png
';
11834 $famime = 'file-code
';
11835 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11836 $mime = 'text/plain
';
11837 $imgmime = 'php.png
';
11839 $famime = 'file-code
';
11840 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11841 $mime = 'text/plain
';
11842 $imgmime = 'php.png
';
11844 $famime = 'file-code
';
11845 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11846 $mime = 'text/plain
';
11847 $imgmime = 'pl.png
';
11849 $famime = 'file-code
';
11850 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11851 $mime = 'text/plain
';
11852 $imgmime = 'text.png
';
11854 $famime = 'file-code
';
11855 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11856 $mime = 'text/x-javascript
';
11857 $imgmime = 'jscript.png
';
11859 $famime = 'file-code
';
11860 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11861 $mime = 'application/vnd.oasis.opendocument.presentation
';
11862 $imgmime = 'ooffice.png
';
11863 $famime = 'file-powerpoint
';
11864 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11865 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11866 $imgmime = 'ooffice.png
';
11867 $famime = 'file-excel
';
11868 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11869 $mime = 'application/vnd.oasis.opendocument.text
';
11870 $imgmime = 'ooffice.png
';
11871 $famime = 'file-word
';
11872 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11873 $mime = 'application/msaccess
';
11874 $imgmime = 'mdb.png
';
11876 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11877 $mime = 'application/msword
';
11878 $imgmime = 'doc.png
';
11879 $famime = 'file-word
';
11880 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11881 $mime = 'application/msword
';
11882 $imgmime = 'doc.png
';
11883 $famime = 'file-word
';
11884 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11885 $mime = 'application/vnd.ms-excel
';
11886 $imgmime = 'xls.png
';
11887 $famime = 'file-excel
';
11888 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11889 $mime = 'application/vnd.ms-excel
';
11890 $imgmime = 'xls.png
';
11891 $famime = 'file-excel
';
11892 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11893 $mime = 'application/vnd.ms-excel
';
11894 $imgmime = 'xls.png
';
11895 $famime = 'file-excel
';
11896 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11897 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11898 $imgmime = 'xls.png
';
11899 $famime = 'file-excel
';
11900 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11901 $mime = 'application/vnd.ms-powerpoint
';
11902 $imgmime = 'ppt.png
';
11903 $famime = 'file-powerpoint
';
11904 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11905 $mime = 'application/x-mspowerpoint
';
11906 $imgmime = 'ppt.png
';
11907 $famime = 'file-powerpoint
';
11908 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11909 $mime = 'application/pdf
';
11910 $imgmime = 'pdf.png
';
11911 $famime = 'file-pdf
';
11912 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11913 $mime = 'text/x-bat
';
11914 $imgmime = 'script.png
';
11916 $famime = 'file-code
';
11917 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11918 $mime = 'text/x-sh
';
11919 $imgmime = 'script.png
';
11921 $famime = 'file-code
';
11922 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11923 $mime = 'text/x-ksh
';
11924 $imgmime = 'script.png
';
11926 $famime = 'file-code
';
11927 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11928 $mime = 'text/x-bash
';
11929 $imgmime = 'script.png
';
11931 $famime = 'file-code
';
11932 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11933 $mime = 'image/x-
icon';
11934 $imgmime = 'image.png
';
11935 $famime = 'file-image
';
11936 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11937 $mime = 'image/jpeg
';
11938 $imgmime = 'image.png
';
11939 $famime = 'file-image
';
11940 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11941 $mime = 'image/png
';
11942 $imgmime = 'image.png
';
11943 $famime = 'file-image
';
11944 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11945 $mime = 'image/gif
';
11946 $imgmime = 'image.png
';
11947 $famime = 'file-image
';
11948 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11949 $mime = 'image/bmp
';
11950 $imgmime = 'image.png
';
11951 $famime = 'file-image
';
11952 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11953 $mime = 'image/tiff
';
11954 $imgmime = 'image.png
';
11955 $famime = 'file-image
';
11956 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11957 $mime = 'image/svg+xml
';
11958 $imgmime = 'image.png
';
11959 $famime = 'file-image
';
11960 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11961 $mime = 'image/webp
';
11962 $imgmime = 'image.png
';
11963 $famime = 'file-image
';
11964 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11965 $mime = 'text/calendar
';
11966 $imgmime = 'other.png
';
11967 $famime = 'file-alt
';
11968 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11969 $mime = 'text/calendar
';
11970 $imgmime = 'other.png
';
11971 $famime = 'file-alt
';
11972 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11973 $mime = 'application/x-bittorrent
';
11974 $imgmime = 'other.png
';
11975 $famime = 'file-o
';
11976 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11978 $imgmime = 'audio.png
';
11979 $famime = 'file-audio
';
11980 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11981 $mime = 'video/mp4
';
11982 $imgmime = 'video.png
';
11983 $famime = 'file-video
';
11984 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11985 $mime = 'video/ogg
';
11986 $imgmime = 'video.png
';
11987 $famime = 'file-video
';
11988 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11989 $mime = 'video/webm
';
11990 $imgmime = 'video.png
';
11991 $famime = 'file-video
';
11992 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11993 $mime = 'video/x-msvideo
';
11994 $imgmime = 'video.png
';
11995 $famime = 'file-video
';
11996 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11997 $mime = 'video/divx
';
11998 $imgmime = 'video.png
';
11999 $famime = 'file-video
';
12000 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
12001 $mime = 'video/xvid
';
12002 $imgmime = 'video.png
';
12003 $famime = 'file-video
';
12004 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
12006 $imgmime = 'video.png
';
12007 $famime = 'file-video
';
12008 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
12009 // application/xxx where zzz is zip, ...
12011 $imgmime = 'archive.png
';
12012 $famime = 'file-archive
';
12013 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
12014 $mime = 'application/octet-stream
';
12015 $imgmime = 'other.png
';
12016 $famime = 'file-o
';
12017 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
12019 $imgmime = 'library.png
';
12020 $famime = 'file-o
';
12021 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
12023 $imgmime = 'error.png
';
12024 $famime = 'file-alt
';
12027 // Return mimetype string
12028 switch ((int) $mode) {
12030 $tmp = explode('/
', $mime);
12031 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
12053function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
12057 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
12059 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
12061 if (is_null($dictvalues)) {
12062 $dictvalues = array();
12064 $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
12065 if ($checkentity) {
12066 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
12069 $resql = $db->query($sql);
12071 while ($obj = $db->fetch_object($resql)) {
12072 $dictvalues[$obj->$rowidfield] = $obj;
12078 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
12081 if (!empty($dictvalues[$id])) {
12083 $tmp = $dictvalues[$id];
12084 return (property_exists($tmp, $field) ? $tmp->$field :
'');
12099 $stringcolor = str_replace(
'#',
'', $stringcolor);
12101 if (!empty($stringcolor)) {
12103 $tmp = explode(
',', $stringcolor);
12104 if (count($tmp) > 1) {
12109 $hexr = $stringcolor[0].$stringcolor[1];
12110 $hexg = $stringcolor[2].$stringcolor[3];
12111 $hexb = $stringcolor[4].$stringcolor[5];
12112 $r = hexdec($hexr);
12113 $g = hexdec($hexg);
12114 $b = hexdec($hexb);
12116 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
12117 if ($bright > 0.6) {
12138 if (empty($menuentry[
'enabled'])) {
12141 if ($type_user && $menuentry[
'module']) {
12142 $tmploops = explode(
'|', $menuentry[
'module']);
12144 foreach ($tmploops as $tmploop) {
12145 if (in_array($tmploop, $listofmodulesforexternal)) {
12154 if (!$menuentry[
'perms'] && $type_user) {
12160 if (!$menuentry[
'perms']) {
12175 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
12176 return (
int) $result;
12190function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
12192 $csstouse =
'badge';
12193 $csstouse .= (!empty($mode) ?
' badge-'.$mode :
'');
12194 $csstouse .= (!empty($type) ?
' badge-'.$type :
'');
12195 $csstouse .= (empty($params[
'css']) ?
'' :
' '.$params[
'css']);
12198 'class' => $csstouse
12201 if (empty($html)) {
12205 if (!empty($url)) {
12206 $attr[
'href'] = $url;
12209 if ($mode ===
'dot') {
12210 $attr[
'class'] .=
' classfortooltip';
12211 $attr[
'title'] = $html;
12212 $attr[
'aria-label'] = $label;
12217 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12218 foreach ($params[
'attr'] as $key => $value) {
12219 if ($key ==
'class') {
12220 $attr[
'class'] .=
' '.$value;
12221 } elseif ($key ==
'classOverride') {
12222 $attr[
'class'] = $value;
12224 $attr[$key] = $value;
12232 $attr = array_map(
'dol_escape_htmltag', $attr);
12234 $TCompiledAttr = array();
12235 foreach ($attr as $key => $value) {
12236 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12239 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
12241 $tag = !empty($url) ?
'a' :
'span';
12243 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
12259function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
12264 $dolGetBadgeParams = array();
12266 if (!empty($params[
'badgeParams'])) {
12267 $dolGetBadgeParams = $params[
'badgeParams'];
12271 if ($displayMode == 0) {
12272 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
12273 } elseif ($displayMode == 1) {
12274 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12278 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
12279 $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>' :
'');
12282 if (!empty($conf->dol_optimize_smallscreen)) {
12283 if ($displayMode == 0) {
12285 } elseif ($displayMode == 4) {
12287 } elseif ($displayMode == 6) {
12293 $statusImg = array(
12294 'status0' =>
'statut0',
12295 'status1' =>
'statut1',
12296 'status2' =>
'statut2',
12297 'status3' =>
'statut3',
12298 'status4' =>
'statut4',
12299 'status5' =>
'statut5',
12300 'status6' =>
'statut6',
12301 'status7' =>
'statut7',
12302 'status8' =>
'statut8',
12303 'status9' =>
'statut9'
12306 if (!empty($statusImg[$statusType])) {
12307 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
12309 $htmlImg =
img_picto($statusLabel, $statusType);
12312 if ($displayMode === 2) {
12313 $return = $htmlImg.
' '.$htmlLabelShort;
12314 } elseif ($displayMode === 3) {
12315 $return = $htmlImg;
12316 } elseif ($displayMode === 4) {
12317 $return = $htmlImg.
' '.$htmlLabel;
12318 } elseif ($displayMode === 5) {
12319 $return = $htmlLabelShort.
' '.$htmlImg;
12321 $return = $htmlLabel.
' '.$htmlImg;
12325 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12327 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
12328 if (empty($dolGetBadgeParams[
'attr'][
'title'])) {
12329 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
12331 $dolGetBadgeParams[
'attr'][
'class'] .=
' classfortooltip';
12333 $dolGetBadgeParams[
'attr'][
'title'] =
dol_htmlentitiesbr($dolGetBadgeParams[
'attr'][
'title'], 1);
12336 if ($displayMode == 3) {
12337 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
12338 } elseif ($displayMode === 5) {
12339 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
12341 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
12387function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
12389 global $hookmanager, $action,
$object, $langs;
12392 if (is_array($url)) {
12394 foreach ($url as $key => $subbutton) {
12395 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
12402 if (isset($params[
"areDropdownButtons"]) && $params[
"areDropdownButtons"] ===
false) {
12403 foreach ($url as $button) {
12404 if (!empty($button[
'lang'])) {
12405 $langs->load($button[
'lang']);
12407 $label = $langs->trans($button[
'label']);
12408 $text = $button[
'text'] ??
'';
12409 $actionType = $button[
'actionType'] ??
'';
12410 $tmpUrl = DOL_URL_ROOT.$button[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12411 $id = $button[
'id'] ??
'';
12412 $userRight = $button[
'perm'] ?? 1;
12413 $button[
'params'] = $button[
'params'] ?? [];
12415 $out .=
dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button[
'params']);
12420 if (count($url) > 1) {
12421 $out .=
'<div class="dropdown inline-block dropdown-holder">';
12422 $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>';
12423 $out .=
'<div class="dropdown-content">';
12424 foreach ($url as $subbutton) {
12425 if (!empty($subbutton[
'lang'])) {
12426 $langs->load($subbutton[
'lang']);
12429 if (!empty($subbutton[
'urlraw'])) {
12430 $tmpurl = $subbutton[
'urlraw'];
12432 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12436 $subbuttonparam = array();
12437 if (!empty($subbutton[
'attr'])) {
12438 $subbuttonparam[
'attr'] = $subbutton[
'attr'];
12440 $subbuttonparam[
'isDropDown'] = (empty($params[
'isDropDown']) ? ($subbutton[
'isDropDown']??
false) : $params[
'isDropDown']);
12442 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl, $subbutton[
'id'] ??
'', $subbutton[
'perm'], $subbuttonparam);
12447 foreach ($url as $subbutton) {
12448 if (!empty($subbutton[
'lang'])) {
12449 $langs->load($subbutton[
'lang']);
12452 if (!empty($subbutton[
'urlraw'])) {
12453 $tmpurl = $subbutton[
'urlraw'];
12455 $tmpurl = !empty($subbutton[
'urlroot']) ? $subbutton[
'urlroot'] : $subbutton[
'url'];
12459 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], $params);
12468 if (!empty($params[
'isDropdown']) || !empty($params[
'isDropDown'])) {
12469 $class =
"dropdown-item";
12471 $class =
'butAction';
12472 if ($actionType ==
'danger' || $actionType ==
'delete') {
12473 $class =
'butActionDelete';
12474 if (!empty($url) && strpos($url,
'token=') ===
false) {
12475 $url .=
'&token='.newToken();
12481 'href' => empty($url) ?
'' : $url,
12485 if (empty($text)) {
12487 $attr[
'title'] =
'';
12489 $attr[
'title'] = $label;
12490 $attr[
'aria-label'] = $label;
12493 if (empty($userRight)) {
12494 $attr[
'class'] =
'butActionRefused';
12495 $attr[
'href'] =
'';
12496 $attr[
'title'] = (($label && $text && $label != $text) ? $label :
'');
12497 $attr[
'title'] = ($attr[
'title'] ? $attr[
'title'].
'<br>' :
'').$langs->trans(
'NotEnoughPermissions');
12505 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12506 foreach ($params[
'attr'] as $key => $value) {
12507 if ($key ==
'class') {
12508 $attr[
'class'] .=
' '.$value;
12509 } elseif ($key ==
'classOverride') {
12510 $attr[
'class'] = $value;
12512 $attr[$key] = $value;
12518 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12519 $attr[
'class'] .=
' classfortooltip';
12523 if ($userRight && !empty($params[
'confirm'])) {
12524 if (!is_array($params[
'confirm'])) {
12525 $params[
'confirm'] = array();
12528 if (empty($params[
'confirm'][
'url'])) {
12529 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
12533 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
12534 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
12535 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
12536 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
12537 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
12538 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
12539 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
12541 $attr[
'class'] .=
' butActionConfirm';
12544 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12545 unset($attr[
'href']);
12549 if (!empty($params[
'use_unsecured_unescapedattr'])) {
12550 if (is_array($params[
'use_unsecured_unescapedattr'])) {
12551 foreach ($attr as $attrK => $attrV) {
12552 if (in_array($attrK, $params[
'use_unsecured_unescapedattr'])) {
12559 $attr = array_map(
'dol_htmlentities', $attr);
12562 $attr = array_map(
'dolPrintHTMLForAttribute', $attr);
12565 $TCompiledAttr = array();
12566 foreach ($attr as $key => $value) {
12567 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
12570 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
12572 $tag = !empty($attr[
'href']) ?
'a' :
'span';
12575 $parameters = array(
12576 'TCompiledAttr' => $TCompiledAttr,
12577 'compiledAttributes' => $compiledAttributes,
12582 'actionType' => $actionType,
12585 'userRight' => $userRight,
12586 'params' => $params
12589 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters,
$object, $action);
12590 if ($reshook < 0) {
12594 if (empty($reshook)) {
12596 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
12598 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
12601 return $hookmanager->resPrint;
12620 $parsedUrl = parse_url($url);
12621 if ((isset($parsedUrl[
'scheme']) && in_array($parsedUrl[
'scheme'], [
'javascript',
'mailto',
'tel'])) || strpos($url,
'#') === 0) {
12625 if (!empty($parsedUrl[
'query'])) {
12627 parse_str($parsedUrl[
'query'], $urlQuery);
12628 if (!isset($urlQuery[
'backtopage']) && isset($params[
'backtopage'])) {
12629 $url.=
'&backtopage='.urlencode($params[
'backtopage']);
12633 if (!isset($parsedUrl[
'scheme']) && $addDolUrlRoot) {
12634 $url = DOL_URL_ROOT.$url;
12649 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
12661 if (!empty($fieldValidationErrorMsg)) {
12662 $out .=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
12663 $out .=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
12682function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
12684 global $langs, $conf, $user;
12687 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
12691 $class =
'btnTitle';
12692 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
12693 $class .=
' btnTitlePlus';
12695 $useclassfortooltip = 1;
12697 if (!empty($params[
'morecss'])) {
12698 $class .=
' '.$params[
'morecss'];
12703 'href' => empty($url) ?
'' : $url
12706 if (!empty($helpText)) {
12708 } elseif (empty($attr[
'title']) && $label) {
12709 $attr[
'title'] = $label;
12710 $useclassfortooltip = 0;
12713 if ($status == 2) {
12714 $attr[
'class'] .=
' btnTitleSelected';
12715 } elseif ($status <= 0) {
12716 $attr[
'class'] .=
' refused';
12718 $attr[
'href'] =
'';
12720 if ($status == -1) {
12721 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
12722 } elseif ($status == 0) {
12723 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
12727 if (!empty($attr[
'title']) && $useclassfortooltip) {
12728 $attr[
'class'] .=
' classfortooltip';
12736 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12737 foreach ($params[
'attr'] as $key => $value) {
12738 if ($key ==
'class') {
12739 $attr[
'class'] .=
' '.$value;
12740 } elseif ($key ==
'classOverride') {
12741 $attr[
'class'] = $value;
12743 $attr[$key] = $value;
12748 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12749 unset($attr[
'href']);
12755 $attr = array_map(
'dol_escape_htmltag', $attr);
12757 $TCompiledAttr = array();
12758 foreach ($attr as $key => $value) {
12759 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12762 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
12764 $tag = (empty($attr[
'href']) ?
'span' :
'a');
12766 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
12767 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
12768 if (!empty($params[
'forcenohideoftext'])) {
12769 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
12771 $button .=
'</'.$tag.
'>';
12787 global $conf, $db, $hookmanager;
12793 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
12796 $module = $elementType;
12797 $element = $elementType;
12798 $subelement = $elementType;
12799 $table_element = $elementType;
12802 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $elementType, $regs)) {
12803 $element = $subelement = $regs[1];
12804 $module = $regs[2];
12809 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
12810 $module = $element = $regs[1];
12811 $subelement = $regs[2];
12815 if (substr($elementType, -3) ==
'det') {
12816 $module = preg_replace(
'/det$/',
'', $element);
12817 $subelement = preg_replace(
'/det$/',
'', $subelement);
12818 $classpath = $module.
'/class';
12819 $classfile = $module;
12820 $classname = preg_replace(
'/det$/',
'Line', $element);
12821 if (in_array($module, array(
'expedition',
'propale',
'facture',
'contrat',
'fichinter',
'commandefournisseur'))) {
12822 $classname = preg_replace(
'/det$/',
'Ligne', $element);
12826 if ($elementType ==
"action" || $elementType ==
"actioncomm") {
12827 $classpath =
'comm/action/class';
12828 $subelement =
'Actioncomm';
12829 $module =
'agenda';
12830 $table_element =
'actioncomm';
12831 } elseif ($elementType ==
'cronjob') {
12832 $classpath =
'cron/class';
12834 $table_element =
'cron';
12835 } elseif ($elementType ==
'adherent_type') {
12836 $classpath =
'adherents/class';
12837 $classfile =
'adherent_type';
12838 $module =
'adherent';
12839 $subelement =
'adherent_type';
12840 $classname =
'AdherentType';
12841 $table_element =
'adherent_type';
12842 } elseif ($elementType ==
'bank_account') {
12843 $classpath =
'compta/bank/class';
12845 $classfile =
'account';
12846 $classname =
'Account';
12847 } elseif ($elementType ==
'category') {
12848 $classpath =
'categories/class';
12849 $module =
'categorie';
12850 $subelement =
'categorie';
12851 $table_element =
'categorie';
12852 } elseif ($elementType ==
'contact') {
12853 $classpath =
'contact/class';
12854 $classfile =
'contact';
12855 $module =
'societe';
12856 $subelement =
'contact';
12857 $table_element =
'socpeople';
12858 } elseif ($elementType ==
'inventory') {
12859 $module =
'product';
12860 $classpath =
'product/inventory/class';
12861 } elseif ($elementType ==
'stock' || $elementType ==
'entrepot') {
12863 $classpath =
'product/stock/class';
12864 $classfile =
'entrepot';
12865 $classname =
'Entrepot';
12866 $table_element =
'entrepot';
12867 } elseif ($elementType ==
'project') {
12868 $classpath =
'projet/class';
12869 $module =
'projet';
12870 $table_element =
'projet';
12871 } elseif ($elementType ==
'project_task') {
12872 $classpath =
'projet/class';
12873 $module =
'projet';
12874 $subelement =
'task';
12875 $table_element =
'projet_task';
12876 } elseif ($elementType ==
'facture' || $elementType ==
'invoice') {
12877 $classpath =
'compta/facture/class';
12878 $module =
'facture';
12879 $subelement =
'facture';
12880 $table_element =
'facture';
12881 } elseif ($elementType ==
'facturerec') {
12882 $classpath =
'compta/facture/class';
12883 $module =
'facture';
12884 $classname =
'FactureRec';
12885 } elseif ($elementType ==
'commande' || $elementType ==
'order') {
12886 $classpath =
'commande/class';
12887 $module =
'commande';
12888 $subelement =
'commande';
12889 $table_element =
'commande';
12890 } elseif ($elementType ==
'propal') {
12891 $classpath =
'comm/propal/class';
12892 $table_element =
'propal';
12893 } elseif ($elementType ==
'shipping') {
12894 $classpath =
'expedition/class';
12895 $classfile =
'expedition';
12896 $classname =
'Expedition';
12897 $module =
'expedition';
12898 $table_element =
'expedition';
12899 } elseif ($elementType ==
'delivery_note') {
12900 $classpath =
'delivery/class';
12901 $subelement =
'delivery';
12902 $module =
'expedition';
12903 } elseif ($elementType ==
'delivery') {
12904 $classpath =
'delivery/class';
12905 $subelement =
'delivery';
12906 $module =
'expedition';
12907 } elseif ($elementType ==
'supplier_proposal') {
12908 $classpath =
'supplier_proposal/class';
12909 $module =
'supplier_proposal';
12910 $element =
'supplierproposal';
12911 $classfile =
'supplier_proposal';
12912 $subelement =
'supplierproposal';
12913 } elseif ($elementType ==
'contract') {
12914 $classpath =
'contrat/class';
12915 $module =
'contrat';
12916 $subelement =
'contrat';
12917 $table_element =
'contract';
12918 } elseif ($elementType ==
'mailing') {
12919 $classpath =
'comm/mailing/class';
12920 $module =
'mailing';
12921 $classfile =
'mailing';
12922 $classname =
'Mailing';
12924 } elseif ($elementType ==
'member' || $elementType ==
'adherent') {
12925 $classpath =
'adherents/class';
12926 $module =
'adherent';
12927 $subelement =
'adherent';
12928 $table_element =
'adherent';
12929 } elseif ($elementType ==
'usergroup') {
12930 $classpath =
'user/class';
12932 } elseif ($elementType ==
'mo') {
12933 $classpath =
'mrp/class';
12938 $table_element =
'mrp_mo';
12939 } elseif ($elementType ==
'cabinetmed_cons') {
12940 $classpath =
'cabinetmed/class';
12941 $module =
'cabinetmed';
12942 $subelement =
'cabinetmedcons';
12943 $table_element =
'cabinetmedcons';
12944 } elseif ($elementType ==
'fichinter') {
12945 $classpath =
'fichinter/class';
12946 $module =
'ficheinter';
12947 $subelement =
'fichinter';
12948 $table_element =
'fichinter';
12949 } elseif ($elementType ==
'dolresource' || $elementType ==
'resource') {
12950 $classpath =
'resource/class';
12951 $module =
'resource';
12952 $subelement =
'dolresource';
12953 $table_element =
'resource';
12954 } elseif ($elementType ==
'propaldet') {
12955 $classpath =
'comm/propal/class';
12956 $module =
'propal';
12957 $subelement =
'propaleligne';
12958 } elseif ($elementType ==
'opensurvey_sondage') {
12959 $classpath =
'opensurvey/class';
12960 $module =
'opensurvey';
12961 $subelement =
'opensurveysondage';
12962 } elseif ($elementType ==
'order_supplier') {
12963 $classpath =
'fourn/class';
12964 $module =
'fournisseur';
12965 $classfile =
'fournisseur.commande';
12966 $element =
'order_supplier';
12968 $classname =
'CommandeFournisseur';
12969 $table_element =
'commande_fournisseur';
12970 } elseif ($elementType ==
'commande_fournisseurdet') {
12971 $classpath =
'fourn/class';
12972 $module =
'fournisseur';
12973 $classfile =
'fournisseur.commande';
12974 $element =
'commande_fournisseurdet';
12976 $classname =
'CommandeFournisseurLigne';
12977 $table_element =
'commande_fournisseurdet';
12978 } elseif ($elementType ==
'invoice_supplier') {
12979 $classpath =
'fourn/class';
12980 $module =
'fournisseur';
12981 $classfile =
'fournisseur.facture';
12982 $element =
'invoice_supplier';
12984 $classname =
'FactureFournisseur';
12985 $table_element =
'facture_fourn';
12986 } elseif ($elementType ==
"service") {
12987 $classpath =
'product/class';
12988 $subelement =
'product';
12989 $table_element =
'product';
12990 } elseif ($elementType ==
'salary') {
12991 $classpath =
'salaries/class';
12992 $module =
'salaries';
12993 } elseif ($elementType ==
'payment_salary') {
12994 $classpath =
'salaries/class';
12995 $classfile =
'paymentsalary';
12996 $classname =
'PaymentSalary';
12997 $module =
'salaries';
12998 } elseif ($elementType ==
'productlot') {
12999 $module =
'productbatch';
13000 $classpath =
'product/stock/class';
13001 $classfile =
'productlot';
13002 $classname =
'Productlot';
13003 $element =
'productlot';
13005 $table_element =
'product_lot';
13006 } elseif ($elementType ==
'societeaccount') {
13007 $classpath =
'societe/class';
13008 $classfile =
'societeaccount';
13009 $classname =
'SocieteAccount';
13010 $module =
'societe';
13011 } elseif ($elementType ==
'websitepage') {
13012 $classpath =
'website/class';
13013 $classfile =
'websitepage';
13014 $classname =
'Websitepage';
13015 $module =
'website';
13016 $subelement =
'websitepage';
13017 $table_element =
'website_page';
13018 } elseif ($elementType ==
'fiscalyear') {
13019 $classpath =
'core/class';
13020 $module =
'accounting';
13021 $subelement =
'fiscalyear';
13022 } elseif ($elementType ==
'chargesociales') {
13023 $classpath =
'compta/sociales/class';
13025 $table_element =
'chargesociales';
13026 } elseif ($elementType ==
'tva') {
13027 $classpath =
'compta/tva/class';
13030 $table_element =
'tva';
13031 } elseif ($elementType ==
'emailsenderprofile') {
13033 $classpath =
'core/class';
13034 $classfile =
'emailsenderprofile';
13035 $classname =
'EmailSenderProfile';
13036 $table_element =
'c_email_senderprofile';
13038 } elseif ($elementType ==
'conferenceorboothattendee') {
13039 $classpath =
'eventorganization/class';
13040 $classfile =
'conferenceorboothattendee';
13041 $classname =
'ConferenceOrBoothAttendee';
13042 $module =
'eventorganization';
13043 } elseif ($elementType ==
'conferenceorbooth') {
13044 $classpath =
'eventorganization/class';
13045 $classfile =
'conferenceorbooth';
13046 $classname =
'ConferenceOrBooth';
13047 $module =
'eventorganization';
13048 } elseif ($elementType ==
'ccountry') {
13050 $classpath =
'core/class';
13051 $classfile =
'ccountry';
13052 $classname =
'Ccountry';
13053 $table_element =
'c_country';
13057 if (empty($classfile)) {
13058 $classfile = strtolower($subelement);
13060 if (empty($classname)) {
13061 $classname = ucfirst($subelement);
13063 if (empty($classpath)) {
13064 $classpath = $module.
'/class';
13070 if ($module && isset($conf->$module)) {
13071 if (!empty($conf->$module->multidir_output[$conf->entity])) {
13072 $dir_output = $conf->$module->multidir_output[$conf->entity];
13073 } elseif (!empty($conf->$module->output[$conf->entity])) {
13074 $dir_output = $conf->$module->output[$conf->entity];
13075 } elseif (!empty($conf->$module->dir_output)) {
13076 $dir_output = $conf->$module->dir_output;
13081 if ($element ==
'order_supplier') {
13082 $dir_output = $conf->fournisseur->commande->dir_output;
13083 } elseif ($element ==
'invoice_supplier') {
13084 $dir_output = $conf->fournisseur->facture->dir_output;
13086 $dir_output .= $subdir;
13088 $elementProperties = array(
13089 'module' => $module,
13090 'element' => $element,
13091 'table_element' => $table_element,
13092 'subelement' => $subelement,
13093 'classpath' => $classpath,
13094 'classfile' => $classfile,
13095 'classname' => $classname,
13096 'dir_output' => $dir_output
13101 if (!is_object($hookmanager)) {
13102 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
13105 $hookmanager->initHooks(array(
'elementproperties'));
13109 $parameters = array(
13110 'elementType' => $elementType,
13111 'elementProperties' => $elementProperties
13114 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
13117 $elementProperties = $hookmanager->resArray;
13118 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
13119 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
13123 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
13124 unset($hookmanager->contextarray[$key]);
13127 return $elementProperties;
13142function fetchObjectByElement($element_id, $element_type, $element_ref =
'', $useCache = 0, $maxCacheByType = 10)
13150 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
13155 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
13156 } elseif ($element_prop[
'module'] ==
'societeaccount') {
13157 $ismodenabled = isModEnabled(
'website') || isModEnabled(
'webportal');
13159 $ismodenabled = isModEnabled($element_prop[
'module']);
13164 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
13165 if ($useCache === 1
13166 && !empty($conf->cache[
'fetchObjectByElement'][$element_type])
13167 && !empty($conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13168 && is_object($conf->cache[
'fetchObjectByElement'][$element_type][$element_id])
13170 return $conf->cache[
'fetchObjectByElement'][$element_type][$element_id];
13173 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
13175 if (class_exists($element_prop[
'classname'])) {
13176 $className = $element_prop[
'classname'];
13177 $objecttmp =
new $className($db);
13178 '@phan-var-force CommonObject $objecttmp';
13180 if ($element_id > 0 || !empty($element_ref)) {
13181 $ret = $objecttmp->fetch($element_id, $element_ref);
13183 if (empty($objecttmp->module)) {
13184 $objecttmp->module = $element_prop[
'module'];
13187 if ($useCache > 0) {
13188 if (!isset($conf->cache[
'fetchObjectByElement'][$element_type])) {
13189 $conf->cache[
'fetchObjectByElement'][$element_type] = [];
13193 if (! empty($conf->cache[
'fetchObjectByElement'][$element_type]) && is_array($conf->cache[
'fetchObjectByElement'][$element_type]) && count($conf->cache[
'fetchObjectByElement'][$element_type]) >= $maxCacheByType) {
13194 array_shift($conf->cache[
'fetchObjectByElement'][$element_type]);
13197 $conf->cache[
'fetchObjectByElement'][$element_type][$element_id] = $objecttmp;
13221 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)) {
13237 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
13249 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
13261 if (empty($conf->cache[
'nonce'])) {
13265 return $conf->cache[
'nonce'];
13282function startSimpleTable($header, $link =
"", $arguments =
"", $emptyColumns = 0, $number = -1, $pictofulllist =
'')
13286 print
'<div class="div-table-responsive-no-min">';
13287 print
'<table class="noborder centpercent">';
13288 print
'<tr class="liste_titre">';
13290 print ($emptyColumns < 1) ?
'<th>' :
'<th colspan="'.($emptyColumns + 1).
'">';
13292 print
'<span class="valignmiddle">'.$langs->trans($header).
'</span>';
13294 if (!empty($link)) {
13295 if (!empty($arguments)) {
13296 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
13298 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
13302 if ($number > -1) {
13303 print
'<span class="badge marginleftonlyshort">'.$number.
'</span>';
13304 } elseif (!empty($link)) {
13305 print
'<span class="badge marginleftonlyshort">...</span>';
13308 if (!empty($link)) {
13314 if ($number < 0 && !empty($link)) {
13315 print
'<th class="right">';
13335 if ($addLineBreak) {
13351function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
13356 print
'<tr class="oddeven">';
13357 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
13362 if ($nbofloop === 0) {
13368 $colspan = $tableColumnCount;
13369 } elseif ($num > $nbofloop) {
13370 $colspan = $tableColumnCount;
13372 $colspan = $tableColumnCount - 1;
13375 if ($extraRightColumn) {
13379 print
'<tr class="liste_total">';
13381 if ($nbofloop > 0 && $num > $nbofloop) {
13382 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
13384 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
13385 print
'<td class="right centpercent">'.price($total).
'</td>';
13388 if ($extraRightColumn) {
13405 if ($method == -1) {
13416 while (ob_get_level()) {
13421 if ($method == 0) {
13422 readfile($fullpath_original_file_osencoded);
13423 } elseif ($method == 1) {
13425 $handle = fopen($fullpath_original_file_osencoded,
"rb");
13426 while (!feof($handle)) {
13427 print fread($handle, 8192);
13430 } elseif ($method == 2) {
13432 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
13433 $handle2 = fopen(
"php://output",
"wb");
13434 stream_copy_to_stream($handle1, $handle2);
13459 if ($texttoshow ===
'none') {
13460 $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>';
13461 } elseif ($texttoshow) {
13462 $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>';
13464 $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>';
13479 $result = json_decode($stringtodecode);
13480 if ($result ===
null) {
13481 $result = unserialize($stringtodecode);
13508 if (is_null($filter) || !is_string($filter) || $filter ===
'') {
13511 if (!preg_match(
'/^\(.*\)$/', $filter)) {
13512 $filter =
'(' . $filter .
')';
13515 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
13516 $firstandlastparenthesis = 0;
13518 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
13522 return 'Filter syntax error - '.$errorstr;
13527 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
13528 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
13531 if (preg_match(
'/[^\(\)]/', $t)) {
13532 $tmperrorstr =
'Bad syntax of the search string';
13533 $errorstr =
'Bad syntax of the search string: '.$filter;
13537 dol_syslog(
"forgeSQLFromUniversalSearchCriteria Filter error - ".$errorstr, LOG_WARNING);
13538 return 'Filter error - '.$tmperrorstr;
13542 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
13544 if (is_object($db)) {
13545 $ret = str_replace(
'__NOW__',
"'".$db->idate(
dol_now()).
"'", $ret);
13547 if (is_object($user)) {
13548 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
13563 $arrayofandtags = array();
13567 $parenthesislevel = 0;
13572 if ($parenthesislevel >= 1) {
13573 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
13578 $countparenthesis = 0;
13579 while ($i < $nbofchars) {
13582 if ($char ==
'(') {
13583 $countparenthesis++;
13584 } elseif ($char ==
')') {
13585 $countparenthesis--;
13588 if ($countparenthesis == 0) {
13589 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
13590 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
13591 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
13594 if (!preg_match(
'/^\(.*\)$/', $s)) {
13597 $arrayofandtags[] = $s;
13610 if (!preg_match(
'/^\(.*\)$/', $s)) {
13613 $arrayofandtags[] = $s;
13616 return $arrayofandtags;
13628function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
13632 $tmp = $sqlfilters;
13636 $parenthesislevel = 0;
13644 if ($char ==
'(') {
13645 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
13647 $parenthesislevel++;
13650 } elseif ($char ==
')') {
13651 $nbcharremaining = ($nb - $i - 1);
13652 if ($nbcharremaining >= $counter) {
13653 $parenthesislevel = min($parenthesislevel, $counter - 1);
13655 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
13656 $parenthesislevel = $counter;
13661 if ($counter < 0) {
13662 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13663 $parenthesislevel = 0;
13671 if ($counter > 0) {
13672 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13673 $parenthesislevel = 0;
13691 if (empty($matches[1])) {
13694 $tmp = explode(
':', $matches[1]);
13695 if (count($tmp) < 3) {
13715 if (empty($matches[1])) {
13718 $tmp = explode(
':', $matches[1], 3);
13719 if (count($tmp) < 3) {
13723 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
13725 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
13728 'NOTLIKE' =>
'NOT LIKE',
13729 'ISNOT' =>
'IS NOT',
13730 'NOTIN' =>
'NOT IN',
13734 if (array_key_exists($operator, $realOperator)) {
13735 $operator = $realOperator[$operator];
13738 $tmpescaped = $tmp[2];
13744 if ($operator ==
'IN' || $operator ==
'NOT IN') {
13746 $tmpescaped2 =
'(';
13748 $tmpelemarray = explode(
',', $tmpescaped);
13749 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
13751 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
13752 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
13754 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
13757 $tmpescaped2 .= implode(
',', $tmpelemarray);
13758 $tmpescaped2 .=
')';
13760 $tmpescaped = $tmpescaped2;
13761 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
13762 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
13763 $tmpescaped = $regbis[1];
13766 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
13767 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
13770 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
13772 if (strtoupper($tmpescaped) ==
'NULL') {
13773 $tmpescaped =
'NULL';
13774 } elseif (is_int($tmpescaped)) {
13775 $tmpescaped = (int) $tmpescaped;
13776 } elseif (is_numeric((
string) $tmpescaped)) {
13777 $tmpescaped = (float) $tmpescaped;
13779 $tmpescaped = preg_replace(
'/[^a-z0-9_]/i',
'', $tmpescaped);
13783 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
13800 $out =
'<!-- timeline icon -->'.
"\n";
13801 $iconClass =
'fa fa-comments';
13806 if ($histo[$key][
'percent'] == -1) {
13807 $colorClass =
'timeline-icon-not-applicble';
13808 $pictoTitle = $langs->trans(
'StatusNotApplicable');
13809 } elseif ($histo[$key][
'percent'] == 0) {
13810 $colorClass =
'timeline-icon-todo';
13811 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
13812 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
13813 $colorClass =
'timeline-icon-in-progress';
13814 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
13815 } elseif ($histo[$key][
'percent'] >= 100) {
13816 $colorClass =
'timeline-icon-done';
13817 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
13820 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
13821 $iconClass =
'fa fa-ticket';
13822 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
13823 $iconClass =
'fa fa-pencilxxx';
13824 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13825 $iconClass =
'fa fa-comments';
13826 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13827 $iconClass =
'fa fa-mask';
13829 if ($actionstatic->type_picto) {
13830 $img_picto =
img_picto(
'', $actionstatic->type_picto);
13832 if ($actionstatic->type_code ==
'AC_RDV') {
13833 $iconClass =
'fa fa-handshake';
13834 } elseif ($actionstatic->type_code ==
'AC_TEL') {
13835 $iconClass =
'fa fa-phone';
13836 } elseif ($actionstatic->type_code ==
'AC_FAX') {
13837 $iconClass =
'fa fa-fax';
13838 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
13839 $iconClass =
'fa fa-envelope';
13840 } elseif ($actionstatic->type_code ==
'AC_INT') {
13841 $iconClass =
'fa fa-shipping-fast';
13842 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
13843 $iconClass =
'fa fa-robot';
13844 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
13845 $iconClass =
'fa fa-robot';
13850 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
13864 $documents = array();
13866 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
13867 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
13868 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
13870 $sql .=
' ORDER BY ecm.position ASC';
13872 $resql = $db->query($sql);
13874 if ($db->num_rows($resql)) {
13875 while ($obj = $db->fetch_object($resql)) {
13876 $documents[$obj->id] = $obj;
13902function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
13904 global $user, $conf;
13907 global $param, $massactionbutton;
13909 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
13912 if (!is_object($filterobj) && !is_object($objcon)) {
13917 '@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';
13922 $sortfield_list = explode(
',', $sortfield);
13923 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
13924 $sortfield_new_list = array();
13925 foreach ($sortfield_list as $sortfield_value) {
13926 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
13928 $sortfield_new = implode(
',', $sortfield_new_list);
13933 if (isModEnabled(
'agenda')) {
13935 if (is_object($objcon) && $objcon->id > 0) {
13936 $sql =
"SELECT DISTINCT a.id, a.label as label,";
13938 $sql =
"SELECT a.id, a.label as label,";
13940 $sql .=
" a.datep as dp,";
13941 $sql .=
" a.note as message,";
13942 $sql .=
" a.datep2 as dp2,";
13943 $sql .=
" a.percent as percent, 'action' as type,";
13944 $sql .=
" a.fk_element, a.elementtype,";
13945 $sql .=
" a.fk_contact,";
13946 $sql .=
" a.email_from as msg_from,";
13947 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
13948 $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";
13949 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13950 $sql .=
", sp.lastname, sp.firstname";
13951 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13952 $sql .=
", m.lastname, m.firstname";
13953 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13955 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13957 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13959 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13961 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13964 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
13965 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
13966 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
13968 $force_filter_contact = $filterobj instanceof
User;
13970 if (is_object($objcon) && $objcon->id > 0) {
13971 $force_filter_contact =
true;
13972 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
13973 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
13976 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13977 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
13978 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
13979 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
13980 $sql .=
" ON er.resource_type = 'dolresource'";
13981 $sql .=
" AND er.element_id = a.id";
13982 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
13983 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13984 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
13985 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13986 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
13987 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13988 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
13989 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13990 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
13991 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13992 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
13993 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13994 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
13997 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
13998 if (!$force_filter_contact) {
13999 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
14000 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
14001 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
14002 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
14003 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14004 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
14005 if ($filterobj->id) {
14006 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14008 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14009 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
14010 if ($filterobj->id) {
14011 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14013 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14014 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
14015 if ($filterobj->id) {
14016 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14018 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14019 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
14020 if ($filterobj->id) {
14021 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14023 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
14024 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
14025 if ($filterobj->id) {
14026 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14028 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
14029 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
14030 if ($filterobj->id) {
14031 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
14035 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
14039 if (!empty($actioncode)) {
14041 if ($actioncode ==
'AC_NON_AUTO') {
14042 $sql .=
" AND c.type != 'systemauto'";
14043 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14044 $sql .=
" AND c.type = 'systemauto'";
14046 if ($actioncode ==
'AC_OTH') {
14047 $sql .=
" AND c.type != 'systemauto'";
14048 } elseif ($actioncode ==
'AC_OTH_AUTO') {
14049 $sql .=
" AND c.type = 'systemauto'";
14053 if ($actioncode ==
'AC_NON_AUTO') {
14054 $sql .=
" AND c.type != 'systemauto'";
14055 } elseif ($actioncode ==
'AC_ALL_AUTO') {
14056 $sql .=
" AND c.type = 'systemauto'";
14058 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
14062 if ($donetodo ==
'todo') {
14063 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
14064 } elseif ($donetodo ==
'done') {
14065 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
14067 if (is_array($filters) && $filters[
'search_agenda_label']) {
14068 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
14073 if (isModEnabled(
'mailing') && !empty($objcon->email)
14074 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
14075 $langs->load(
"mails");
14077 $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";
14078 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
14079 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
14080 $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";
14081 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
14082 $sql2 .=
", '' as lastname, '' as firstname";
14083 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
14084 $sql2 .=
", '' as lastname, '' as firstname";
14085 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
14086 $sql2 .=
", '' as ref";
14087 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
14088 $sql2 .=
", '' as ref";
14089 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
14090 $sql2 .=
", '' as ref";
14092 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
14093 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
14094 $sql2 .=
" AND mc.statut = 1";
14095 $sql2 .=
" AND u.rowid = m.fk_user_valid";
14096 $sql2 .=
" AND mc.fk_mailing=m.rowid";
14099 if ($sql || $sql2) {
14100 if (!empty($sql) && !empty($sql2)) {
14101 $sql = $sql.
" UNION ".$sql2;
14102 } elseif (empty($sql) && !empty($sql2)) {
14111 $sql .= $db->order($sortfield_new, $sortorder);
14113 $sql .= $db->plimit($limit + 1, $offset);
14116 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
14117 $resql = $db->query($sql);
14120 $num = $db->num_rows($resql);
14122 $imaxinloop = ($limit ? min($num, $limit) : $num);
14123 while ($i < $imaxinloop) {
14124 $obj = $db->fetch_object($resql);
14126 if ($obj->type ==
'action') {
14128 $contactaction->id = $obj->id;
14129 $result = $contactaction->fetchResources();
14132 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
14138 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
14139 $tododone =
'todo';
14142 $histo[$numaction] = array(
14143 'type' => $obj->type,
14144 'tododone' => $tododone,
14146 'datestart' => $db->jdate($obj->dp),
14147 'dateend' => $db->jdate($obj->dp2),
14148 'note' => $obj->label,
14150 'percent' => $obj->percent,
14152 'userid' => $obj->user_id,
14153 'login' => $obj->user_login,
14154 'userfirstname' => $obj->user_firstname,
14155 'userlastname' => $obj->user_lastname,
14156 'userphoto' => $obj->user_photo,
14157 'msg_from' => $obj->msg_from,
14159 'contact_id' => $obj->fk_contact,
14160 'socpeopleassigned' => $contactaction->socpeopleassigned,
14161 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
14162 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
14163 'fk_element' => $obj->fk_element,
14164 'elementtype' => $obj->elementtype,
14166 'acode' => $obj->acode,
14167 'alabel' => $obj->alabel,
14168 'libelle' => $obj->alabel,
14169 'apicto' => $obj->apicto
14172 $histo[$numaction] = array(
14173 'type' => $obj->type,
14174 'tododone' =>
'done',
14176 'datestart' => $db->jdate($obj->dp),
14177 'dateend' => $db->jdate($obj->dp2),
14178 'note' => $obj->label,
14180 'percent' => $obj->percent,
14181 'acode' => $obj->acode,
14183 'userid' => $obj->user_id,
14184 'login' => $obj->user_login,
14185 'userfirstname' => $obj->user_firstname,
14186 'userlastname' => $obj->user_lastname,
14187 'userphoto' => $obj->user_photo
14202 if (!isModEnabled(
'agenda')) {
14203 $langs->loadLangs(array(
"admin",
"errors"));
14204 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
14207 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
14208 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
14210 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
14211 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
14212 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
14213 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
14218 $userstatic =
new User($db);
14219 $contactstatic =
new Contact($db);
14220 $userGetNomUrlCache = array();
14221 $contactGetNomUrlCache = array();
14223 $out .=
'<div class="filters-container" >';
14224 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
14225 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
14227 if ($objcon && get_class($objcon) ==
'Contact' &&
14228 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
14229 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
14231 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
14233 if (($filterobj && get_class($filterobj) ==
'Societe')) {
14234 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
14236 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
14241 $out .=
'<div class="div-table-responsive-no-min">';
14242 $out .=
'<table class="noborder borderbottom centpercent">';
14244 $out .=
'<tr class="liste_titre">';
14248 $out .=
'<th class="liste_titre width50 middle">';
14249 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14250 $out .= $searchpicto;
14254 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
14256 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
14258 $out .=
'<th class="liste_titre"></th>';
14260 $out .=
'<th class="liste_titre">';
14261 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
14263 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
14265 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
14266 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
14271 $out .=
'<th class="liste_titre width50 middle">';
14272 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14273 $out .= $searchpicto;
14280 $out .=
'</table>';
14287 $out .=
'<ul class="timeline">';
14291 if ($filterobj instanceof
Societe) {
14292 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14294 if ($filterobj instanceof
User) {
14295 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14297 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
14298 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
14299 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
14301 if ($filterobj instanceof
Societe) {
14304 if ($filterobj instanceof
User) {
14310 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
14312 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
14314 $actualCycleDate =
false;
14317 foreach ($histo as $key => $value) {
14318 $actionstatic->fetch($histo[$key][
'id']);
14320 $actionstatic->type_picto = $histo[$key][
'apicto'];
14321 $actionstatic->type_code = $histo[$key][
'acode'];
14323 $labeltype = $actionstatic->type_code;
14324 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
14325 $labeltype =
'AC_OTH';
14327 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14328 $labeltype = $langs->trans(
"Message");
14330 if (!empty($arraylist[$labeltype])) {
14331 $labeltype = $arraylist[$labeltype];
14333 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
14334 $labeltype .=
' - '.$arraylist[$actionstatic->code];
14338 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
14340 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
14342 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
14343 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
14344 $out .=
'<!-- timeline time label -->';
14345 $out .=
'<li class="time-label">';
14346 $out .=
'<span class="timeline-badge-date">';
14347 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
14350 $out .=
'<!-- /.timeline-label -->';
14354 $out .=
'<!-- timeline item -->'.
"\n";
14355 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
14358 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
14363 $out .=
'<div class="timeline-item">'.
"\n";
14365 $out .=
'<span class="time timeline-header-action2">';
14367 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
14368 $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").
' ';
14369 $out .= $histo[$key][
'id'];
14372 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
14375 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
14376 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
14377 $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).
'">';
14379 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
14386 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
14387 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
14388 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
14389 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
14390 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
14391 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
14392 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
14394 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
14398 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14401 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14404 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
14407 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14413 $out .=
"</span></span>\n";
14416 $out .=
'<h3 class="timeline-header">';
14419 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
14420 if ($histo[$key][
'userid'] > 0) {
14421 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
14422 $userstatic->fetch($histo[$key][
'userid']);
14423 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
14425 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
14426 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
14427 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
14428 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
14429 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
14431 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
14434 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
14439 $out .=
' <div class="messaging-title inline-block">';
14441 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
14442 $out .= $labeltype.
' - ';
14446 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14447 $out .= $langs->trans(
'TicketNewMessage');
14448 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14449 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
14450 } elseif (isset($histo[$key][
'type'])) {
14451 if ($histo[$key][
'type'] ==
'action') {
14452 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14453 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
14454 $libelle = $histo[$key][
'note'];
14455 $actionstatic->id = $histo[$key][
'id'];
14457 } elseif ($histo[$key][
'type'] ==
'mailing') {
14458 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
14459 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14460 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
14463 $libelle .= $histo[$key][
'note'];
14468 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
14469 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
14470 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
14472 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
14473 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
14475 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
14476 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
14479 $out .=
' - '.$link;
14488 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
14489 && $actionstatic->code !=
'AC_TICKET_CREATE'
14490 && $actionstatic->code !=
'AC_TICKET_MODIFY'
14492 $out .=
'<div class="timeline-body wordbreak small">';
14493 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
14495 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
14496 $out .=
'<div class="readmore-block --closed" >';
14497 $out .=
' <div class="readmore-block__excerpt">';
14499 $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>';
14501 $out .=
' <div class="readmore-block__full-text" >';
14503 $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>';
14517 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
14519 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
14520 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14522 $contact->fetch($cid);
14523 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14525 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14529 $contactList .= !empty($contactList) ?
', ' :
'';
14530 $contactList .= $contact->getNomUrl(1);
14531 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14532 if (!empty($contact->phone_pro)) {
14533 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
14539 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
14540 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
14541 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14543 $result = $contact->fetch($histo[$key][
'contact_id']);
14544 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14546 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14547 $result = ($contact instanceof
Contact) ? $contact->id : 0;
14551 $footer .= $contact->getNomUrl(1);
14552 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14553 if (!empty($contact->phone_pro)) {
14554 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
14561 if (!empty($documents)) {
14562 $footer .=
'<div class="timeline-documents-container">';
14563 foreach ($documents as $doc) {
14564 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
14565 $footer .=
' data-id="'.$doc->id.
'" ';
14566 $footer .=
' data-path="'.$doc->filepath.
'"';
14567 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
14570 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
14572 $file = $actionstatic->id.
'/'.$doc->filename;
14573 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
14574 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
14575 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
14577 $mimeAttr =
' mime="'.$mime.
'" ';
14579 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
14580 $class .=
' documentpreview';
14583 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
14584 $footer .=
img_mime($filePath).
' '.$doc->filename;
14587 $footer .=
'</span>';
14589 $footer .=
'</div>';
14592 if (!empty($footer)) {
14593 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
14596 $out .=
'</div>'.
"\n";
14599 $out .=
'<!-- END timeline item -->';
14605 jQuery(document).ready(function () {
14606 $(document).on("click", "[data-read-more-action]", function(e){
14607 let readMoreBloc = $(this).closest(".readmore-block");
14608 if(readMoreBloc.length > 0){
14609 e.preventDefault();
14610 if($(this).attr("data-read-more-action") == "close"){
14611 readMoreBloc.addClass("--closed").removeClass("--open");
14612 $("html, body").animate({
14613 scrollTop: readMoreBloc.offset().top - 200
14616 readMoreBloc.addClass("--open").removeClass("--closed");
14624 if (empty($histo)) {
14625 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
14646function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto')
14649 if ($hourTime ===
'getpost') {
14653 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
14654 $hour = intval($m[1]);
14655 $minute = intval($m[2]);
14656 $second = intval($m[3]);
14658 $hour = $minute = $second = 0;
14661 $hour = min($hour, 23);
14662 $minute = min($minute, 59);
14663 $second = min($second, 59);
14678function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
14680 if ($timestamp ===
null) {
14681 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
14688 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
14689 $TParam = array_merge($TParam, array(
14696 return '&' . http_build_query($TParam);
14718function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
14720 global $conf, $db, $langs, $hookmanager;
14723 if (!is_object($langs)) {
14724 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
14726 $langs->setDefaultLang();
14729 $langs->load(
"errors");
14731 if ($printheader) {
14732 if (function_exists(
"llxHeader")) {
14734 } elseif (function_exists(
"llxHeaderVierge")) {
14739 print
'<div class="error">';
14740 if (empty($message)) {
14741 print $langs->trans(
"ErrorRecordNotFound");
14743 print $langs->trans($message);
14748 if (empty($showonlymessage)) {
14749 if (empty($hookmanager)) {
14750 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
14753 $hookmanager->initHooks(array(
'main'));
14756 $parameters = array(
'message' => $message,
'params' => $params);
14757 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
14758 print $hookmanager->resPrint;
14761 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