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) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
265 if (empty($tmpuser)) {
270 return (
int) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
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');
438 if (in_array($element, $addzero)) {
441 $out .= ((int) $conf->entity);
446 'element' => $element,
449 'currentobject' => $currentobject,
452 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
454 if (is_numeric($reshook)) {
455 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
456 $out .=
','.$hookmanager->resPrint;
457 } elseif ($reshook == 1) {
458 $out = $hookmanager->resPrint;
475 if (is_object($mc) && method_exists($mc,
'setEntity')) {
476 return $mc->setEntity($currentobject);
478 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity : $conf->entity);
490 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
502 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
503 $r = chr($n % 26 + 0x41) . $r;
527 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
534 $user_agent = substr($user_agent, 0, 512);
536 $detectmobile =
new Mobile_Detect(
null, $user_agent);
537 $tablet = $detectmobile->isTablet();
539 if ($detectmobile->isMobile()) {
543 if ($detectmobile->is(
'AndroidOS')) {
544 $os = $phone =
'android';
545 } elseif ($detectmobile->is(
'BlackBerryOS')) {
546 $os = $phone =
'blackberry';
547 } elseif ($detectmobile->is(
'iOS')) {
550 } elseif ($detectmobile->is(
'PalmOS')) {
551 $os = $phone =
'palm';
552 } elseif ($detectmobile->is(
'SymbianOS')) {
554 } elseif ($detectmobile->is(
'webOS')) {
556 } elseif ($detectmobile->is(
'MaemoOS')) {
558 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
564 if (preg_match(
'/linux/i', $user_agent)) {
566 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
568 } elseif (preg_match(
'/windows/i', $user_agent)) {
574 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
576 $version = empty($reg[2]) ?
'' : $reg[2];
577 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
579 $version = empty($reg[2]) ?
'' : $reg[2];
580 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
582 $version = empty($reg[2]) ?
'' : $reg[2];
583 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
586 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
588 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
590 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
592 $version = empty($reg[2]) ?
'' : $reg[2];
593 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
596 $version = empty($reg[2]) ?
'' : $reg[2];
597 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
599 $version = end($reg);
600 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
603 $version = end($reg);
604 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
607 $version = empty($reg[3]) ?
'' : $reg[3];
619 'browsername' => $name,
620 'browserversion' => $version,
622 'browserua' => $user_agent,
637 $disconnectdone =
false;
639 if (is_object($db) && !empty($db->connected)) {
640 $depth = $db->transaction_opened;
641 $disconnectdone = $db->close();
643 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));
655function GETPOSTISSET($paramname)
659 $relativepathstring = $_SERVER[
"PHP_SELF"];
661 if (constant(
'DOL_URL_ROOT')) {
662 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
664 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
665 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
671 if (!empty($_GET[
'restore_lastsearch_values'])) {
672 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
673 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
674 if (is_array($tmp)) {
675 foreach ($tmp as $key => $val) {
676 if ($key == $paramname) {
684 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
686 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
688 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
690 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
694 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
711 if (empty($method)) {
712 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
713 } elseif ($method == 1) {
714 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
715 } elseif ($method == 2) {
716 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
717 } elseif ($method == 3) {
718 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
720 $val =
'BadFirstParameterForGETPOST';
723 return is_array($val);
755function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
757 global $mysoc, $user, $conf;
759 if (empty($paramname)) {
760 return 'BadFirstParameterForGETPOST';
763 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);
768 if (empty($method)) {
769 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
770 } elseif ($method == 1) {
771 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
772 } elseif ($method == 2) {
773 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
774 } elseif ($method == 3) {
775 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
777 return 'BadThirdParameterForGETPOST';
780 $relativepathstring =
'';
782 if (empty($method) || $method == 3 || $method == 4) {
783 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
785 if (constant(
'DOL_URL_ROOT')) {
786 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
788 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
789 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
795 if (!empty($_GET[
'restore_lastsearch_values'])) {
796 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
797 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
798 if (is_array($tmp)) {
799 foreach ($tmp as $key => $val) {
800 if ($key == $paramname) {
808 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
809 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
810 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
811 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
812 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
813 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
814 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
815 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
817 } elseif (!isset($_GET[
'sortfield'])) {
820 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
823 '@phan-var-force CommonObject $object';
824 if (is_object(
$object) && isset(
$object->fields[$paramname][
'default'])) {
826 $out =
$object->fields[$paramname][
'default'];
830 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
832 if (!empty($user->default_values)) {
833 if (isset($user->default_values[$relativepathstring][
'createform'])) {
834 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
836 if ($defkey !=
'_noquery_') {
837 $tmpqueryarraytohave = explode(
'&', $defkey);
840 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
841 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
854 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
855 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
862 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
864 if (!empty($user->default_values)) {
867 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
869 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
871 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
873 if ($defkey !=
'_noquery_') {
874 $tmpqueryarraytohave = explode(
'&', $defkey);
877 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
878 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
891 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
892 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
896 if ($paramname ==
'sortfield') {
899 if ($paramname ==
'sortorder') {
907 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
908 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
909 if (!empty($_GET[
'disabledefaultvalues'])) {
913 if ($defkey !=
'_noquery_') {
914 $tmpqueryarraytohave = explode(
'&', $defkey);
917 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
918 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
930 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
932 if (isset($_POST[
'sall']) || isset($_POST[
'search_all']) || isset($_GET[
'sall']) || isset($_GET[
'search_all'])) {
935 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
936 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
939 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
940 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
955 '@phan-var-force string $paramname';
956 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
960 while (preg_match(
'/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) {
964 if ($reg[1] ==
'DAY') {
966 $newout = $tmp[
'mday'];
967 } elseif ($reg[1] ==
'MONTH') {
969 $newout = $tmp[
'mon'];
970 } elseif ($reg[1] ==
'YEAR') {
972 $newout = $tmp[
'year'];
973 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
976 $newout = $tmp2[
'day'];
977 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
980 $newout = $tmp2[
'month'];
981 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
983 $newout = ($tmp[
'year'] - 1);
984 } elseif ($reg[1] ==
'NEXT_DAY') {
987 $newout = $tmp2[
'day'];
988 } elseif ($reg[1] ==
'NEXT_MONTH') {
991 $newout = $tmp2[
'month'];
992 } elseif ($reg[1] ==
'NEXT_YEAR') {
994 $newout = ($tmp[
'year'] + 1);
995 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
996 $newout = $mysoc->country_id;
997 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
999 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
1000 $newout = $user->fk_user;
1001 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
1002 $newout = $conf->entity;
1003 } elseif ($reg[1] ==
'ID') {
1009 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
1014 if (preg_match(
'/^array/', $check)) {
1015 if (!is_array($out) || empty($out)) {
1018 $tmparray = explode(
':', $check);
1019 if (!empty($tmparray[1])) {
1020 $tmpcheck = $tmparray[1];
1022 $tmpcheck =
'alphanohtml';
1024 foreach ($out as $outkey => $outval) {
1025 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
1031 if (strpos($paramname,
'search_') === 0) {
1032 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
1036 $out =
sanitizeVal($out, $check, $filter, $options);
1041 if ($paramname ==
'backtopage' || $paramname ==
'backtolist' || $paramname ==
'backtourl') {
1042 $out = str_replace(
'\\',
'/', $out);
1043 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
1045 $oldstringtoclean = $out;
1046 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
1047 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
1048 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
1049 }
while ($oldstringtoclean != $out);
1054 if (empty($method) || $method == 3 || $method == 4) {
1055 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
1062 if ($out !=
'' && isset($user)) {
1063 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
1082 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
1111function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1113 return sanitizeVal($out, $check, $filter, $options);
1125function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
1133 if (!is_numeric($out)) {
1138 if (is_array($out)) {
1139 $out = implode(
',', $out);
1141 if (preg_match(
'/[^0-9,-]+/i', $out)) {
1146 $out = filter_var($out, FILTER_SANITIZE_STRING);
1149 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
1152 if (!is_array($out)) {
1154 if (preg_match(
'/[^a-z]+/i', $out)) {
1160 if (!is_array($out)) {
1162 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1168 if (!is_array($out)) {
1170 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1176 if (!is_array($out)) {
1178 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1185 if (!is_array($out)) {
1188 $oldstringtoclean = $out;
1192 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1199 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1200 }
while ($oldstringtoclean != $out);
1204 case 'alphawithlgt':
1205 if (!is_array($out)) {
1208 $oldstringtoclean = $out;
1212 $out = preg_replace(
'/\\\([0-9xu])/',
'/\1', $out);
1219 $out = str_ireplace(array(
'../',
'..\\',
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'/',
'\',
'\',
'\'),
'', $out);
1220 }
while ($oldstringtoclean != $out);
1226 case 'restricthtmlnolink':
1227 case 'restricthtml':
1228 case 'restricthtmlallowclass':
1229 case 'restricthtmlallowunvalid':
1234 if (empty($filter)) {
1235 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1237 if (is_null($options)) {
1240 $out = filter_var($out, $filter, $options);
1244 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data will be sanitized with alphanohtml.", LOG_ERR);
1245 $out =
GETPOST($out,
'alphanohtml');
1253if (!function_exists(
'dol_getprefix')) {
1264 function dol_getprefix($mode =
'')
1267 if ($mode ==
'email') {
1272 return $conf->global->MAIL_PREFIX_FOR_EMAIL_ID;
1273 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1274 return $_SERVER[
"SERVER_NAME"];
1279 if (!empty($conf->file->instance_unique_id)) {
1280 return sha1(
'dolibarr'.$conf->file->instance_unique_id);
1284 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1288 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1289 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1292 if (!empty($tmp_instance_unique_id)) {
1293 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1297 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1298 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1300 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1317 global $conf, $langs, $user, $mysoc;
1321 if (!file_exists($fullpath)) {
1322 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1326 if (!empty($classname) && !class_exists($classname)) {
1327 return include $fullpath;
1329 return include_once $fullpath;
1344function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0)
1348 $path = preg_replace(
'/^\//',
'', $path);
1351 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1352 if (is_array($conf->file->dol_document_root)) {
1353 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1354 if ($key ==
'main') {
1358 if (@file_exists($dirroot.
'/'.$path)) {
1359 $res = $dirroot.
'/'.$path;
1364 if ($returnemptyifnotfound) {
1366 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1378 $res = DOL_URL_ROOT.
'/'.$path;
1381 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1384 $res = DOL_URL_ROOT.
'/'.$path;
1387 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1388 if ($key ==
'main') {
1393 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1394 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1397 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1402 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1403 if (!empty($regs[1])) {
1406 if (@file_exists($dirroot.
'/'.$regs[1])) {
1408 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1411 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1417 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1418 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1421 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).$conf->file->dol_url_root[$key].
'/'.$path;
1445 if (empty($properties)) {
1446 return get_object_vars($obj);
1449 $existingProperties = [];
1450 $realProperties = get_object_vars($obj);
1453 foreach ($properties as $property) {
1454 if (array_key_exists($property, $realProperties)) {
1456 $existingProperties[$property] = $obj->{$property};
1457 } elseif (property_exists($obj, $property)) {
1459 $existingProperties[$property] = $obj->{$property};
1463 return $existingProperties;
1491 $myclone = unserialize(serialize(
$object));
1493 if (!empty($tmpsavdb)) {
1496 } elseif ($native == 2) {
1499 $tmparray = get_object_vars(
$object);
1501 if (is_array($tmparray)) {
1502 foreach ($tmparray as $propertykey => $propertyval) {
1503 if (is_scalar($propertyval) || is_array($propertyval)) {
1504 $myclone->$propertykey = $propertyval;
1524function dol_size($size, $type =
'')
1527 if (empty($conf->dol_optimize_smallscreen)) {
1530 if ($type ==
'width' && $size > 250) {
1555 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1557 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1558 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1559 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1560 $tmp = str_replace(
'..',
'', $tmp);
1581 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1583 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1584 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1585 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1586 $tmp = str_replace(
'..',
'', $tmp);
1601 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1603 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1605 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1609 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1613 $oldstringtoclean = $stringtoclean;
1616 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1617 }
while ($oldstringtoclean != $stringtoclean);
1621 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1624 return $stringtoclean;
1636 $oldstringtoclean = $stringtoclean;
1637 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1638 }
while ($oldstringtoclean != $stringtoclean);
1640 return $stringtoclean;
1655 if (is_null($str)) {
1660 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1661 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1662 return $transliterator->transliterate($str);
1665 $string = rawurlencode($str);
1666 $replacements = array(
1667 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1669 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1670 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1672 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1674 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1675 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1676 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1678 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1679 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1681 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1683 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1684 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1686 $string = strtr($string, $replacements);
1687 return rawurldecode($string);
1692 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1693 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1694 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1695 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1696 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1697 \xF9\xFA\xFB\xFC\xFD\xFF",
1705 $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"));
1723function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1725 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1726 if (empty($keepspaces)) {
1727 $forbidden_chars_to_replace[] =
" ";
1729 $forbidden_chars_to_remove = array();
1732 if (is_array($badcharstoreplace)) {
1733 $forbidden_chars_to_replace = $badcharstoreplace;
1735 if (is_array($badcharstoremove)) {
1736 $forbidden_chars_to_remove = $badcharstoremove;
1740 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1759 if ($removetabcrlf) {
1760 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1762 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1774function dol_escape_js($stringtoescape, $mode = 0, $noescapebackslashn = 0)
1776 if (is_null($stringtoescape)) {
1781 $substitjs = array(
"'" =>
"\\'",
"\r" =>
'\\r');
1783 if (empty($noescapebackslashn)) {
1784 $substitjs[
"\n"] =
'\\n';
1785 $substitjs[
'\\'] =
'\\\\';
1788 $substitjs[
"'"] =
"\\'";
1789 $substitjs[
'"'] =
"\\'";
1790 } elseif ($mode == 1) {
1791 $substitjs[
"'"] =
"\\'";
1792 } elseif ($mode == 2) {
1793 $substitjs[
'"'] =
'\\"';
1794 } elseif ($mode == 3) {
1795 $substitjs[
"'"] =
"\\'";
1796 $substitjs[
'"'] =
"\\\"";
1798 return strtr($stringtoescape, $substitjs);
1809 return str_replace(
'"',
'\"', $stringtoescape);
1821 if (is_null($stringtoescape)) {
1825 if ($stringforquotes == 2) {
1826 return str_replace(
'"',
"'", $stringtoescape);
1827 } elseif ($stringforquotes == 1) {
1833 $stringtoescape = str_replace(
'\\',
'', $stringtoescape);
1834 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1837 return 'Bad parameter for stringforquotes in dol_escape_php';
1848 return $stringtoescape;
1888 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
1912 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
1932function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1934 if ($noescapetags ==
'common') {
1935 $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';
1937 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
1939 if ($cleanalsojavascript) {
1944 if ($escapeonlyhtmltags) {
1945 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1947 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1948 $tmp = str_ireplace(
''',
'__SIMPLEQUOTE', $tmp);
1951 $tmp = strtr($tmp, array(
"<b>" =>
'',
'</b>' =>
'',
'<strong>' =>
'',
'</strong>' =>
''));
1954 $tmp = strtr($tmp, array(
"\r" =>
'\\r',
"\n" =>
'\\n'));
1955 } elseif ($keepn == -1) {
1956 $tmp = strtr($tmp, array(
"\r" =>
'',
"\n" =>
''));
1959 if ($escapeonlyhtmltags) {
1960 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
1963 $tmparrayoftags = array();
1964 if ($noescapetags) {
1965 $tmparrayoftags = explode(
',', $noescapetags);
1967 if (count($tmparrayoftags)) {
1969 $tmp = str_ireplace(
'__DOUBLEQUOTE',
'', $tmp);
1971 foreach ($tmparrayoftags as $tagtoreplace) {
1972 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1973 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1974 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
' \/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1980 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)>/', $tmp, $reg)) {
1981 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
1982 $tmpattributes = str_ireplace(
'href="http:',
'__HREFHTTPA', $tmpattributes);
1983 $tmpattributes = str_ireplace(
'href="https:',
'__HREFHTTPSA', $tmpattributes);
1984 $tmpattributes = str_ireplace(
'src="http:',
'__SRCHTTPIMG', $tmpattributes);
1985 $tmpattributes = str_ireplace(
'src="https:',
'__SRCHTTPSIMG', $tmpattributes);
1986 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
1987 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
1989 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'>/',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
1991 if (preg_match(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+([^>]+)\s+\/>/', $tmp, $reg)) {
1992 $tmpattributes = str_ireplace(array(
'[',
']'),
'_', $reg[1]);
1993 $tmpattributes = str_ireplace(
'"',
'__DOUBLEQUOTE', $tmpattributes);
1994 $tmpattributes = preg_replace(
'/[^a-z0-9_\/\?\;\s=&\.\-@:\.#\+]/i',
'', $tmpattributes);
1996 $tmp = preg_replace(
'/<'.preg_quote($tagtoreplace,
'/').
'\s+'.preg_quote($reg[1],
'/').
'\s+\/>/',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'['.$tmpattributes.
']__', $tmp);
1999 $diff = strcmp($tmpold, $tmp);
2004 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
2008 if (count($tmparrayoftags)) {
2009 foreach ($tmparrayoftags as $tagtoreplace) {
2010 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
2011 $result = preg_replace(
'/__BEGINTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1>', $result);
2012 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
2013 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
2014 $result = preg_replace(
'/__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'\[([^\]]*)\]__/',
'<'.$tagtoreplace.
' \1 />', $result);
2017 $result = str_ireplace(
'__HREFHTTPA',
'href="http:', $result);
2018 $result = str_ireplace(
'__HREFHTTPSA',
'href="https:', $result);
2019 $result = str_ireplace(
'__SRCHTTPIMG',
'src="http:', $result);
2020 $result = str_ireplace(
'__SRCHTTPSIMG',
'src="https:', $result);
2021 $result = str_ireplace(
'__DOUBLEQUOTE',
'"', $result);
2024 $result = str_ireplace(
'__SIMPLEQUOTE',
''', $result);
2041 if (function_exists(
'mb_strtolower')) {
2042 return mb_strtolower($string, $encoding);
2044 return strtolower($string);
2058 if (function_exists(
'mb_strtoupper')) {
2059 return mb_strtoupper($string, $encoding);
2061 return strtoupper($string);
2075 if (function_exists(
'mb_substr')) {
2076 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
2078 return ucfirst($string);
2092 if (function_exists(
'mb_convert_case')) {
2093 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
2095 return ucwords($string);
2121function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
2123 global $conf, $user, $debugbar;
2126 if (!isModEnabled(
'syslog')) {
2131 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
2132 global $website, $websitekey;
2133 if (is_object($website) && !empty($website->ref)) {
2134 $suffixinfilename .=
'_website_'.$website->ref;
2135 } elseif (!empty($websitekey)) {
2136 $suffixinfilename .=
'_website_'.$websitekey;
2141 if (defined(
'USESUFFIXINLOG')) {
2142 $suffixinfilename .= constant(
'USESUFFIXINLOG');
2146 foreach ($conf->loghandlers as $loghandlerinstance) {
2147 $loghandlerinstance->setIdent($ident);
2151 if (!empty($message)) {
2154 $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');
2155 if (!array_key_exists($level, $logLevels)) {
2156 throw new Exception(
'Incorrect log level');
2163 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
2167 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
2168 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
2169 $ospid = sprintf(
"%7s",
dol_trunc(getmypid(), 7,
'right',
'UTF-8', 1));
2170 $osuser =
" ".sprintf(
"%6s",
dol_trunc(function_exists(
'posix_getuid') ? posix_getuid() :
'', 6,
'right',
'UTF-8', 1));
2172 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".sprintf(
"%-7s", $logLevels[$level]).
" ".$ospid.
" ".$osuser.
" ".$message;
2178 print
"\n\n<!-- Log start\n";
2180 print
"Log end -->\n";
2184 'message' => $message,
2185 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') : false),
2187 'user' => ((is_object($user) && $user->id) ? $user->login : false),
2189 'osuser' => function_exists(
'posix_getuid') ? posix_getuid() : false,
2190 'ospid' => getmypid()
2194 if (!empty($remoteip)) {
2195 $data[
'ip'] = $remoteip;
2197 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
2198 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
2199 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
2200 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
2202 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
2204 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
2205 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
2207 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'];
2209 $data[
'ip'] =
'???';
2212 if (!empty($_SERVER[
'USERNAME'])) {
2214 $data[
'osuser'] = $_SERVER[
'USERNAME'];
2215 } elseif (!empty($_SERVER[
'LOGNAME'])) {
2217 $data[
'osuser'] = $_SERVER[
'LOGNAME'];
2221 foreach ($conf->loghandlers as $loghandlerinstance) {
2222 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
2225 $loghandlerinstance->export($data, $suffixinfilename);
2231 foreach ($conf->loghandlers as $loghandlerinstance) {
2232 $loghandlerinstance->setIdent($ident);
2252 $form =
new Form($db);
2254 $templatenameforexport = $website->name_template;
2255 if (empty($templatenameforexport)) {
2256 $templatenameforexport =
'website_'.$website->ref;
2260 $out .=
'<input type="button" class="cursorpointer button bordertransp" id="open-dialog-' . $name .
'" value="'.dol_escape_htmltag($buttonstring).
'"/>';
2263 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">';
2264 $out .=
'jQuery(document).ready(function () {';
2265 $out .=
' jQuery("#open-dialog-' . $name .
'").click(function () {';
2266 $out .=
' var dialogHtml = \'';
2268 $dialogcontent =
' <div id="custom-dialog-' . $name .
'">';
2269 $dialogcontent .=
' <div style="margin-top: 20px;">';
2270 $dialogcontent .=
' <label for="export-site-' . $name .
'"><strong>'.$langs->trans(
"ExportSiteLabel").
'...</label><br>';
2271 $dialogcontent .=
' <button class="button smallpaddingimp" id="export-site-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"DownloadZip")) .
'</button>';
2272 $dialogcontent .=
' </div>';
2273 $dialogcontent .=
' <br>';
2274 $dialogcontent .=
' <div style="margin-top: 20px;">';
2275 $dialogcontent .=
' <strong>'.$langs->trans(
"ExportSiteGitLabel").
' '.$form->textwithpicto(
'', $langs->trans(
"SourceFiles"), 1,
'help',
'', 0, 3,
'').
'</strong><br>';
2276 $dialogcontent .=
' <form action="'.dol_escape_htmltag($overwriteGitUrl).
'" method="POST">';
2277 $dialogcontent .=
' <input type="hidden" name="action" value="overwritesite">';
2278 $dialogcontent .=
' <input type="hidden" name="token" value="'.newToken().
'">';
2279 $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>';
2280 $dialogcontent .=
' <button type="submit" class="button smallpaddingimp" id="overwrite-git-' . $name .
'">' .
dol_escape_htmltag($langs->trans(
"ExportIntoGIT")) .
'</button>';
2281 $dialogcontent .=
' </form>';
2282 $dialogcontent .=
' </div>';
2283 $dialogcontent .=
' </div>';
2290 // Add the content of the dialog to the body of the page
2291 $out .= ' var $dialog = jQuery(
"#custom-dialog-' . $name . '");
';
2292 $out .= ' if ($dialog.length > 0) {
2295 jQuery(
"body").append(dialogHtml);
';
2297 // Configuration of popup
2298 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog({
';
2299 $out .= ' autoOpen:
false,
';
2300 $out .= ' modal:
true,
';
2301 $out .= ' height: 290,
';
2302 $out .= ' width:
"40%",
';
2303 $out .= ' title:
"' . dol_escape_js($label) . '",
';
2306 // Simulate a click on the original "submit" input to export the site.
2307 $out .= ' jQuery(
"#export-site-' . $name . '").click(
function () {
';
2308 $out .= ' console.log(
"Clic on exportsite.");
';
2309 $out .= ' var target = jQuery(
"input[name=\'' . dol_escape_js($exportSiteName) . '\']");
';
2310 $out .= ' console.log(
"element founded:", target.length > 0);
';
2311 $out .= ' if (target.length > 0) { target.click(); }
';
2312 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"close");
';
2316 $out .= ' jQuery(
"#custom-dialog-' . $name . '").dialog(
"open");
';
2317 $out .= ' return false;
';
2320 $out .= '</script>
';
2342function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled = '
', $morecss = 'classlink
button bordertransp
', $jsonopen = '', $backtopagejsfields = '', $accesskey = '')
2346 if (strpos($url, '?
') > 0) {
2347 $url .= '&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2349 $url .= '?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup=
'.urlencode($name);
2354 $backtopagejsfieldsid = '';
2355 $backtopagejsfieldslabel = '';
2356 if ($backtopagejsfields) {
2357 $tmpbacktopagejsfields = explode(':
', $backtopagejsfields);
2358 if (empty($tmpbacktopagejsfields[1])) { // If the part 'keyforpopupid:
' is missing, we add $name for it.
2359 $backtopagejsfields = $name.":".$backtopagejsfields;
2360 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[0]);
2362 $tmp2backtopagejsfields = explode(',
', $tmpbacktopagejsfields[1]);
2364 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ? '' : $tmp2backtopagejsfields[0];
2365 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ? '' : $tmp2backtopagejsfields[1];
2366 $url .= '&backtopagejsfields=
'.urlencode($backtopagejsfields);
2369 //print '<input
type=
"submit" class=
"button bordertransp"'.$disabled.' value=
"'.dol_escape_htmltag($langs->trans("MediaFiles
")).'" name=
"file_manager">
';
2370 $out .= '<!-- a link
for button to open url into a dialog popup with backtopagejsfields =
'.$backtopagejsfields.' -->
';
2371 $out .= '<a
'.($accesskey ? ' accesskey=
"'.$accesskey.'"' : '').' class=
"cursorpointer reposition button_'.$name.($morecss ? ' '.$morecss : '').'"'.$disabled.' title=
"'.dol_escape_htmltag($label).'"';
2372 if (empty($conf->use_javascript_ajax)) {
2373 $out .= ' href=
"'.DOL_URL_ROOT.$url.'" target=
"_blank"';
2374 } elseif ($jsonopen) {
2375 $out .= ' href=
"#" onclick=
"'.$jsonopen.'"';
2377 $out .= ' href=
"#"';
2379 $out .= '>
'.$buttonstring.'</a>
';
2381 if (!empty($conf->use_javascript_ajax)) {
2382 // Add code to open url using the popup. Add also hidden field to retrieve the returned variables
2383 $out .= '<!-- code to open popup and variables to retrieve returned variables -->
';
2384 $out .= '<div
id=
"idfordialog'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for dialog
' : '').'</div>
';
2385 $out .= '<div
id=
"varforreturndialogid'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned
id' : '').'</div>
';
2386 $out .= '<div
id=
"varforreturndialoglabel'.$name.'" class=
"hidden">
'.(getDolGlobalInt('MAIN_OPTIMIZEFORTEXTBROWSER
') < 2 ? 'div
for returned label
' : '').'</div>
';
2388 $out .= '<!-- Add js code to open dialog popup on dialog -->
';
2389 $out .= '<script nonce=
"'.getNonce().'" type=
"text/javascript">
2390 jQuery(document).ready(
function () {
2391 jQuery(
".button_'.$name.'").click(
function () {
2392 console.log(\
'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2393 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2394 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2398 height: (window.innerHeight - 150),
2401 open: function (event, ui) {
2402 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2404 close:
function (event, ui) {
2405 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2406 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2407 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2408 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2409 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2411 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2412 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2417 $tmpdialog.dialog(\
'open\');
2442function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2444 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2463function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2465 global $conf, $langs, $hookmanager;
2469 if (!empty($conf->dol_optimize_smallscreen)) {
2473 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2475 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2476 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2480 if ($morehtmlright) {
2481 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2485 if (!empty($title) && $showtitle && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
2487 $out .=
'<a class="tabTitle">';
2489 $noprefix = $pictoisfullpath;
2490 if (strpos($picto,
'fontawesome_') !==
false) {
2493 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2495 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2503 if (is_array($links) && !empty($links)) {
2504 $keys = array_keys($links);
2506 $maxkey = max($keys);
2512 if (empty($limittoshow)) {
2513 $limittoshow = (!
getDolGlobalString(
'MAIN_MAXTABS_IN_CARD') ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2515 if (!empty($conf->dol_optimize_smallscreen)) {
2523 for ($i = 0; $i <= $maxkey; $i++) {
2524 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2526 if ($i >= $limittoshow) {
2532 for ($i = 0; $i <= $maxkey; $i++) {
2533 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2539 if ($i < $limittoshow || $isactive) {
2541 $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])).
' -->';
2543 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2544 if (!empty($links[$i][0])) {
2545 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2547 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2549 } elseif (!empty($links[$i][1])) {
2551 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2552 if (!empty($links[$i][0])) {
2553 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2554 $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).
'">';
2556 $out .= $links[$i][1];
2557 if (!empty($links[$i][0])) {
2558 $out .=
'</a>'.
"\n";
2560 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2569 $outmore .=
'<div class="popuptabset wordwrap">';
2571 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2572 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2573 if (!empty($links[$i][0])) {
2574 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2576 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2578 } elseif (!empty($links[$i][1])) {
2579 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2580 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2581 $outmore .=
'</a>'.
"\n";
2583 $outmore .=
'</div>';
2590 $outmore .=
'</div>';
2594 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2595 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2596 $widthofpopup = 200;
2598 $tabsname = $moretabssuffix;
2599 if (empty($tabsname)) {
2600 $tabsname = str_replace(
"@",
"", $picto);
2602 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2604 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2606 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2609 $out .=
'<div></div>';
2612 $out .=
'<script nonce="'.getNonce().
'">';
2613 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2614 var x = this.offsetLeft, y = this.offsetTop;
2615 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2616 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2617 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2619 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2622 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2623 $out .=
"</script>";
2626 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2630 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2631 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom')));
2634 if (!empty($dragdropfile)) {
2635 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2638 $parameters = array(
'tabname' => $active,
'out' => $out);
2639 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2641 $out = $hookmanager->resPrint;
2667 if (!$notab || $notab == -1) {
2668 return "\n</div>\n";
2693function dol_banner_tab(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2695 global $conf, $form, $user, $langs, $hookmanager, $action;
2699 $maxvisiblephotos = 1;
2701 $entity = (empty(
$object->entity) ? $conf->entity :
$object->entity);
2703 $showbarcode = !isModEnabled(
'barcode') ? 0 : (empty(
$object->barcode) ? 0 : 1);
2704 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2707 $modulepart =
'unknown';
2709 if (in_array(
$object->element, [
'societe',
'contact',
'product',
'ticket',
'bom'])) {
2710 $modulepart =
$object->element;
2711 } elseif (
$object->element ==
'member') {
2712 $modulepart =
'memberphoto';
2713 } elseif (
$object->element ==
'user') {
2714 $modulepart =
'userphoto';
2717 if (class_exists(
"Imagick")) {
2718 if (
$object->element ==
'expensereport' ||
$object->element ==
'propal' ||
$object->element ==
'commande' ||
$object->element ==
'facture' ||
$object->element ==
'supplier_proposal') {
2719 $modulepart =
$object->element;
2720 } elseif (
$object->element ==
'fichinter' ||
$object->element ==
'intervention') {
2721 $modulepart =
'ficheinter';
2722 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2723 $modulepart =
'contract';
2724 } elseif (
$object->element ==
'order_supplier') {
2725 $modulepart =
'supplier_order';
2726 } elseif (
$object->element ==
'invoice_supplier') {
2727 $modulepart =
'supplier_invoice';
2731 if (
$object->element ==
'product') {
2733 '@phan-var-force Product $object';
2735 $cssclass =
'photowithmargin photoref';
2736 $showimage =
$object->is_photo_available($conf->product->multidir_output[$entity]);
2738 if ($conf->browser->layout ==
'phone') {
2739 $maxvisiblephotos = 1;
2742 $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>';
2746 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2748 $nophoto =
'/public/theme/common/nophoto.png';
2749 $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>';
2752 } elseif (
$object->element ==
'category') {
2754 '@phan-var-force Categorie $object';
2756 $cssclass =
'photowithmargin photoref';
2757 $showimage =
$object->isAnyPhotoAvailable($conf->categorie->multidir_output[$entity]);
2759 if ($conf->browser->layout ==
'phone') {
2760 $maxvisiblephotos = 1;
2763 $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>';
2767 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2769 $nophoto =
'/public/theme/common/nophoto.png';
2770 $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>';
2773 } elseif (
$object->element ==
'bom') {
2775 '@phan-var-force Bom $object';
2777 $cssclass =
'photowithmargin photoref';
2778 $showimage =
$object->is_photo_available($conf->bom->multidir_output[$entity]);
2780 if ($conf->browser->layout ==
'phone') {
2781 $maxvisiblephotos = 1;
2784 $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>';
2788 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2790 $nophoto =
'/public/theme/common/nophoto.png';
2791 $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>';
2794 } elseif (
$object->element ==
'ticket') {
2796 $cssclass =
'photoref';
2798 '@phan-var-force Ticket $object';
2799 $showimage =
$object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.
$object->ref);
2801 if ($conf->browser->layout ==
'phone') {
2802 $maxvisiblephotos = 1;
2806 $showphoto =
$object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2808 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2816 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2818 $nophoto =
img_picto(
'No photo',
'object_ticket');
2819 $morehtmlleft .=
'<!-- No photo to show -->';
2820 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2821 $morehtmlleft .= $nophoto;
2822 $morehtmlleft .=
'</div></div>';
2827 if ($modulepart !=
'unknown' || method_exists(
$object,
'getDataToShowPhoto')) {
2830 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2832 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2833 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2835 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2839 if (empty($subdir)) {
2840 $subdir =
'errorgettingsubdirofobject';
2843 $filepath = $dir_output.$subdir.
"/";
2845 $filepdf = $filepath.$objectref.
".pdf";
2846 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2849 $fileimage = $filepdf.
'_preview.png';
2850 $relativepathimage = $relativepath.
'_preview.png';
2852 $pdfexists = file_exists($filepdf);
2857 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2859 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2868 if ($pdfexists && !$error) {
2869 $heightforphotref = 80;
2870 if (!empty($conf->dol_optimize_smallscreen)) {
2871 $heightforphotref = 60;
2874 if (file_exists($fileimage)) {
2875 $phototoshow =
'<div class="photoref">';
2876 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2877 $phototoshow .=
'</div>';
2880 } elseif (!$phototoshow) {
2881 $phototoshow .= $form->showphoto($modulepart,
$object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2885 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2886 $morehtmlleft .= $phototoshow;
2887 $morehtmlleft .=
'</div>';
2891 if (empty($phototoshow)) {
2892 if (
$object->element ==
'action') {
2894 $cssclass =
'photorefcenter';
2895 $nophoto =
img_picto(
'No photo',
'title_agenda');
2898 $cssclass =
'photorefcenter';
2900 $prefix =
'object_';
2904 if (strpos($picto,
'fontawesome_') !==
false) {
2907 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2909 $morehtmlleft .=
'<!-- No photo to show -->';
2910 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2911 $morehtmlleft .= $nophoto;
2912 $morehtmlleft .=
'</div></div>';
2919 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode(
$object, 100,
'photoref valignmiddle').
'</div>';
2922 if (
$object->element ==
'societe') {
2923 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2926 $morehtmlstatus .=
$object->getLibStatut(6);
2928 } elseif (
$object->element ==
'product') {
2930 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2931 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2933 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2935 $morehtmlstatus .=
' ';
2937 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2938 $morehtmlstatus .=
ajax_object_onoff(
$object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2940 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2942 } elseif (in_array(
$object->element, array(
'salary'))) {
2944 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2947 $morehtmlstatus .= $tmptxt;
2948 } elseif (in_array(
$object->element, array(
'facture',
'invoice',
'invoice_supplier',
'chargesociales',
'loan',
'tva'))) {
2950 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2953 $morehtmlstatus .= $tmptxt;
2954 } elseif (
$object->element ==
'contrat' ||
$object->element ==
'contract') {
2956 $morehtmlstatus .=
$object->getLibStatut(5);
2958 $morehtmlstatus .=
$object->getLibStatut(4);
2960 } elseif (
$object->element ==
'facturerec') {
2961 '@phan-var-force FactureRec $object';
2962 if (
$object->frequency == 0) {
2963 $morehtmlstatus .=
$object->getLibStatut(2);
2965 $morehtmlstatus .=
$object->getLibStatut(5);
2967 } elseif (
$object->element ==
'project_task') {
2972 if (
$object->progress >= 100) {
2975 $tmptxt =
$object->getLibStatut(5);
2976 $morehtmlstatus .= $tmptxt;
2977 } elseif (method_exists(
$object,
'getLibStatut')) {
2978 $tmptxt =
$object->getLibStatut(6);
2979 if (empty($tmptxt) || $tmptxt ==
$object->getLibStatut(3)) {
2980 $tmptxt =
$object->getLibStatut(5);
2982 $morehtmlstatus .= $tmptxt;
2986 if (isModEnabled(
'accounting') && in_array(
$object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2988 if (method_exists(
$object,
'getVentilExportCompta')) {
2989 $accounted =
$object->getVentilExportCompta();
2990 $langs->load(
"accountancy");
2991 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2996 if (!empty(
$object->name_alias)) {
2997 '@phan-var-force Societe $object';
2998 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag(
$object->name_alias).
'</div>';
3002 if (in_array(
$object->element, array(
'product',
'bank_account',
'project_task'))) {
3004 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
3008 if (method_exists(
$object,
'getBannerAddress') && !in_array(
$object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
3011 $morehtmlref .=
'<div class="refidno refaddress">';
3012 $morehtmlref .= $moreaddress;
3013 $morehtmlref .=
'</div>';
3017 $morehtmlref .=
'<div style="clear: both;"></div>';
3018 $morehtmlref .=
'<div class="refidno opacitymedium">';
3019 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int)
$object->id);
3020 $morehtmlref .=
'</div>';
3023 $parameters = array(
'morehtmlref' => &$morehtmlref,
'moreparam' => &$moreparam,
'morehtmlleft' => &$morehtmlleft,
'morehtmlstatus' => &$morehtmlstatus,
'morehtmlright' => &$morehtmlright);
3024 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters,
$object, $action);
3027 } elseif (empty($reshook)) {
3028 $morehtmlref .= $hookmanager->resPrint;
3029 } elseif ($reshook > 0) {
3030 $morehtmlref = $hookmanager->resPrint;
3033 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
3034 print $form->showrefnav(
$object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
3036 print
'<div class="underrefbanner clearboth"></div>';
3048function fieldLabel($langkey, $fieldkey, $fieldrequired = 0)
3052 if ($fieldrequired) {
3053 $ret .=
'<span class="fieldrequired">';
3055 $ret .=
'<label for="'.$fieldkey.
'">';
3056 $ret .= $langs->trans($langkey);
3058 if ($fieldrequired) {
3071function dol_bc($var, $moreclass =
'')
3074 $ret =
' '.$bc[$var];
3076 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
3096 global $langs, $hookmanager;
3099 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
3104 $ret .= ($extralangcode ?
$object->array_languages[
'address'][$extralangcode] : (empty(
$object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep,
$object->address)));
3107 if (isset(
$object->country_code) && in_array(
$object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
3109 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3110 $ret .= (($ret && $town) ? $sep :
'').$town;
3113 $ret .= ($ret ? ($town ?
", " : $sep) :
'').
$object->state;
3116 $ret .= ($ret ? (($town ||
$object->state) ?
", " : $sep) :
'').
$object->zip;
3118 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'GB',
'UK'))) {
3120 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3121 $ret .= ($ret ? $sep :
'').$town;
3123 $ret .= ($ret ?
", " :
'').
$object->state;
3126 $ret .= ($ret ? $sep :
'').
$object->zip;
3128 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'ES',
'TR'))) {
3130 $ret .= ($ret ? $sep :
'').
$object->zip;
3131 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3132 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3134 $ret .= $sep.$object->state;
3136 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'JP'))) {
3139 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3141 } elseif (isset(
$object->country_code) && in_array(
$object->country_code, array(
'IT'))) {
3143 $ret .= ($ret ? $sep :
'').
$object->zip;
3144 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3145 $ret .= ($town ? ((
$object->zip ?
' ' :
'').$town) :
'');
3146 $ret .= (empty(
$object->state_code) ?
'' : (
' '.$object->state_code));
3149 $town = ($extralangcode ?
$object->array_languages[
'town'][$extralangcode] : (empty(
$object->town) ?
'' :
$object->town));
3150 $ret .= !empty(
$object->zip) ? (($ret ? $sep :
'').
$object->zip) :
'';
3151 $ret .= ($town ? ((
$object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
3152 if (!empty(
$object->state) && in_array(
$object->country_code, $countriesusingstate)) {
3153 $ret .= ($ret ?
", " :
'').
$object->state;
3157 if (!is_object($outputlangs)) {
3158 $outputlangs = $langs;
3161 $langs->load(
"dict");
3162 $ret .= (empty(
$object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
3165 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
3166 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters,
$object);
3170 $ret .= $hookmanager->resPrint;
3187function dol_strftime($fmt, $ts =
false, $is_gmt =
false)
3189 if ((abs($ts) <= 0x7FFFFFFF)) {
3192 return 'Error date outside supported range';
3217function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
null, $encodetooutput =
false)
3219 global $conf, $langs;
3226 if ($tzoutput ===
'auto') {
3227 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
3232 $offsettz = $offsetdst = 0;
3235 if (is_string($tzoutput)) {
3236 if ($tzoutput ==
'tzserver') {
3238 $offsettzstring = @date_default_timezone_get();
3243 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
3245 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
3247 if (class_exists(
'DateTimeZone')) {
3248 $user_date_tz =
new DateTimeZone($offsettzstring);
3249 $user_dt =
new DateTime();
3250 $user_dt->setTimezone($user_date_tz);
3251 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
3252 $offsettz = $user_dt->getOffset();
3254 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3255 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3260 if (!is_object($outputlangs)) {
3261 $outputlangs = $langs;
3264 $format =
'daytextshort';
3269 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
3270 $format = preg_replace(
'/inputnoreduce/',
'', $format);
3271 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
3272 if ($formatwithoutreduce != $format) {
3273 $format = $formatwithoutreduce;
3279 if ($format ==
'day') {
3280 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
3281 } elseif ($format ==
'hour') {
3282 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
3283 } elseif ($format ==
'hourduration') {
3284 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
3285 } elseif ($format ==
'daytext') {
3286 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
3287 } elseif ($format ==
'daytextshort') {
3288 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
3289 } elseif ($format ==
'dayhour') {
3290 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
3291 } elseif ($format ==
'dayhoursec') {
3292 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
3293 } elseif ($format ==
'dayhourtext') {
3294 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
3295 } elseif ($format ==
'dayhourtextshort') {
3296 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
3297 } elseif ($format ==
'dayhourlog') {
3299 $format =
'%Y%m%d%H%M%S';
3300 } elseif ($format ==
'dayhourlogsmall') {
3302 $format =
'%y%m%d%H%M';
3303 } elseif ($format ==
'dayhourldap') {
3304 $format =
'%Y%m%d%H%M%SZ';
3305 } elseif ($format ==
'dayhourxcard') {
3306 $format =
'%Y%m%dT%H%M%SZ';
3307 } elseif ($format ==
'dayxcard') {
3309 } elseif ($format ==
'dayrfc') {
3310 $format =
'%Y-%m-%d';
3311 } elseif ($format ==
'dayhourrfc') {
3312 $format =
'%Y-%m-%dT%H:%M:%SZ';
3313 } elseif ($format ==
'standard') {
3314 $format =
'%Y-%m-%d %H:%M:%S';
3317 if ($reduceformat) {
3318 $format = str_replace(
'%Y',
'%y', $format);
3319 $format = str_replace(
'yyyy',
'yy', $format);
3323 if (preg_match(
'/%b/i', $format)) {
3325 $format = str_replace(
'%b',
'__b__', $format);
3326 $format = str_replace(
'%B',
'__B__', $format);
3328 if (preg_match(
'/%a/i', $format)) {
3330 $format = str_replace(
'%a',
'__a__', $format);
3331 $format = str_replace(
'%A',
'__A__', $format);
3336 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)) {
3337 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"]));
3339 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', (
string) $time, $reg)) {
3341 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);
3344 $syear = (!empty($reg[1]) ? $reg[1] :
'');
3345 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
3346 $sday = (!empty($reg[3]) ? $reg[3] :
'');
3347 $shour = (!empty($reg[4]) ? $reg[4] :
'');
3348 $smin = (!empty($reg[5]) ? $reg[5] :
'');
3349 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
3351 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
3354 $tzo =
new DateTimeZone(
'UTC');
3356 $tzo =
new DateTimeZone(date_default_timezone_get());
3358 $dtts =
new DateTime();
3359 $dtts->setTimestamp($time);
3360 $dtts->setTimezone($tzo);
3361 $newformat = str_replace(
3362 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3363 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3366 $ret = $dtts->format($newformat);
3368 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3369 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3374 if ($time < 100000000000) {
3375 $timetouse = $time + $offsettz + $offsetdst;
3378 $tzo =
new DateTimeZone(
'UTC');
3380 $tzo =
new DateTimeZone(date_default_timezone_get());
3382 $dtts =
new DateTime();
3383 $dtts->setTimestamp($timetouse);
3384 $dtts->setTimezone($tzo);
3385 $newformat = str_replace(
3386 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3387 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3390 $ret = $dtts->format($newformat);
3392 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
3393 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3398 $ret =
'Bad value '.$time.
' for date';
3402 if (preg_match(
'/__b__/i', $format)) {
3403 $timetouse = $time + $offsettz + $offsetdst;
3406 $tzo =
new DateTimeZone(
'UTC');
3408 $tzo =
new DateTimeZone(date_default_timezone_get());
3410 $dtts =
new DateTime();
3411 $dtts->setTimestamp($timetouse);
3412 $dtts->setTimezone($tzo);
3413 $month = (int) $dtts->format(
"m");
3414 $month = sprintf(
"%02d", $month);
3415 if ($encodetooutput) {
3416 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3417 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3419 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3420 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3423 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3424 $ret = str_replace(
'__B__', $monthtext, $ret);
3428 if (preg_match(
'/__a__/i', $format)) {
3430 $timetouse = $time + $offsettz + $offsetdst;
3433 $tzo =
new DateTimeZone(
'UTC');
3435 $tzo =
new DateTimeZone(date_default_timezone_get());
3437 $dtts =
new DateTime();
3438 $dtts->setTimestamp($timetouse);
3439 $dtts->setTimezone($tzo);
3440 $w = $dtts->format(
"w");
3441 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3443 $ret = str_replace(
'__A__', $dayweek, $ret);
3444 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3471function dol_getdate($timestamp, $fast =
false, $forcetimezone =
'')
3473 if ($timestamp ===
'') {
3477 $datetimeobj =
new DateTime();
3478 $datetimeobj->setTimestamp($timestamp);
3479 if ($forcetimezone) {
3480 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3483 'year' => ((
int) date_format($datetimeobj,
'Y')),
3484 'mon' => ((
int) date_format($datetimeobj,
'm')),
3485 'mday' => ((
int) date_format($datetimeobj,
'd')),
3486 'wday' => ((
int) date_format($datetimeobj,
'w')),
3487 'yday' => ((
int) date_format($datetimeobj,
'z')),
3488 'hours' => ((
int) date_format($datetimeobj,
'H')),
3489 'minutes' => ((
int) date_format($datetimeobj,
'i')),
3490 'seconds' => ((
int) date_format($datetimeobj,
's')),
3518function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3523 if ($gm ===
'auto') {
3524 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3529 if ($hour == -1 || empty($hour)) {
3532 if ($minute == -1 || empty($minute)) {
3535 if ($second == -1 || empty($second)) {
3541 if (!$month || !$day) {
3550 if ($hour < 0 || $hour > 24) {
3553 if ($minute < 0 || $minute > 60) {
3556 if ($second < 0 || $second > 60) {
3561 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3562 $default_timezone = @date_default_timezone_get();
3563 $localtz =
new DateTimeZone($default_timezone);
3564 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3566 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3568 $localtz =
new DateTimeZone($default_timezone);
3570 dol_syslog(
"Warning dol_tz_string contains an invalid value ".json_encode($_SESSION[
"dol_tz_string"] ??
null), LOG_WARNING);
3571 $default_timezone = @date_default_timezone_get();
3573 } elseif (strrpos($gm,
"tz,") !==
false) {
3574 $timezone = str_replace(
"tz,",
"", $gm);
3576 $localtz =
new DateTimeZone($timezone);
3578 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3582 if (empty($localtz)) {
3583 $localtz =
new DateTimeZone(
'UTC');
3587 $dt =
new DateTime(
'now', $localtz);
3588 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3589 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3590 $date = $dt->getTimestamp();
3606function dol_now($mode =
'auto')
3610 if ($mode ===
'auto') {
3614 if ($mode ==
'gmt') {
3616 } elseif ($mode ==
'tzserver') {
3617 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3619 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3625 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3628 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3629 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3630 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3647 global $conf, $langs;
3650 if (!empty($conf->dol_optimize_smallscreen)) {
3655 if (empty($shortvalue) || $size < ($level * 10)) {
3657 $textunitshort = $langs->trans(
"b");
3658 $textunitlong = $langs->trans(
"Bytes");
3660 $ret = round($size / $level, 0);
3661 $textunitshort = $langs->trans(
"Kb");
3662 $textunitlong = $langs->trans(
"KiloBytes");
3665 if (empty($shortunit)) {
3666 $ret .=
' '.$textunitlong;
3668 $ret .=
' '.$textunitshort;
3684function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3692 $linkstart =
'<a href="';
3693 if (!preg_match(
'/^http/i', $url)) {
3694 $linkstart .=
'http://';
3699 $linkstart .=
' target="'.$target.
'"';
3701 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3705 if (!preg_match(
'/^http/i', $url)) {
3712 if ($morecss ==
'float') {
3713 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3715 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3731function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3733 global $user, $langs, $hookmanager;
3744 if (empty($email)) {
3748 if (!empty($addlink)) {
3749 $newemail =
'<a class="paddingrightonly" style="text-overflow: ellipsis;" href="';
3750 if (!preg_match(
'/^mailto:/i', $email)) {
3751 $newemail .=
'mailto:';
3753 $newemail .= $email;
3756 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3759 $newemail .=
'</a>';
3761 $langs->load(
"errors");
3762 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3765 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3767 $linktoaddaction =
'';
3769 $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>';
3771 if ($linktoaddaction) {
3772 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3776 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3779 $langs->load(
"errors");
3780 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3790 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3792 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3796 $rep .= $hookmanager->resPrint;
3811 $socialnetworks = array();
3813 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3814 $cachekey =
'socialnetworks_' . $conf->entity;
3816 if (!is_null($dataretrieved)) {
3817 $socialnetworks = $dataretrieved;
3819 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3820 $sql .=
" WHERE entity=".$conf->entity;
3821 $resql = $db->query($sql);
3823 while ($obj = $db->fetch_object($resql)) {
3824 $socialnetworks[$obj->code] = array(
3825 'rowid' => $obj->rowid,
3826 'label' => $obj->label,
3828 'icon' => $obj->icon,
3829 'active' => $obj->active,
3835 return $socialnetworks;
3850 global $user, $langs;
3854 if (empty($value)) {
3858 if (!empty($type)) {
3859 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3861 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3862 if ($type ==
'skype') {
3864 $htmllink .=
' <a href="skype:';
3866 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3867 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3868 $htmllink .=
'</a><a href="skype:';
3870 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3871 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3872 $htmllink .=
'</a>';
3873 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3874 $addlink =
'AC_SKYPE';
3877 $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>';
3879 $htmllink .= ($link ?
' '.$link :
'');
3882 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
3885 if (preg_match(
'/^https?:\/\//i', $link)) {
3886 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3888 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3890 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
3891 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3892 if ($tmpvirginurl) {
3893 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3894 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3896 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3897 if ($tmpvirginurl3) {
3898 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3899 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3902 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3903 if ($tmpvirginurl2) {
3904 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3905 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3908 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3909 if (preg_match(
'/^https?:\/\//i', $link)) {
3910 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3912 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3918 $htmllink .=
'</div>';
3920 $langs->load(
"errors");
3921 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3935function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1)
3939 if (empty($profID) || empty($profIDtype)) {
3942 if (empty($countrycode)) {
3943 $countrycode = $mysoc->country_code;
3945 $newProfID = $profID;
3946 $id = substr($profIDtype, -1);
3948 if (strtoupper($countrycode) ==
'FR') {
3952 if ($id == 1 &&
dol_strlen($newProfID) == 9) {
3954 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
3956 if ($id == 2 &&
dol_strlen($newProfID) == 14) {
3958 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
3960 if ($id == 3 &&
dol_strlen($newProfID) == 5) {
3962 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
3964 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
3966 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
3969 if (!empty($addcpButton)) {
3992function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0, $morecss =
'')
3994 global $conf, $user, $langs, $mysoc, $hookmanager;
3997 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3998 if (empty($phone)) {
4004 if (empty($countrycode) && is_object($mysoc)) {
4005 $countrycode = $mysoc->country_code;
4009 if (!empty($conf->dol_optimize_smallscreen) && $separ !=
'hidenum') {
4014 $newphonewa = $phone;
4015 if (strtoupper($countrycode) ==
"FR") {
4018 $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);
4020 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
4022 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
4024 $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);
4026 $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);
4028 $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);
4030 } elseif (strtoupper($countrycode) ==
"CA") {
4032 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
4034 } elseif (strtoupper($countrycode) ==
"PT") {
4036 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4038 } elseif (strtoupper($countrycode) ==
"SR") {
4040 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
4042 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
4044 } elseif (strtoupper($countrycode) ==
"DE") {
4046 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
4048 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
4050 } elseif (strtoupper($countrycode) ==
"ES") {
4052 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4054 } elseif (strtoupper($countrycode) ==
"BF") {
4056 $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);
4058 } elseif (strtoupper($countrycode) ==
"RO") {
4060 $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);
4062 } elseif (strtoupper($countrycode) ==
"TR") {
4064 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4066 } elseif (strtoupper($countrycode) ==
"US") {
4068 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4070 } elseif (strtoupper($countrycode) ==
"MX") {
4072 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4074 $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);
4076 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
4078 } elseif (strtoupper($countrycode) ==
"ML") {
4080 $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);
4082 } elseif (strtoupper($countrycode) ==
"TH") {
4084 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4086 $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);
4088 } elseif (strtoupper($countrycode) ==
"MU") {
4091 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
4093 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
4095 } elseif (strtoupper($countrycode) ==
"ZA") {
4097 $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);
4099 } elseif (strtoupper($countrycode) ==
"SY") {
4101 $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);
4103 $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);
4105 } elseif (strtoupper($countrycode) ==
"AE") {
4107 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
4109 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4111 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
4113 } elseif (strtoupper($countrycode) ==
"DZ") {
4115 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4117 } elseif (strtoupper($countrycode) ==
"BE") {
4119 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
4121 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4123 } elseif (strtoupper($countrycode) ==
"PF") {
4125 $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);
4127 } elseif (strtoupper($countrycode) ==
"CO") {
4129 $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);
4131 } elseif (strtoupper($countrycode) ==
"JO") {
4133 $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);
4135 } elseif (strtoupper($countrycode) ==
"JM") {
4137 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
4139 } elseif (strtoupper($countrycode) ==
"MG") {
4141 $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);
4143 } elseif (strtoupper($countrycode) ==
"GB") {
4145 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
4147 } elseif (strtoupper($countrycode) ==
"CH") {
4149 $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);
4151 $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);
4153 } elseif (strtoupper($countrycode) ==
"TN") {
4155 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4157 } elseif (strtoupper($countrycode) ==
"GF") {
4159 $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);
4161 } elseif (strtoupper($countrycode) ==
"GP") {
4163 $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);
4165 } elseif (strtoupper($countrycode) ==
"MQ") {
4167 $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);
4169 } elseif (strtoupper($countrycode) ==
"IT") {
4171 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
4173 $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);
4175 } elseif (strtoupper($countrycode) ==
"AU") {
4179 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
4181 } elseif (strtoupper($countrycode) ==
"LU") {
4184 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
4186 $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);
4188 $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);
4190 $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);
4192 } elseif (strtoupper($countrycode) ==
"PE") {
4195 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4);
4197 $newphonewa =
'+51'.$newphone;
4198 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 10, 3);
4200 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 8, 4);
4202 $newphonewa = $newphone;
4203 $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);
4207 $newphoneastart = $newphoneaend =
'';
4208 if (!empty($addlink)) {
4209 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
4210 $newphoneastart =
'<a href="tel:'.urlencode($phone).
'">';
4211 $newphoneaend .=
'</a>';
4212 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
4213 if (empty($user->clicktodial_loaded)) {
4214 $user->fetch_clicktodial();
4218 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
4219 if (!empty($user->clicktodial_url)) {
4220 $urlmask = $user->clicktodial_url;
4223 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
4224 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
4225 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
4227 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
4229 $substitarray = array(
'__PHONEFROM__' => $clicktodial_poste,
4230 '__PHONETO__' => urlencode($phone),
4231 '__LOGIN__' => $clicktodial_login,
4232 '__PASS__' => $clicktodial_password);
4236 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
4237 $newphoneaend =
'</a>';
4240 $newphoneastart =
'<a href="'.$url.
'"';
4242 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
4244 $newphoneastart .=
'>';
4245 $newphoneaend .=
'</a>';
4250 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
4252 $addlinktoagenda =
'';
4253 if ($addlink ==
'AC_FAX') {
4257 $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>';
4259 if ($addlinktoagenda) {
4260 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
4265 if (
getDolGlobalString(
'CONTACT_PHONEMOBILE_SHOW_LINK_TO_WHATSAPP') && $withpicto ==
'mobile') {
4267 $newphone .=
' <a href="https://wa.me/'.$newphonewa.
'" target="_blank"';
4268 $newphone .=
'><span class="paddingright fab fa-whatsapp" style="color:#25D366;" title="WhatsApp"></span></a>';
4271 if (empty($titlealt)) {
4272 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
4277 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
4278 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
4279 $rep .= $hookmanager->resPrint;
4281 if (empty($reshook)) {
4284 if ($withpicto ==
'fax') {
4285 $picto =
'phoning_fax';
4286 } elseif ($withpicto ==
'phone') {
4288 } elseif ($withpicto ==
'mobile') {
4289 $picto =
'phoning_mobile';
4294 if ($adddivfloat == 1) {
4295 $rep .=
'<div class="nospan float'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">';
4296 } elseif (empty($adddivfloat)) {
4297 $rep .=
'<span'.($morecss ?
' class="'.$morecss.
'"' :
'').
' style="margin-right: 10px;">';
4300 $rep .= $newphoneastart;
4301 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
4302 if ($separ !=
'hidenum') {
4303 $rep .= ($withpicto ?
' ' :
'').$newphone;
4305 $rep .= $newphoneaend;
4307 if ($adddivfloat == 1) {
4309 } elseif (empty($adddivfloat)) {
4337 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
4338 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
4340 $ret .=
' ('.$countrycode.
')';
4360 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
4361 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
4362 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
4363 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
4365 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
4368 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
4371 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
4387 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
4389 } 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') {
4407 if (!empty($conf->geoipmaxmind->enabled)) {
4411 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4412 $geoip =
new DolGeoIP(
'country', $datafile);
4414 $countrycode = $geoip->getCountryCodeFromIP($ip);
4417 return $countrycode;
4429 global $conf, $langs, $user;
4433 if (!empty($conf->geoipmaxmind->enabled)) {
4438 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4439 $geoip =
new DolGeoIP(
'country', $datafile);
4440 $countrycode = $geoip->getCountryCodeFromIP($ip);
4441 $ret = $countrycode;
4458function dol_print_address($address, $htmlid, $element, $id, $noprint = 0, $charfornl =
'')
4460 global $conf, $user, $langs, $hookmanager;
4466 $parameters = array(
'element' => $element,
'id' => $id);
4467 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4468 $out .= $hookmanager->resPrint;
4470 if (empty($reshook)) {
4471 if (empty($charfornl)) {
4472 $out .= nl2br($address);
4474 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4478 $showgmap = $showomap = 0;
4479 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4482 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4485 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4488 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4491 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4494 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4497 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4500 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4504 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
4505 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4508 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
4509 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4530function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4532 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4535 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4538 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4556 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4557 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4560 if (function_exists(
'getmxrr')) {
4563 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4564 if (count($mxhosts) > 1) {
4567 if (count($mxhosts) == 1 && !in_array((
string) $mxhosts[0], array(
'',
'.'))) {
4604 $tmparray = explode(
' ', $s);
4605 foreach ($tmparray as $tmps) {
4620function dol_strlen($string, $stringencoding =
'UTF-8')
4622 if (is_null($string)) {
4626 if (function_exists(
'mb_strlen')) {
4627 return mb_strlen($string, $stringencoding);
4629 return strlen($string);
4643function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4647 if (empty($stringencoding)) {
4648 $stringencoding = (empty($langs) ?
'UTF-8' : $langs->charset_output);
4652 if (empty($trunconbytes)) {
4653 if (function_exists(
'mb_substr')) {
4654 $ret = mb_substr($string, $start, $length, $stringencoding);
4656 $ret = substr($string, $start, $length);
4659 if (function_exists(
'mb_strcut')) {
4660 $ret = mb_strcut($string, $start, $length, $stringencoding);
4662 $ret = substr($string, $start, $length);
4682function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4690 if (empty($stringencoding)) {
4691 $stringencoding =
'UTF-8';
4694 if (!empty($conf->dol_optimize_smallscreen) && $conf->dol_optimize_smallscreen == 1 && $display == 1) {
4695 $size = round($size / 3);
4699 if ($trunc ==
'right') {
4701 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4703 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4708 } elseif ($trunc ==
'middle') {
4710 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4711 $size1 = round($size / 2);
4712 $size2 = round($size / 2);
4713 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4717 } elseif ($trunc ==
'left') {
4719 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4721 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4725 } elseif ($trunc ==
'wrap') {
4727 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4733 return 'BadParam3CallingDolTrunc';
4747 $type2picto = array(
4748 'varchar' =>
'font',
4751 'int' =>
'sort-numeric-down',
4752 'double' =>
'sort-numeric-down',
4753 'price' =>
'currency',
4754 'pricecy' =>
'multicurrency',
4755 'password' =>
'key',
4756 'boolean' =>
'check-square',
4757 'date' =>
'calendar',
4758 'datetime' =>
'calendar',
4764 'sellist' =>
'list',
4765 'radio' =>
'check-circle',
4766 'checkbox' =>
'list',
4767 'chkbxlst' =>
'list',
4769 'icon' =>
"question",
4770 'point' =>
"country",
4771 'multipts' =>
'country',
4772 'linestrg' =>
"country",
4773 'polygon' =>
"country",
4774 'separate' =>
'minus'
4777 if (!empty($type2picto[$key])) {
4778 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4781 return img_picto(
'',
'generic',
'class="pictofixedwidth'.($morecss ?
' '.$morecss :
'').
'"');
4806function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4811 $url = DOL_URL_ROOT;
4812 $theme = isset($conf->theme) ? $conf->theme :
null;
4813 $path =
'theme/'.$theme;
4814 if (empty($picto)) {
4819 if ($pictoisfullpath) {
4821 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4824 $fullpathpicto = $picto;
4826 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4827 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4828 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4831 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', (is_null($picto) ?
'' : $picto));
4832 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4833 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4835 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
4837 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4838 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4841 if ($pictowithouttext ==
'file-o') {
4842 $pictowithouttext =
'file';
4845 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4846 $marginleftonlyshort = 0;
4848 if (!empty($pictowithouttextarray[1])) {
4850 $fakey =
'fa-'.$pictowithouttextarray[0];
4851 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
4852 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4853 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4855 $fakey =
'fa-'.$pictowithouttext;
4865 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4866 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4867 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4869 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4870 $morestyle = $reg[1];
4871 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4873 $moreatt = trim($moreatt);
4875 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4876 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4880 $enabledisablehtml .=
'</span>';
4882 return $enabledisablehtml;
4885 if (empty($srconly) && in_array($pictowithouttext, array(
4886 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4887 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'ai',
'angle-double-down',
'angle-double-up',
'asset',
4888 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bom',
'bookcal',
'bookmark',
'briefcase-medical',
'bug',
'building',
4889 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4890 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4891 'check-circle',
'check-square',
'circle',
'stop-circle',
'currency',
'multicurrency',
4892 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
4893 'chevron-double-left',
'chevron-double-right',
'chevron-double-down',
'chevron-double-top',
4894 'commercial',
'companies',
4895 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4896 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4897 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
4898 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4899 'hands-helping',
'help',
'holiday',
4900 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4901 'key',
'knowledgemanagement',
4902 'label',
'language',
'layout',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4903 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4904 'off',
'on',
'order',
4905 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4906 'stock',
'resize',
'service',
'stats',
4907 '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',
4908 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4909 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4910 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4911 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4912 'technic',
'ticket',
4914 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4915 'shapes',
'skill',
'square',
'sort-numeric-down',
'status',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4916 'terminal',
'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
'trip',
4917 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4918 'conferenceorbooth',
'eventorganization',
4919 'stamp',
'signature',
4922 $fakey = $pictowithouttext;
4926 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'))) {
4929 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4933 $arrayconvpictotofa = array(
4934 'account' =>
'university',
'accounting_account' =>
'clipboard-list',
'accountline' =>
'receipt',
'accountancy' =>
'search-dollar',
'action' =>
'calendar-alt',
'add' =>
'plus-circle',
'address' =>
'address-book',
'ai' =>
'magic',
4935 'asset' =>
'money-check-alt',
'autofill' =>
'fill',
4936 'bank_account' =>
'university',
4937 'bill' =>
'file-invoice-dollar',
'billa' =>
'file-excel',
'billr' =>
'file-invoice-dollar',
'billd' =>
'file-medical',
4938 'bookcal' =>
'calendar-check',
4939 'supplier_invoice' =>
'file-invoice-dollar',
'supplier_invoicea' =>
'file-excel',
'supplier_invoicer' =>
'file-invoice-dollar',
'supplier_invoiced' =>
'file-medical',
4941 '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',
4942 'chevron-double-left' =>
'angle-double-left',
'chevron-double-right' =>
'angle-double-right',
'chevron-double-down' =>
'angle-double-down',
'chevron-double-top' =>
'angle-double-up',
4943 'donation' =>
'file-alt',
'dynamicprice' =>
'hand-holding-usd',
4944 'setup' =>
'cog',
'companies' =>
'building',
'products' =>
'cube',
'commercial' =>
'suitcase',
'invoicing' =>
'coins',
4945 'accounting' =>
'search-dollar',
'category' =>
'tag',
'dollyrevert' =>
'dolly',
4946 'file-o' =>
'file',
'generate' =>
'plus-square',
'hrm' =>
'user-tie',
'incoterm' =>
'truck-loading',
4947 'margin' =>
'calculator',
'members' =>
'user-friends',
'ticket' =>
'ticket-alt',
'globe' =>
'external-link-alt',
'lot' =>
'barcode',
4948 'email' =>
'at',
'establishment' =>
'building',
'edit' =>
'pencil-alt',
'entity' =>
'globe',
4949 'graph' =>
'chart-line',
'grip_title' =>
'arrows-alt',
'grip' =>
'arrows-alt',
'help' =>
'question-circle',
4950 'generic' =>
'file',
'holiday' =>
'umbrella-beach',
4951 'info' =>
'info-circle',
'inventory' =>
'boxes',
'intracommreport' =>
'globe-europe',
'jobprofile' =>
'cogs',
4952 'knowledgemanagement' =>
'ticket-alt',
'label' =>
'layer-group',
'layout' =>
'columns',
'line' =>
'bars',
'loan' =>
'money-bill-alt',
4953 'member' =>
'user-alt',
'meeting' =>
'chalkboard-teacher',
'mrp' =>
'cubes',
'next' =>
'arrow-alt-circle-right',
4954 'trip' =>
'wallet',
'expensereport' =>
'wallet',
'group' =>
'users',
'movement' =>
'people-carry',
4955 'sign-out' =>
'sign-out-alt',
4956 'switch_off' =>
'toggle-off',
'switch_on' =>
'toggle-on',
'switch_on_warning' =>
'toggle-on',
'switch_on_red' =>
'toggle-on',
'check' =>
'check',
'bookmark' =>
'star',
4957 'bank' =>
'university',
'close_title' =>
'times',
'delete' =>
'trash',
'filter' =>
'filter',
4958 'list-alt' =>
'list-alt',
'calendarlist' =>
'bars',
'calendar' =>
'calendar-alt',
'calendarmonth' =>
'calendar-alt',
'calendarweek' =>
'calendar-week',
'calendarday' =>
'calendar-day',
'calendarperuser' =>
'table',
4959 'intervention' =>
'ambulance',
'invoice' =>
'file-invoice-dollar',
'order' =>
'file-invoice',
4960 'error' =>
'exclamation-triangle',
'warning' =>
'exclamation-triangle',
4961 'other' =>
'square',
4962 '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',
4963 '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',
4964 'recent' =>
'check-square',
'reception' =>
'dolly',
'recruitmentjobposition' =>
'id-card-alt',
'recruitmentcandidature' =>
'id-badge',
4965 'resize' =>
'crop',
'supplier_order' =>
'dol-order_supplier',
'supplier_proposal' =>
'file-signature',
4966 'refresh' =>
'redo',
'region' =>
'map-marked',
'replacement' =>
'exchange-alt',
'resource' =>
'laptop-house',
'recurring' =>
'history',
4967 'service' =>
'concierge-bell',
4968 'skill' =>
'shapes',
'state' =>
'map-marked-alt',
'security' =>
'key',
'salary' =>
'wallet',
'shipment' =>
'dolly',
'stock' =>
'box-open',
'stats' =>
'chart-bar',
'split' =>
'code-branch',
4969 'status' =>
'stop-circle',
4970 'stripe' =>
'stripe-s',
'supplier' =>
'building',
4971 'technic' =>
'cogs',
'tick' =>
'check',
'timespent' =>
'clock',
'title_setup' =>
'tools',
'title_accountancy' =>
'money-check-alt',
'title_bank' =>
'university',
'title_hrm' =>
'umbrella-beach',
4972 'title_agenda' =>
'calendar-alt',
4973 'uncheck' =>
'times',
'uparrow' =>
'share',
'url' =>
'external-link-alt',
'vat' =>
'money-check-alt',
'vcard' =>
'arrow-alt-circle-down',
4974 'jabber' =>
'comment-o',
4975 'website' =>
'globe-americas',
'workstation' =>
'pallet',
'webhook' =>
'bullseye',
'world' =>
'globe',
'private' =>
'user-lock',
4976 'conferenceorbooth' =>
'chalkboard-teacher',
'eventorganization' =>
'project-diagram',
4977 'webportal' =>
'door-open'
4979 if ($conf->currency ==
'EUR') {
4980 $arrayconvpictotofa[
'currency'] =
'euro-sign';
4981 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
4983 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
4984 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
4986 if ($pictowithouttext ==
'off') {
4987 $fakey =
'fa-square';
4989 } elseif ($pictowithouttext ==
'on') {
4990 $fakey =
'fa-check-square';
4992 } elseif ($pictowithouttext ==
'listlight') {
4993 $fakey =
'fa-download';
4994 $marginleftonlyshort = 1;
4995 } elseif ($pictowithouttext ==
'printer') {
4996 $fakey =
'fa-print';
4998 } elseif ($pictowithouttext ==
'note') {
4999 $fakey =
'fa-sticky-note';
5000 $marginleftonlyshort = 1;
5001 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
5002 $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');
5003 $fakey =
'fa-'.$convertarray[$pictowithouttext];
5004 if (preg_match(
'/selected/', $pictowithouttext)) {
5007 $marginleftonlyshort = 1;
5008 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
5009 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
5011 $fakey =
'fa-'.$pictowithouttext;
5014 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment',
'reception'))) {
5015 $morecss .=
' em092';
5017 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
5018 $morecss .=
' em088';
5020 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
5021 $morecss .=
' em080';
5025 $arrayconvpictotomarginleftonly = array(
5026 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
5027 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
5028 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
5030 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
5031 $marginleftonlyshort = 0;
5035 $arrayconvpictotomorcess = array(
5036 'action' =>
'infobox-action',
'account' =>
'infobox-bank_account',
'accounting_account' =>
'infobox-bank_account',
'accountline' =>
'infobox-bank_account',
'accountancy' =>
'infobox-bank_account',
'asset' =>
'infobox-bank_account',
5037 'bank_account' =>
'infobox-bank_account',
5038 'bill' =>
'infobox-commande',
'billa' =>
'infobox-commande',
'billr' =>
'infobox-commande',
'billd' =>
'infobox-commande',
5039 'bookcal' =>
'infobox-action',
5040 'margin' =>
'infobox-bank_account',
'conferenceorbooth' =>
'infobox-project',
5041 'cash-register' =>
'infobox-bank_account',
'contract' =>
'infobox-contrat',
'check' =>
'font-status4',
'collab' =>
'infobox-action',
'conversation' =>
'infobox-contrat',
5042 'donation' =>
'infobox-commande',
'dolly' =>
'infobox-commande',
'dollyrevert' =>
'flip infobox-order_supplier',
5043 'ecm' =>
'infobox-action',
'eventorganization' =>
'infobox-project',
5044 'hrm' =>
'infobox-adherent',
'group' =>
'infobox-adherent',
'intervention' =>
'infobox-contrat',
5045 'incoterm' =>
'infobox-supplier_proposal',
5046 'currency' =>
'infobox-bank_account',
'multicurrency' =>
'infobox-bank_account',
5047 'members' =>
'infobox-adherent',
'member' =>
'infobox-adherent',
'money-bill-alt' =>
'infobox-bank_account',
5048 'order' =>
'infobox-commande',
5049 'user' =>
'infobox-adherent',
'users' =>
'infobox-adherent',
5050 'error' =>
'pictoerror',
'warning' =>
'pictowarning',
'switch_on' =>
'font-status4',
'switch_on_warning' =>
'font-status4 warning',
'switch_on_red' =>
'font-status8',
5051 'holiday' =>
'infobox-holiday',
'info' =>
'opacityhigh',
'invoice' =>
'infobox-commande',
5052 'knowledgemanagement' =>
'infobox-contrat rotate90',
'loan' =>
'infobox-bank_account',
5053 'payment' =>
'infobox-bank_account',
'payment_vat' =>
'infobox-bank_account',
'poll' =>
'infobox-adherent',
'pos' =>
'infobox-bank_account',
'project' =>
'infobox-project',
'projecttask' =>
'infobox-project',
5054 'propal' =>
'infobox-propal',
'proposal' =>
'infobox-propal',
'private' =>
'infobox-project',
5055 'reception' =>
'flip infobox-order_supplier',
'recruitmentjobposition' =>
'infobox-adherent',
'recruitmentcandidature' =>
'infobox-adherent',
5056 'resource' =>
'infobox-action',
5057 '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',
5058 'supplier' =>
'infobox-order_supplier',
'supplier_order' =>
'infobox-order_supplier',
'supplier_proposal' =>
'infobox-supplier_proposal',
5059 'ticket' =>
'infobox-contrat',
'title_accountancy' =>
'infobox-bank_account',
'title_hrm' =>
'infobox-holiday',
'expensereport' =>
'infobox-expensereport',
'trip' =>
'infobox-expensereport',
'title_agenda' =>
'infobox-action',
5060 'vat' =>
'infobox-bank_account',
5062 'list-alt' =>
'imgforviewmode',
'calendar' =>
'imgforviewmode',
'calendarweek' =>
'imgforviewmode',
'calendarmonth' =>
'imgforviewmode',
'calendarday' =>
'imgforviewmode',
'calendarperuser' =>
'imgforviewmode'
5064 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5065 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
5069 $arrayconvpictotocolor = array(
5070 'address' =>
'#6c6aa8',
'building' =>
'#6c6aa8',
'bom' =>
'#a69944',
5071 'clone' =>
'#999',
'cog' =>
'#999',
'companies' =>
'#6c6aa8',
'company' =>
'#6c6aa8',
'contact' =>
'#6c6aa8',
'cron' =>
'#555',
5072 'dynamicprice' =>
'#a69944',
5073 'edit' =>
'#444',
'note' =>
'#999',
'error' =>
'',
'help' =>
'#bbb',
'listlight' =>
'#999',
'language' =>
'#555',
5075 'lock' =>
'#ddd',
'lot' =>
'#a69944',
5076 'map-marker-alt' =>
'#aaa',
'mrp' =>
'#a69944',
'product' =>
'#a69944',
'service' =>
'#a69944',
'inventory' =>
'#a69944',
'stock' =>
'#a69944',
'movement' =>
'#a69944',
5077 'other' =>
'#ddd',
'world' =>
'#986c6a',
5078 'partnership' =>
'#6c6aa8',
'playdisabled' =>
'#ccc',
'printer' =>
'#444',
'projectpub' =>
'#986c6a',
'resize' =>
'#444',
'rss' =>
'#cba',
5080 'security' =>
'#999',
'square' =>
'#888',
'stop-circle' =>
'#888',
'stats' =>
'#444',
'switch_off' =>
'#999',
5081 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
5082 'uncheck' =>
'#800',
'uparrow' =>
'#555',
'user-cog' =>
'#999',
'country' =>
'#aaa',
'globe-americas' =>
'#aaa',
'region' =>
'#aaa',
'state' =>
'#aaa',
5083 'website' =>
'#304',
'workstation' =>
'#a69944'
5085 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
5086 $facolor = $arrayconvpictotocolor[$pictowithouttext];
5093 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
5094 $morecss .= ($morecss ?
' ' :
'').$reg[1];
5095 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
5097 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
5098 $morestyle = $reg[1];
5099 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
5101 $moreatt = trim($moreatt);
5103 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
5104 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.
dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
5108 $enabledisablehtml .=
'</span>';
5110 return $enabledisablehtml;
5117 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
5118 $path = $theme.
'/theme/'.$theme;
5123 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
5129 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
5134 foreach ($conf->file->dol_document_root as $type => $dirroot) {
5135 if ($type ==
'main') {
5139 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
5140 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
5146 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
5150 return $fullpathpicto;
5154 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 :
'').
'"').
'>';
5170function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $srconly = 0, $notitle = 0)
5172 if (strpos($picto,
'^') === 0) {
5173 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
5175 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
5190function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
5194 if (is_numeric($picto)) {
5197 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
5198 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5202 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
5204 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
5218function img_picto_common($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $notitle = 0)
5222 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
5226 if ($pictoisfullpath) {
5229 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
5232 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
5234 if (file_exists($themepath)) {
5240 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
5256function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
5260 if (empty($titlealt) || $titlealt ==
'default') {
5261 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
5263 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
5264 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
5266 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
5267 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
5269 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
5270 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
5272 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
5273 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
5275 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
5277 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
5281 if (!is_numeric($numaction)) {
5285 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
5295function img_pdf($titlealt =
'default', $size = 3)
5299 if ($titlealt ==
'default') {
5300 $titlealt = $langs->trans(
'Show');
5303 return img_picto($titlealt,
'pdf'.$size.
'.png');
5313function img_edit_add($titlealt =
'default', $other =
'')
5317 if ($titlealt ==
'default') {
5318 $titlealt = $langs->trans(
'Add');
5321 return img_picto($titlealt,
'edit_add.png', $other);
5334 if ($titlealt ==
'default') {
5335 $titlealt = $langs->trans(
'Remove');
5338 return img_picto($titlealt,
'edit_remove.png', $other);
5349function img_edit($titlealt =
'default', $float = 0, $other =
'')
5353 if ($titlealt ==
'default') {
5354 $titlealt = $langs->trans(
'Modify');
5357 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
5368function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
5372 if ($titlealt ==
'default') {
5373 $titlealt = $langs->trans(
'View');
5376 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
5378 return img_picto($titlealt,
'eye', $moreatt);
5389function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
5393 if ($titlealt ==
'default') {
5394 $titlealt = $langs->trans(
'Delete');
5397 return img_picto($titlealt,
'delete.png', $other, 0, 0, 0,
'', $morecss);
5407function img_printer($titlealt =
"default", $other =
'')
5410 if ($titlealt ==
"default") {
5411 $titlealt = $langs->trans(
"Print");
5413 return img_picto($titlealt,
'printer.png', $other);
5423function img_split($titlealt =
'default', $other =
'class="pictosplit"')
5427 if ($titlealt ==
'default') {
5428 $titlealt = $langs->trans(
'Split');
5431 return img_picto($titlealt,
'split.png', $other);
5441function img_help($usehelpcursor = 1, $usealttitle = 1)
5446 if (is_string($usealttitle)) {
5449 $usealttitle = $langs->trans(
'Info');
5453 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5462function img_info($titlealt =
'default')
5466 if ($titlealt ==
'default') {
5467 $titlealt = $langs->trans(
'Informations');
5470 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5481function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5485 if ($titlealt ==
'default') {
5486 $titlealt = $langs->trans(
'Warning');
5490 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5499function img_error($titlealt =
'default')
5503 if ($titlealt ==
'default') {
5504 $titlealt = $langs->trans(
'Error');
5507 return img_picto($titlealt,
'error.png');
5517function img_next($titlealt =
'default', $moreatt =
'')
5521 if ($titlealt ==
'default') {
5522 $titlealt = $langs->trans(
'Next');
5526 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5536function img_previous($titlealt =
'default', $moreatt =
'')
5540 if ($titlealt ==
'default') {
5541 $titlealt = $langs->trans(
'Previous');
5545 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5556function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5560 if ($titlealt ==
'default') {
5561 $titlealt = $langs->trans(
'Down');
5564 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5575function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5579 if ($titlealt ==
'default') {
5580 $titlealt = $langs->trans(
'Up');
5583 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5594function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5598 if ($titlealt ==
'default') {
5599 $titlealt = $langs->trans(
'Left');
5602 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5613function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5617 if ($titlealt ==
'default') {
5618 $titlealt = $langs->trans(
'Right');
5621 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5631function img_allow($allow, $titlealt =
'default')
5635 if ($titlealt ==
'default') {
5636 $titlealt = $langs->trans(
'Active');
5640 return img_picto($titlealt,
'tick.png');
5655 if (is_null($morecss)) {
5659 if ($brand ==
'visa' || $brand ==
'Visa') {
5661 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5662 $brand =
'cc-mastercard';
5663 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5665 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5666 $brand =
'cc-discover';
5667 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5669 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5670 $brand =
'cc-diners-club';
5671 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5672 $brand =
'credit-card';
5675 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5686function img_mime($file, $titlealt =
'', $morecss =
'')
5688 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5694 if (empty($titlealt)) {
5695 $titlealt =
'Mime type: '.$mimetype;
5699 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5710function img_search($titlealt =
'default', $other =
'')
5714 if ($titlealt ==
'default') {
5715 $titlealt = $langs->trans(
'Search');
5718 $img =
img_picto($titlealt,
'search.png', $other, 0, 1);
5720 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5721 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5737 if ($titlealt ==
'default') {
5738 $titlealt = $langs->trans(
'Search');
5741 $img =
img_picto($titlealt,
'searchclear.png', $other, 0, 1);
5743 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5744 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5761function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'', $picto =
'')
5763 global $conf, $langs;
5765 if ($infoonimgalt) {
5766 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5768 if (empty($conf->use_javascript_ajax)) {
5769 $textfordropdown =
'';
5772 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5773 $fa =
'info-circle';
5774 if ($picto ==
'warning') {
5775 $fa =
'exclamation-triangle';
5777 $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> ';
5779 $result .= ($nodiv ?
'' :
'</div>');
5781 if ($textfordropdown) {
5782 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5783 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5784 jQuery(document).ready(function() {
5785 jQuery(".'.$class.
'text").click(function() {
5786 console.log("toggle text");
5787 jQuery(".'.$class.
'").toggle();
5792 $result = $tmpresult.$result;
5813 global $conf, $langs, $user, $argv;
5814 global $dolibarr_main_prod;
5821 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5823 $langs->load(
"main");
5827 $langs->loadLangs(array(
'main',
'errors'));
5829 if ($_SERVER[
'DOCUMENT_ROOT']) {
5830 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5832 $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";
5834 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5836 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5837 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5838 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5839 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5841 if ($user instanceof
User) {
5842 $out .=
"<b>".$langs->trans(
"Login").
":</b> ".$user->login.
"<br>\n";
5844 if (function_exists(
"phpversion")) {
5845 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5847 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5848 if (function_exists(
"php_uname")) {
5849 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5851 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5853 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5854 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5855 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5857 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5858 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5860 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5861 $syslog .=
"pid=".dol_getmypid();
5864 if (!empty($conf->modules)) {
5865 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".implode(
', ', $conf->modules).
"<br>\n";
5868 if (is_object($db)) {
5869 if ($_SERVER[
'DOCUMENT_ROOT']) {
5870 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5871 $lastqueryerror = $db->lastqueryerror();
5873 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5875 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5876 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5877 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5881 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5882 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5883 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5884 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5886 $syslog .=
", sql=".$db->lastquery();
5887 $syslog .=
", db_error=".$db->lasterror();
5890 if ($error || $errors) {
5892 if (is_array($error) && is_array($errors)) {
5893 $errors = array_merge($error, $errors);
5894 } elseif (is_array($error)) {
5896 } elseif (is_array($errors) && !empty($error)) {
5897 $errors = array_merge(array($error), $errors);
5898 } elseif (!empty($error)) {
5899 $errors = array_merge(array($error), array($errors));
5902 $langs->load(
"errors");
5904 foreach ($errors as $msg) {
5908 if ($_SERVER[
'DOCUMENT_ROOT']) {
5911 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5913 $syslog .=
", msg=".$msg;
5916 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5917 xdebug_print_function_stack();
5918 $out .=
'<b>XDebug information:</b>'.
"<br>\n";
5919 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5920 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5921 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5926 if (!headers_sent()) {
5927 if (function_exists(
'top_httphead')) {
5931 http_response_code(202);
5934 if (empty($dolibarr_main_prod)) {
5937 if (empty($langs->defaultlang)) {
5938 $langs->setDefaultLang();
5940 $langs->loadLangs(array(
"main",
"errors"));
5942 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";
5943 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5944 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5945 if (!defined(
"MAIN_CORE_ERROR")) {
5946 define(
"MAIN_CORE_ERROR", 1);
5963function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5967 if (empty($email)) {
5971 $langs->load(
"errors");
5974 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5975 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5976 if ($errormessage) {
5977 print
'<br><br>'.$errormessage;
5979 if (is_array($errormessages) && count($errormessages)) {
5980 foreach ($errormessages as $mesgtoshow) {
5981 print
'<br><br>'.$mesgtoshow;
5984 print
'</div></div>';
6003function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
6005 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
6026function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
6028 global $langs, $form;
6031 if ($moreattrib ==
'class="right"') {
6032 $prefix .=
'right ';
6035 $sortorder = strtoupper($sortorder);
6044 $tmpsortfield = explode(
',', $sortfield);
6045 $sortfield1 = trim($tmpsortfield[0]);
6046 $tmpfield = explode(
',', $field);
6047 $field1 = trim($tmpfield[0]);
6049 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
6050 $prefix =
'wrapcolumntitle '.$prefix;
6056 $liste_titre =
'liste_titre';
6057 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
6058 $liste_titre =
'liste_titre_sel';
6061 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
6066 if (empty($thead) && $field && empty($disablesortlink)) {
6067 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6068 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6069 $options = preg_replace(
'/&+/i',
'&', $options);
6070 if (!preg_match(
'/^&/', $options)) {
6071 $options =
'&'.$options;
6074 $sortordertouseinlink =
'';
6075 if ($field1 != $sortfield1) {
6076 if (preg_match(
'/^DESC/i', $sortorder)) {
6077 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6079 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6082 if (preg_match(
'/^ASC/i', $sortorder)) {
6083 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
6085 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
6088 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
6089 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
6095 if (preg_match(
'/:\w+$/', $tooltip)) {
6096 $tmptooltip = explode(
':', $tooltip);
6098 $tmptooltip = array($tooltip);
6100 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
6102 $out .= $langs->trans($name);
6105 if (empty($thead) && $field && empty($disablesortlink)) {
6109 if (empty($thead) && $field) {
6110 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
6111 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
6112 $options = preg_replace(
'/&+/i',
'&', $options);
6113 if (!preg_match(
'/^&/', $options)) {
6114 $options =
'&'.$options;
6117 if (!$sortorder || ($field1 != $sortfield1)) {
6121 if (preg_match(
'/^DESC/', $sortorder)) {
6124 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
6126 if (preg_match(
'/^ASC/', $sortorder)) {
6129 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
6134 $tagend =
'</'.$tag.
'>';
6136 $out = $tagstart.$sortimg.$out.$tagend;
6151 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
6153 print
'<div class="titre">'.$title.
'</div>';
6167function print_fiche_titre($title, $mesg =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'')
6185function load_fiche_titre($title, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
6189 if ($picto ==
'setup') {
6194 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
6195 $return .=
'<tr class="titre">';
6197 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
6199 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
6200 $return .=
'<div class="titre inline-block">';
6202 $return .=
'</div>';
6205 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6208 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
6210 $return .=
'</tr></table>'.
"\n";
6238function 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 =
'')
6243 $savtotalnboflines = $totalnboflines;
6244 if (is_numeric($totalnboflines)) {
6245 $totalnboflines = abs($totalnboflines);
6248 $page = (int) $page;
6250 if ($picto ==
'setup') {
6251 $picto =
'title_setup.png';
6253 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
6254 $picto =
'title.gif';
6257 $limit = $conf->liste_limit;
6260 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
6268 print
"<!-- Begin title -->\n";
6269 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
6273 if ($picto && $title) {
6274 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
6277 print
'<td class="nobordernopadding valignmiddle col-title">';
6278 print
'<div class="titre inline-block">';
6280 if (!empty($title) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
6281 print
'<span class="opacitymedium colorblack paddingleft totalnboflines">('.$totalnboflines.
')</span>';
6283 print
'</div></td>';
6286 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
6287 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
6291 print
'<td class="nobordernopadding valignmiddle right col-right">';
6292 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
6294 $options .=
"&sortfield=".urlencode($sortfield);
6297 $options .=
"&sortorder=".urlencode($sortorder);
6301 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
6302 if ($totalnboflines) {
6304 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
6307 $nbpages = ceil($totalnboflines / $limit);
6311 $cpt = ($page - $maxnbofpage);
6317 if (empty($pagenavastextinput)) {
6318 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
6320 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6321 } elseif ($cpt == 2) {
6322 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
6328 if ($pagenavastextinput) {
6329 if ($cpt == $page) {
6330 $pagelist .=
'<li class="pagination pageplusone"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
6334 if ($cpt == $page) {
6335 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
6337 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
6341 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
6343 if (empty($pagenavastextinput)) {
6344 if ($cpt < $nbpages) {
6345 if ($cpt < $nbpages - 2) {
6346 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
6347 } elseif ($cpt == $nbpages - 2) {
6348 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
6350 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6354 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
6357 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
6361 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
6362 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
6366 if ($pagenavastextinput) {
6373 print
'</table>'.
"\n";
6376 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
6377 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
6380 print
"<!-- End title -->\n\n";
6399function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
6401 global $conf, $langs;
6403 print
'<div class="pagination"><ul>';
6404 if ($beforearrows) {
6405 print
'<li class="paginationbeforearrows">';
6406 print $beforearrows;
6410 if (empty($hidenavigation)) {
6411 if ((
int) $limit > 0 && empty($hideselectlimit)) {
6412 $pagesizechoices =
'10:10,15:15,20:20,25:25,50:50,100:100,250:250,500:500,1000:1000';
6413 $pagesizechoices .=
',5000:5000,10000:10000';
6422 print
'<li class="pagination">';
6423 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.
'">';
6424 print
'<datalist id="limitlist">';
6426 print
'<li class="paginationcombolimit valignmiddle">';
6427 print
'<select id="limit" class="flat selectlimit nopadding maxwidth75 center" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
6429 $tmpchoice = explode(
',', $pagesizechoices);
6430 $tmpkey = $limit.
':'.$limit;
6431 if (!in_array($tmpkey, $tmpchoice)) {
6432 $tmpchoice[] = $tmpkey;
6434 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
6435 if (!in_array($tmpkey, $tmpchoice)) {
6436 $tmpchoice[] = $tmpkey;
6438 asort($tmpchoice, SORT_NUMERIC);
6439 foreach ($tmpchoice as $val) {
6441 $tmp = explode(
':', $val);
6444 if ($key !=
'' && $val !=
'') {
6445 if ((
int) $key == (
int) $limit) {
6446 $selected =
' selected="selected"';
6448 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6452 print
'</datalist>';
6455 print
ajax_combobox(
"limit", array(), 0, 0,
'resolve', -1,
'limit');
6459 if ($conf->use_javascript_ajax) {
6460 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6462 jQuery(document).ready(function () {
6463 jQuery(".selectlimit").change(function() {
6464 console.log("Change limit. Send submit");
6465 $(this).parents(\'form:first\').submit();
6474 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>';
6476 if ($betweenarrows) {
6477 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6478 print $betweenarrows;
6479 print
'<!--</div>-->';
6481 if ($nextpage > 0) {
6482 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>';
6485 print
'<li class="paginationafterarrows">';
6490 print
'</ul></div>'.
"\n";
6505function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6509 if (preg_match(
'/%/', $rate)) {
6510 $rate = str_replace(
'%',
'', $rate);
6514 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6515 $morelabel =
' ('.$reg[1].
')';
6516 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6517 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6519 if (preg_match(
'/\*/', $rate)) {
6520 $rate = str_replace(
'*',
'', $rate);
6525 if (!preg_match(
'/\//', $rate)) {
6526 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6529 $ret = $rate.($addpercent ?
'%' :
'');
6531 if (($info_bits & 1) && $usestarfornpr >= 0) {
6554function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6556 global $langs, $conf;
6559 if (empty($amount)) {
6562 $amount = (is_numeric($amount) ? $amount : 0);
6563 if ($rounding == -1) {
6566 $nbdecimal = $rounding;
6568 if ($outlangs ===
'none') {
6578 if (!($outlangs instanceof
Translate)) {
6582 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6583 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6585 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6586 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6588 if ($thousand ==
'None') {
6590 } elseif ($thousand ==
'Space') {
6597 $amount = str_replace(
',',
'.', $amount);
6599 $data = explode(
'.', $amount);
6600 $decpart = isset($data[1]) ? $data[1] :
'';
6601 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6610 $max_nbdecimal = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6611 if ($trunc && $nbdecimal > $max_nbdecimal) {
6612 $nbdecimal = $max_nbdecimal;
6620 if ((
string) $forcerounding !=
'-1') {
6621 if ($forcerounding ===
'MU') {
6623 } elseif ($forcerounding ===
'MT') {
6625 } elseif ($forcerounding >= 0) {
6626 $nbdecimal = $forcerounding;
6631 $output = number_format((
float) $amount, $nbdecimal, $dec, $thousand);
6633 $output = preg_replace(
'/\s/',
' ', $output);
6634 $output = preg_replace(
'/\'/',
''', $output);
6637 $cursymbolbefore = $cursymbolafter =
'';
6638 if ($currency_code && is_object($outlangs)) {
6639 if ($currency_code ==
'auto') {
6640 $currency_code = $conf->currency;
6643 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6644 $listoflanguagesbefore = array(
'nl_NL');
6645 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6646 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6648 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6649 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6652 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6681function price2num($amount, $rounding =
'', $option = 0)
6683 global $langs, $conf;
6686 if (is_null($amount)) {
6695 if (is_null($langs)) {
6699 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6700 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6702 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6703 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6706 if ($thousand ==
'None') {
6708 } elseif ($thousand ==
'Space') {
6716 if (!is_numeric($amount)) {
6717 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6720 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6721 $amount = str_replace($thousand,
'', $amount);
6727 if (is_numeric($amount)) {
6729 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6730 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6732 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6737 if ($thousand !=
',' && $thousand !=
'.') {
6738 $amount = str_replace(
',',
'.', $amount);
6741 $amount = str_replace(
' ',
'', $amount);
6742 $amount = str_replace($thousand,
'', $amount);
6743 $amount = str_replace($dec,
'.', $amount);
6745 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6751 $nbofdectoround =
'';
6752 if ($rounding ==
'MU') {
6754 } elseif ($rounding ==
'MT') {
6756 } elseif ($rounding ==
'MS') {
6757 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6758 } elseif ($rounding ==
'CU') {
6760 } elseif ($rounding ==
'CT') {
6762 } elseif (is_numeric($rounding)) {
6763 $nbofdectoround = (int) $rounding;
6768 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6770 return 'ErrorBadParameterProvidedToFunction';
6776 if (is_numeric($amount)) {
6778 $temps = sprintf(
"%10.10F", $amount - intval($amount));
6779 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6781 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6787 if ($thousand !=
',' && $thousand !=
'.') {
6788 $amount = str_replace(
',',
'.', $amount);
6791 $amount = str_replace(
' ',
'', $amount);
6792 $amount = str_replace($thousand,
'', $amount);
6793 $amount = str_replace($dec,
'.', $amount);
6795 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6813function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6815 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6817 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6818 $dimension *= 1000000;
6820 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6823 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6824 $dimension /= 1000000;
6826 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6843 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6845 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6863function get_localtax($vatrate, $local, $thirdparty_buyer =
null, $thirdparty_seller =
null, $vatnpr = 0)
6865 global $db, $conf, $mysoc;
6867 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6868 $thirdparty_seller = $mysoc;
6871 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);
6873 $vatratecleaned = $vatrate;
6875 if (preg_match(
'/^(.*)\s*\((.*)\)$/', (
string) $vatrate, $reg)) {
6876 $vatratecleaned = trim($reg[1]);
6877 $vatratecode = $reg[2];
6886 if ($mysoc->country_code ==
'ES') {
6888 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6891 if ($thirdparty_seller->id == $mysoc->id) {
6892 if (!$thirdparty_buyer->localtax1_assuj) {
6896 if (!$thirdparty_seller->localtax1_assuj) {
6904 if (!$mysoc->localtax2_assuj) {
6907 if ($thirdparty_seller->id == $mysoc->id) {
6908 if (!$thirdparty_buyer->localtax2_assuj) {
6912 if (!$thirdparty_seller->localtax2_assuj) {
6918 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6921 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6927 if (in_array($mysoc->country_code, array(
'ES'))) {
6928 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6934 if ($thirdparty_seller != $mysoc) {
6936 return $thirdparty_seller->localtax1_value;
6940 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6945 if ($thirdparty_seller != $mysoc) {
6948 return $thirdparty_seller->localtax2_value;
6951 if (in_array($mysoc->country_code, array(
'ES'))) {
6952 return $thirdparty_buyer->localtax2_value;
6954 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6961 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6962 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6963 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6964 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6965 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6966 if (!empty($vatratecode)) {
6967 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6969 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6972 $resql = $db->query($sql);
6975 $obj = $db->fetch_object($resql);
6978 return $obj->localtax1;
6979 } elseif ($local == 2) {
6980 return $obj->localtax2;
7001 $valors = explode(
":", $tax);
7003 if (count($valors) > 1) {
7020 $sql =
" SELECT t.localtax".$local.
" as localtax";
7021 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
7022 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
7023 $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";
7024 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
7025 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
7026 $sql .=
" ORDER BY t.rowid DESC";
7028 $resql = $db->query($sql);
7030 $obj = $db->fetch_object($resql);
7032 return $obj->localtax;
7053function getTaxesFromId($vatrate, $buyer =
null, $seller =
null, $firstparamisid = 1)
7057 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
7060 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
7061 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
7062 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7063 if ($firstparamisid) {
7064 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7066 $vatratecleaned = $vatrate;
7069 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7070 $vatratecleaned = $reg[1];
7071 $vatratecode = $reg[2];
7074 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7077 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($seller->country_code).
"'";
7078 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7079 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7081 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7085 $resql = $db->query($sql);
7087 $obj = $db->fetch_object($resql);
7090 'rowid' => $obj->rowid,
7091 'code' => $obj->code,
7092 'rate' => $obj->rate,
7093 'localtax1' => $obj->localtax1,
7094 'localtax1_type' => $obj->localtax1_type,
7095 'localtax2' => $obj->localtax2,
7096 'localtax2_type' => $obj->localtax2_type,
7098 'accountancy_code_sell' => $obj->accountancy_code_sell,
7099 'accountancy_code_buy' => $obj->accountancy_code_buy
7131 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
7134 $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";
7135 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
7136 if ($firstparamisid) {
7137 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
7139 $vatratecleaned = $vatrate;
7142 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
7143 $vatratecleaned = $reg[1];
7144 $vatratecode = $reg[2];
7147 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
7148 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
7149 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
7150 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7152 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
7153 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
7155 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
7157 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
7161 $resql = $db->query($sql);
7163 $obj = $db->fetch_object($resql);
7166 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
7169 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7170 } elseif ($local == 2) {
7171 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
7173 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);
7195 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7203 $product->fetch($idprod);
7205 if (($mysoc->country_code == $thirdpartytouse->country_code)
7206 || (in_array($mysoc->country_code, array(
'FR',
'MC')) && in_array($thirdpartytouse->country_code, array(
'FR',
'MC')))
7207 || (in_array($mysoc->country_code, array(
'MQ',
'GP')) && in_array($thirdpartytouse->country_code, array(
'MQ',
'GP')))
7210 if ($idprodfournprice > 0) {
7211 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
7213 $ret = $product->vatrate_supplier;
7214 if ($product->default_vat_code_supplier) {
7215 $ret .=
' ('.$product->default_vat_code_supplier.
')';
7221 $ret = $product->tva_tx;
7222 if ($product->default_vat_code) {
7223 $ret .=
' ('.$product->default_vat_code.
')';
7236 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
7237 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7238 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
7239 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7240 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
7241 $sql .= $db->plimit(1);
7243 $resql = $db->query($sql);
7245 $obj = $db->fetch_object($resql);
7247 $ret = $obj->vat_rate;
7248 if ($obj->default_vat_code) {
7249 $ret .=
' ('.$obj->default_vat_code.
')';
7273 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
7290 if (!class_exists(
'Product')) {
7291 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7300 $result = $product->fetch($idprod);
7302 if ($mysoc->country_code == $thirdpartytouse->country_code) {
7316 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
7317 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
7318 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
7319 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7320 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
7321 $sql .= $db->plimit(1);
7323 $resql = $db->query($sql);
7325 $obj = $db->fetch_object($resql);
7328 $ret = $obj->localtax1;
7329 } elseif ($local == 2) {
7330 $ret = $obj->localtax2;
7338 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
7362 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
7365 $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;
7367 $seller_country_code = $thirdparty_seller->country_code;
7368 $seller_in_cee =
isInEEC($thirdparty_seller);
7370 $buyer_country_code = $thirdparty_buyer->country_code;
7371 $buyer_in_cee =
isInEEC($thirdparty_buyer);
7373 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 :
''));
7378 if ($seller_in_cee && $buyer_in_cee) {
7379 $isacompany = $thirdparty_buyer->isACompany();
7380 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7381 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7395 if (!$seller_use_vat) {
7401 if (($seller_country_code == $buyer_country_code)
7402 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))
7403 || (in_array($seller_country_code, array(
'MQ',
'GP')) && in_array($buyer_country_code, array(
'MQ',
'GP')))
7408 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
7412 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
7414 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
7415 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
7417 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
7429 if (($seller_in_cee && $buyer_in_cee)) {
7430 $isacompany = $thirdparty_buyer->isACompany();
7431 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
7432 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
7449 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
7450 $isacompany = $thirdparty_buyer->isACompany();
7478 if ($idprodfournprice > 0) {
7479 if (!class_exists(
'ProductFournisseur')) {
7480 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7483 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7484 return $prodprice->fourn_tva_npr;
7485 } elseif ($idprod > 0) {
7486 if (!class_exists(
'Product')) {
7487 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7490 $prod->fetch($idprod);
7491 return $prod->tva_npr;
7514 if (!is_object($thirdparty_seller)) {
7517 if (!is_object($thirdparty_buyer)) {
7522 if ($mysoc->country_code ==
'ES') {
7523 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7528 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7531 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7535 } elseif ($local == 2) {
7537 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7540 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7545 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7560function yn($yesno, $case = 1, $color = 0)
7564 $result =
'unknown';
7566 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7567 $result = $langs->trans(
'yes');
7568 if ($case == 1 || $case == 3) {
7569 $result = $langs->trans(
"Yes");
7572 $result =
'<input type="checkbox" value="1" checked disabled>';
7575 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7582 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7583 $result = $langs->trans(
"no");
7584 if ($case == 1 || $case == 3) {
7585 $result = $langs->trans(
"No");
7588 $result =
'<input type="checkbox" value="0" disabled>';
7591 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7594 $result =
img_picto(
'uncheck',
'uncheck');
7600 $classname =
'error';
7604 return '<span class="'.$classname.
'">'.$result.
'</span>';
7627function get_exdir($num, $level, $alpha, $withoutslash,
$object, $modulepart =
'')
7629 if (empty($modulepart) && is_object(
$object)) {
7630 if (!empty(
$object->module)) {
7631 $modulepart =
$object->module;
7632 } elseif (!empty(
$object->element)) {
7633 $modulepart =
$object->element;
7640 $arrayforoldpath = array(
'cheque' => 2,
'category' => 2,
'holiday' => 2,
'supplier_invoice' => 2,
'invoice_supplier' => 2,
'mailing' => 2,
'supplier_payment' => 2);
7642 $arrayforoldpath[
'product'] = 2;
7645 if (empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7646 $level = $arrayforoldpath[$modulepart];
7649 if (!empty($level) && array_key_exists($modulepart, $arrayforoldpath)) {
7651 if (empty($num) && is_object(
$object)) {
7654 if (empty($alpha)) {
7655 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7657 $num = preg_replace(
'/^.*\-/i',
'', $num);
7659 $num = substr(
"000".$num, -$level);
7661 $path = substr($num, 0, 1);
7664 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7667 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7677 if (empty($withoutslash) && !empty($path)) {
7692function dol_mkdir($dir, $dataroot =
'', $newmask =
'')
7696 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7699 if (@is_dir($dir_osencoded)) {
7707 if (!empty($dataroot)) {
7709 $dir = str_replace($dataroot.
'/',
'', $dir);
7710 $ccdir = $dataroot.
'/';
7713 $cdir = explode(
"/", $dir);
7714 $num = count($cdir);
7715 for ($i = 0; $i < $num; $i++) {
7717 $ccdir .=
'/'.$cdir[$i];
7719 $ccdir .= $cdir[$i];
7722 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7730 if (!@is_dir($ccdir_osencoded)) {
7731 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7734 $dirmaskdec = octdec((
string) $newmask);
7735 if (empty($newmask)) {
7736 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7738 $dirmaskdec |= octdec(
'0111');
7739 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7741 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7744 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7753 return ($nberr ? -$nberr : $nbcreated);
7764function dolChmod($filepath, $newmask =
'')
7768 if (!empty($newmask)) {
7769 @chmod($filepath, octdec($newmask));
7771 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7783 return '<span class="fieldrequired">*</span>';
7803function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7805 if (is_null($stringtoclean)) {
7809 if ($removelinefeed == 2) {
7810 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7812 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7817 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7818 $temp = str_replace(
'<:',
'__lttwopoints__', $temp);
7821 $temp = strip_tags($temp);
7824 $pattern =
"/<[^<>]+>/";
7831 $tempbis = str_replace(
'<>',
'', $temp);
7832 $tempbis = preg_replace($pattern,
'', $tempbis);
7834 }
while ($tempbis != $temp);
7839 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7845 if ($removelinefeed == 1) {
7846 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7850 if ($removedoublespaces) {
7851 while (strpos($temp,
" ")) {
7852 $temp = str_replace(
" ",
" ", $temp);
7856 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7857 $temp = str_replace(
'__lttwopoints__',
'<:', $temp);
7877function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7879 if (empty($allowed_tags)) {
7880 $allowed_tags = array(
7881 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7882 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7883 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7886 $allowed_tags[] =
"comment";
7888 if (!in_array(
'iframe', $allowed_tags)) {
7889 $allowed_tags[] =
"iframe";
7893 if (!in_array(
'link', $allowed_tags)) {
7894 $allowed_tags[] =
"link";
7898 $allowed_tags_string = implode(
"><", $allowed_tags);
7899 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7901 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7906 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7908 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7909 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7912 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7914 if ($cleanalsosomestyles) {
7915 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7917 if ($removeclassattribute) {
7918 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7923 if ($cleanalsojavascript) {
7924 $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);
7927 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7929 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7950 if (is_null($allowed_attributes)) {
7951 $allowed_attributes = array(
7952 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
7954 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7958 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7959 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7962 $dom =
new DOMDocument(
'',
'UTF-8');
7964 $savwarning = error_reporting();
7965 error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
7966 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOXMLDECL);
7967 error_reporting($savwarning);
7969 if ($dom instanceof DOMDocument) {
7970 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7971 $el = $els->item($i);
7972 if (!$el instanceof DOMElement) {
7975 $attrs = $el->attributes;
7976 for ($ii = $attrs->length - 1; $ii >= 0; $ii--) {
7978 if (!empty($attrs->item($ii)->name)) {
7979 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7981 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7982 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7984 $valuetoclean = $attrs->item($ii)->value;
7986 if (isset($valuetoclean)) {
7988 $oldvaluetoclean = $valuetoclean;
7989 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7990 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7991 if ($els->item($i)->tagName ==
'a') {
7992 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7993 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7994 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7998 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7999 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
8000 }
while ($oldvaluetoclean != $valuetoclean);
8003 $attrs->item($ii)->value = $valuetoclean;
8010 $return = $dom->saveHTML();
8013 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
8014 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
8015 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
8016 return trim($return);
8018 return $stringtoclean;
8035 $temp = $stringtoclean;
8036 foreach ($disallowed_tags as $tagtoremove) {
8037 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
8038 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
8041 if ($cleanalsosomestyles) {
8042 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
8060 if ($nboflines == 1) {
8062 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
8063 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
8066 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
8071 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
8075 $text = preg_replace(
'/\n/',
'', $text);
8077 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8079 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8082 $text = strtr($text, $repTable);
8083 if ($charset ==
'UTF-8') {
8084 $pattern =
'/(<br[^>]*>)/Uu';
8087 $pattern =
'/(<br[^>]*>)/U';
8089 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8094 $lastaddediscontent = 1;
8095 while ($countline < $nboflines && isset($a[$i])) {
8096 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
8097 if (array_key_exists($i + 1, $a) && !empty($a[$i + 1])) {
8098 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
8100 if (!$lastaddediscontent) {
8103 $lastaddediscontent = 0;
8106 $firstline .= $a[$i];
8107 $lastaddediscontent = 1;
8113 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i + 1, $a) && !empty($a[$i + 1]))));
8115 $ret = $firstline.($adddots ?
'...' :
'');
8133function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
8135 if (is_null($stringtoencode)) {
8140 return nl2br($stringtoencode, $forxml);
8142 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
8156function dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox = 0, $check =
'restricthtml')
8158 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
8163 return $stringtoencode;
8165 $out = $stringtoencode;
8169 $oldstringtoclean = $out;
8171 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
8173 libxml_use_internal_errors(
false);
8174 if (LIBXML_VERSION < 20900) {
8178 libxml_disable_entity_loader(
true);
8181 $dom =
new DOMDocument();
8187 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
8189 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
8192 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
8193 $out = trim($dom->saveHTML());
8196 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
8197 $out = preg_replace(
'/<\/div>$/',
'', $out);
8201 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8205 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
8208 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
8214 'quote-marks' =>
false,
8215 'doctype' =>
'strict',
8216 'show-body-only' =>
true,
8217 "indent-attributes" =>
false,
8218 "vertical-space" =>
false,
8230 $out = $tidy->repairString($out, $config,
'utf8');
8237 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
8242 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
8245 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
8249 $out = preg_replace(
'/'/i',
''', $out);
8254 $out = preg_replace_callback(
8255 '/&#(x?[0-9][0-9a-f]+;?)/i',
8260 static function ($m) {
8267 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
8278 $out = preg_replace(
'/'/i',
"'", $out);
8282 $out = preg_replace(
'/on(mouse|drag|key|load|touch|pointer|select|transition)[a-z]*\s*=/i',
'', $out);
8283 $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);
8284 $out = preg_replace(
'/on(dblclick|drop|durationchange|emptied|end|ended|error|focus|focusin|focusout|formdata|gotpointercapture|hashchange|input|invalid)[a-z]*\s*=/i',
'', $out);
8285 $out = preg_replace(
'/on(lostpointercapture|offline|online|pagehide|pageshow)[a-z]*\s*=/i',
'', $out);
8286 $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);
8287 $out = preg_replace(
'/on(timeupdate|toggle|unload|volumechange|waiting|wheel)[a-z]*\s*=/i',
'', $out);
8289 $out = preg_replace(
'/on(repeat|begin|finish|beforeinput)[a-z]*\s*=/i',
'', $out);
8290 }
while ($oldstringtoclean != $out);
8297 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
8298 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
8299 $nblinks = count($reg[0]);
8300 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
8301 $out =
'ErrorTooManyLinksIntoHTMLString';
8304 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
8306 $out =
'ErrorHTMLLinksNotAllowed';
8308 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
8311 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
8314 if (preg_match_all($pattern, $out, $matches)) {
8316 $urls = $matches[1];
8319 foreach ($urls as $url) {
8321 echo
"Found url = ".$url .
"\n";
8324 $out =
'ErrorHTMLExternalLinksNotAllowed';
8353function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
8355 if (is_null($stringtoencode)) {
8359 $newstring = $stringtoencode;
8361 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
8362 if ($removelasteolbr) {
8363 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
8365 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
8366 $newstring = strtr($newstring, array(
'&' =>
'__and__',
'<' =>
'__lt__',
'>' =>
'__gt__',
'"' =>
'__dquot__'));
8368 $newstring = strtr($newstring, array(
'__and__' =>
'&',
'__lt__' =>
'<',
'__gt__' =>
'>',
'__dquot__' =>
'"'));
8370 if ($removelasteolbr) {
8371 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
8390 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
8391 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
8392 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
8393 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
8405 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
8406 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
8422 if ($keepsomeentities) {
8423 $newstring = strtr($newstring, array(
'&' =>
'__andamp__',
'<' =>
'__andlt__',
'>' =>
'__andgt__',
'"' =>
'__dquot__'));
8425 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
8426 if ($keepsomeentities) {
8427 $newstring = strtr($newstring, array(
'__andamp__' =>
'&',
'__andlt__' =>
'<',
'__andgt__' =>
'>',
'__dquot__' =>
'"'));
8443function dol_htmlentities($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
8445 return htmlentities($string, $flags, $encoding, $double_encode);
8464 for ($scursor = 0; $scursor < $len; $scursor++) {
8465 $ordchar = ord($s[$scursor]);
8467 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
8470 } elseif ($ordchar > 126 && $ordchar < 160) {
8474 $out .= $s[$scursor];
8496 $arraystring = explode(
"\n", $s);
8497 $nb = count($arraystring);
8514 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8516 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8519 $text = strtr($text, $repTable);
8520 if ($charset ==
'UTF-8') {
8521 $pattern =
'/(<br[^>]*>)/Uu';
8524 $pattern =
'/(<br[^>]*>)/U';
8526 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8528 $nblines = (int) floor((count($a) + 1) / 2);
8531 foreach ($a as $line) {
8534 $line_dec = html_entity_decode($line);
8536 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8537 $nblines += substr_count($line_dec,
'\n');
8557 if (is_null($msg)) {
8562 if (preg_match(
'/<html/i', $msg)) {
8564 } elseif (preg_match(
'/<body/i', $msg)) {
8566 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8568 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8570 } elseif (preg_match(
'/<br/i', $msg)) {
8576 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8577 if (preg_match(
'/<html/i', $msg)) {
8579 } elseif (preg_match(
'/<body/i', $msg)) {
8581 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8583 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8585 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8587 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8589 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8591 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8593 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8595 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8597 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8600 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8622function dol_concatdesc($text1, $text2, $forxml =
false, $invert =
false)
8624 if (!empty($invert)) {
8632 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8654 global $db, $conf, $mysoc, $user, $extrafields;
8656 $substitutionarray = array();
8658 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8662 $emailsendersignature = $user->signature;
8663 $usersignature = $user->signature;
8664 $substitutionarray = array_merge($substitutionarray, array(
8665 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8669 if (is_object($user) && ($user instanceof
User)) {
8670 $substitutionarray = array_merge($substitutionarray, array(
8671 '__USER_ID__' => (
string) $user->id,
8672 '__USER_LOGIN__' => (
string) $user->login,
8673 '__USER_EMAIL__' => (
string) $user->email,
8674 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8675 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8676 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8677 '__USER_FAX__' => (
string) $user->office_fax,
8678 '__USER_LASTNAME__' => (
string) $user->lastname,
8679 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8680 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8681 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8682 '__USER_JOB__' => (string) $user->job,
8684 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8688 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8689 $substitutionarray = array_merge($substitutionarray, array(
8690 '__MYCOMPANY_NAME__' => $mysoc->name,
8691 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8692 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8693 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8694 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8695 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8696 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8697 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8698 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8699 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8700 '__MYCOMPANY_PROFID7__' => $mysoc->idprof7,
8701 '__MYCOMPANY_PROFID8__' => $mysoc->idprof8,
8702 '__MYCOMPANY_PROFID9__' => $mysoc->idprof9,
8703 '__MYCOMPANY_PROFID10__' => $mysoc->idprof10,
8704 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8705 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8706 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8707 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8708 '__MYCOMPANY_TOWN__' => $mysoc->town,
8709 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8710 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8711 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8712 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8716 if (($onlykey || is_object(
$object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8718 $substitutionarray[
'__ID__'] =
'__ID__';
8719 $substitutionarray[
'__REF__'] =
'__REF__';
8720 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8721 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8722 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8723 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8724 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8725 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8726 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8728 if (isModEnabled(
"societe")) {
8729 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8730 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8731 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8732 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8733 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8734 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8736 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8737 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8738 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8739 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8740 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8741 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8742 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8743 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8744 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8745 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8746 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8747 $substitutionarray[
'__THIRDPARTY_IDPROF7__'] =
'__THIRDPARTY_IDPROF7__';
8748 $substitutionarray[
'__THIRDPARTY_IDPROF8__'] =
'__THIRDPARTY_IDPROF8__';
8749 $substitutionarray[
'__THIRDPARTY_IDPROF9__'] =
'__THIRDPARTY_IDPROF9__';
8750 $substitutionarray[
'__THIRDPARTY_IDPROF10__'] =
'__THIRDPARTY_IDPROF10__';
8751 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8752 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8753 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8755 if (isModEnabled(
'member') && (!is_object(
$object) ||
$object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8756 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8757 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8758 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8759 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8760 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8765 if (isModEnabled(
'ticket') && (!is_object(
$object) ||
$object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8766 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8767 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8768 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8769 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8770 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8771 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8772 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8773 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8774 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8777 if (isModEnabled(
'recruitment') && (!is_object(
$object) ||
$object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8778 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8779 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8780 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8782 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8783 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8784 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8785 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8789 if (isModEnabled(
'contract') && (!is_object(
$object) ||
$object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8790 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8791 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8792 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8793 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8795 if (isModEnabled(
"propal") && (!is_object(
$object) ||
$object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8796 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8798 if (isModEnabled(
"intervention") && (!is_object(
$object) ||
$object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8799 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8801 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8802 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8803 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8804 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8805 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8806 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8807 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8809 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8810 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8811 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8812 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8813 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8815 if (isModEnabled(
"shipping") && (!is_object(
$object) ||
$object->element ==
'shipping')) {
8816 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8817 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8818 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8820 if (isModEnabled(
"reception") && (!is_object(
$object) ||
$object->element ==
'reception')) {
8821 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shipping tracking number of shipment';
8822 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8825 '@phan-var-force Adherent|Delivery $object';
8826 $substitutionarray[
'__ID__'] =
$object->id;
8827 $substitutionarray[
'__REF__'] =
$object->ref;
8828 $substitutionarray[
'__NEWREF__'] =
$object->newref;
8830 $substitutionarray[
'__REF_CLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8831 $substitutionarray[
'__REF_SUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8832 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset(
$object->note_public) ?
$object->note_public :
null);
8833 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset(
$object->note_private) ?
$object->note_private :
null);
8834 $substitutionarray[
'__DATE_CREATION__'] = (isset(
$object->date_creation) ?
dol_print_date(
$object->date_creation,
'day', 0, $outputlangs) :
'');
8835 $substitutionarray[
'__DATE_MODIFICATION__'] = (isset(
$object->date_modification) ?
dol_print_date(
$object->date_modification,
'day', 0, $outputlangs) :
'');
8836 $substitutionarray[
'__DATE_VALIDATION__'] = (isset(
$object->date_validation) ?
dol_print_date(
$object->date_validation,
'day', 0, $outputlangs) :
'');
8837 $substitutionarray[
'__DATE_DELIVERY__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
'day', 0, $outputlangs) :
'');
8839 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%A") :
'');
8841 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset(
$object->date_delivery) ?
dol_print_date(
$object->date_delivery,
"%b") :
'');
8848 $substitutionarray[
'__REFCLIENT__'] = (isset(
$object->ref_client) ?
$object->ref_client : (isset(
$object->ref_customer) ?
$object->ref_customer :
null));
8849 $substitutionarray[
'__REFSUPPLIER__'] = (isset(
$object->ref_supplier) ?
$object->ref_supplier :
null);
8850 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset(
$object->delivery_date) ?
dol_print_date(
$object->delivery_date,
'day', 0, $outputlangs) :
'');
8851 $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 :
'')) :
'');
8855 '@phan-var-force Adherent $object';
8858 $substitutionarray[
'__MEMBER_ID__'] = (isset(
$object->id) ?
$object->id :
'');
8859 if (method_exists(
$object,
'getCivilityLabel')) {
8860 $substitutionarray[
'__MEMBER_CIVILITY__'] =
$object->getCivilityLabel();
8862 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset(
$object->firstname) ?
$object->firstname :
'');
8863 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset(
$object->lastname) ?
$object->lastname :
'');
8864 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8865 if (method_exists(
$object,
'getFullName')) {
8866 $substitutionarray[
'__MEMBER_FULLNAME__'] =
$object->getFullName($outputlangs);
8868 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset(
$object->societe) ?
$object->societe :
'');
8869 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset(
$object->address) ?
$object->address :
'');
8870 $substitutionarray[
'__MEMBER_ZIP__'] = (isset(
$object->zip) ?
$object->zip :
'');
8871 $substitutionarray[
'__MEMBER_TOWN__'] = (isset(
$object->town) ?
$object->town :
'');
8872 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset(
$object->country) ?
$object->country :
'');
8873 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset(
$object->email) ?
$object->email :
'');
8874 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8875 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset(
$object->photo) ?
$object->photo :
'');
8876 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset(
$object->login) ?
$object->login :
'');
8877 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset(
$object->pass) ?
$object->pass :
'');
8881 $substitutionarray[
'__MEMBER_TYPE__'] = (isset(
$object->type) ?
$object->type :
'');
8882 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->first_subscription_date,
'day');
8884 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->first_subscription_date,
'dayrfc');
8885 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'day') :
'');
8886 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START_RFC__'] = (isset(
$object->first_subscription_date_start) ?
dol_print_date(
$object->first_subscription_date_start,
'dayrfc') :
'');
8887 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'day') :
'');
8888 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END_RFC__'] = (isset(
$object->first_subscription_date_end) ?
dol_print_date(
$object->first_subscription_date_end,
'dayrfc') :
'');
8889 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date(
$object->last_subscription_date,
'day');
8890 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_RFC__'] =
dol_print_date(
$object->last_subscription_date,
'dayrfc');
8891 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date(
$object->last_subscription_date_start,
'day');
8892 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START_RFC__'] =
dol_print_date(
$object->last_subscription_date_start,
'dayrfc');
8893 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date(
$object->last_subscription_date_end,
'day');
8894 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END_RFC__'] =
dol_print_date(
$object->last_subscription_date_end,
'dayrfc');
8898 '@phan-var-force Societe $object';
8899 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object) ?
$object->id :
'');
8900 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object) ?
$object->name :
'');
8901 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object) ?
$object->name_alias :
'');
8902 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object) ?
$object->code_client :
'');
8903 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object) ?
$object->code_fournisseur :
'');
8904 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object) ?
$object->email :
'');
8905 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object) ?
$object->email :
'');
8908 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object) ?
$object->address :
'');
8909 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object) ?
$object->zip :
'');
8910 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object) ?
$object->town :
'');
8911 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object) ?
$object->country_id :
'');
8912 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object) ?
$object->country_code :
'');
8913 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object) ?
$object->idprof1 :
'');
8914 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object) ?
$object->idprof2 :
'');
8915 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object) ?
$object->idprof3 :
'');
8916 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object) ?
$object->idprof4 :
'');
8917 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object) ?
$object->idprof5 :
'');
8918 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object) ?
$object->idprof6 :
'');
8919 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object) ?
$object->tva_intra :
'');
8922 } elseif (is_object(
$object->thirdparty)) {
8923 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->id :
'');
8924 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name :
'');
8925 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->name_alias :
'');
8926 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_client :
'');
8927 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->code_fournisseur :
'');
8928 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
8929 $substitutionarray[
'__THIRDPARTY_EMAIL_URLENCODED__'] = urlencode(is_object(
$object->thirdparty) ?
$object->thirdparty->email :
'');
8932 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->address :
'');
8933 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->zip :
'');
8934 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->town :
'');
8935 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_id :
'');
8936 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->country_code :
'');
8937 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof1 :
'');
8938 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof2 :
'');
8939 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof3 :
'');
8940 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof4 :
'');
8941 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof5 :
'');
8942 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->idprof6 :
'');
8943 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object(
$object->thirdparty) ?
$object->thirdparty->tva_intra :
'');
8948 if (is_object(
$object) &&
$object->element ==
'recruitmentcandidature') {
8949 '@phan-var-force RecruitmentCandidature $object';
8950 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
$object->getFullName($outputlangs);
8951 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
8952 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
8954 if (is_object(
$object) &&
$object->element ==
'conferenceorboothattendee') {
8955 '@phan-var-force ConferenceOrBoothAttendee $object';
8956 $substitutionarray[
'__ATTENDEE_FULLNAME__'] =
$object->getFullName($outputlangs);
8957 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset(
$object->firstname) ?
$object->firstname :
'';
8958 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset(
$object->lastname) ?
$object->lastname :
'';
8962 '@phan-var-force Project $object';
8963 $substitutionarray[
'__PROJECT_ID__'] =
$object->id;
8964 $substitutionarray[
'__PROJECT_REF__'] =
$object->ref;
8965 $substitutionarray[
'__PROJECT_NAME__'] =
$object->title;
8966 } elseif (is_object(
$object)) {
8968 if (!empty(
$object->project)) {
8970 } elseif (!empty(
$object->projet)) {
8973 if (!is_null($project) && is_object($project)) {
8974 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8975 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8976 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8981 $project_id =
$object->fk_project;
8982 } elseif (!empty(
$object->fk_projet) &&
$object->fk_projet > 0) {
8983 $project_id =
$object->fk_project;
8985 if ($project_id > 0) {
8987 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8988 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8989 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8995 '@phan-var-force Facture $object';
8996 $substitutionarray[
'__INVOICE_SITUATION_NUMBER__'] = isset(
$object->situation_counter) ?
$object->situation_counter :
'';
8999 '@phan-var-force Expedition $object';
9000 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
$object->tracking_number;
9001 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
$object->tracking_url;
9002 $substitutionarray[
'__SHIPPINGMETHOD__'] =
$object->shipping_method;
9005 '@phan-var-force Reception $object';
9006 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
$object->tracking_number;
9007 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
$object->tracking_url;
9011 '@phan-var-force Contrat $object';
9012 $dateplannedstart =
'';
9013 $datenextexpiration =
'';
9014 foreach (
$object->lines as $line) {
9015 if ($line->date_start > $dateplannedstart) {
9016 $dateplannedstart = $line->date_start;
9018 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
9019 $datenextexpiration = $line->date_end;
9022 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
9023 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE_RFC__'] =
dol_print_date($dateplannedstart,
'dayrfc');
9024 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
9026 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
9027 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE_RFC__'] =
dol_print_date($datenextexpiration,
'dayrfc');
9028 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
9032 '@phan-var-force Ticket $object';
9033 $substitutionarray[
'__TICKET_TRACKID__'] =
$object->track_id;
9034 $substitutionarray[
'__TICKET_SUBJECT__'] =
$object->subject;
9035 $substitutionarray[
'__TICKET_TYPE__'] =
$object->type_code;
9036 $substitutionarray[
'__TICKET_SEVERITY__'] =
$object->severity_code;
9037 $substitutionarray[
'__TICKET_CATEGORY__'] =
$object->category_code;
9038 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
$object->category_code;
9039 $substitutionarray[
'__TICKET_MESSAGE__'] =
$object->message;
9040 $substitutionarray[
'__TICKET_PROGRESSION__'] =
$object->progress;
9041 $userstat =
new User($db);
9042 if (
$object->fk_user_assign > 0) {
9043 $userstat->fetch(
$object->fk_user_assign);
9044 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9047 if (
$object->fk_user_create > 0) {
9048 $userstat->fetch(
$object->fk_user_create);
9049 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
9055 if (!is_object($extrafields)) {
9058 $extrafields->fetch_name_optionals_label(
$object->table_element,
true);
9060 if (
$object->fetch_optionals() > 0) {
9061 if (is_array($extrafields->attributes[
$object->table_element][
'label']) && count($extrafields->attributes[
$object->table_element][
'label']) > 0) {
9062 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $label) {
9063 if ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'date') {
9064 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day');
9065 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
9066 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date(
$object->array_options[
'options_'.$key],
'dayrfc');
9067 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'datetime') {
9068 $datetime =
$object->array_options[
'options_'.$key];
9069 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
9070 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
9071 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
9072 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
9073 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'phone') {
9074 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone(
$object->array_options[
'options_'.$key]);
9075 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] ==
'price') {
9076 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
$object->array_options[
'options_'.$key];
9077 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price(
$object->array_options[
'options_'.$key]);
9078 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATTED__'] =
price(
$object->array_options[
'options_'.$key]);
9079 } elseif ($extrafields->attributes[
$object->table_element][
'type'][$key] !=
'separator') {
9080 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty(
$object->array_options[
'options_'.$key]) ?
$object->array_options[
'options_'.$key] :
'';
9088 if (empty($substitutionarray[
'__REF__'])) {
9092 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
9093 $outputlangs->loadLangs(array(
'paypal',
'other'));
9096 $typeforonlinepayment =
'free';
9098 $typeforonlinepayment =
'order';
9101 $typeforonlinepayment =
'invoice';
9104 $typeforonlinepayment =
'member';
9105 if (!empty(
$object->last_subscription_amount)) {
9106 $amounttouse =
$object->last_subscription_amount;
9110 $typeforonlinepayment =
'contract';
9113 $typeforonlinepayment =
'ficheinter';
9116 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
9121 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
9122 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
9125 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9127 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
9130 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
$object->getLastMainDocLink(
$object->element);
9132 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
9135 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
$object->getLastMainDocLink(
$object->element);
9137 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
9140 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
$object->getLastMainDocLink(
$object->element);
9142 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
9145 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
$object->getLastMainDocLink(
$object->element);
9147 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
9150 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
$object->getLastMainDocLink(
$object->element);
9152 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
9156 '@phan-var-force Propal $object';
9157 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".
$object->id;
9158 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9159 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal',
$object->ref, 1,
$object);
9162 '@phan-var-force Commande $object';
9163 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".
$object->id;
9166 '@phan-var-force Facture $object';
9167 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".
$object->id;
9170 '@phan-var-force Contrat $object';
9171 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".
$object->id;
9172 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9173 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract',
$object->ref, 1,
$object);
9176 '@phan-var-force Fichinter $object';
9177 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".
$object->id;
9178 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
9179 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter',
$object->ref, 1,
$object);
9181 if (is_object(
$object) &&
$object->element ==
'supplier_proposal') {
9182 '@phan-var-force SupplierProposal $object';
9183 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".
$object->id;
9185 if (is_object(
$object) &&
$object->element ==
'invoice_supplier') {
9186 '@phan-var-force FactureFournisseur $object';
9187 $substitutionarray[
'__URL_SUPPLIER_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/fourn/facture/card.php?id=".
$object->id;
9190 '@phan-var-force Expedition $object';
9191 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".
$object->id;
9196 '@phan-var-force ActionComm $object';
9197 $substitutionarray[
'__EVENT_LABEL__'] =
$object->label;
9198 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".
$object->type_code);
9200 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date(
$object->datep,
'hour',
'auto', $outputlangs);
9204 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
9205 '@phan-var-force Facture|FactureRec $object';
9206 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
9209 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'day', 0, $outputlangs) : null) :
'';
9211 $substitutionarray[
'__DATE_DUE_YMD_TEXT__'] = is_object(
$object) ? (isset(
$object->date_lim_reglement) ?
dol_print_date(
$object->date_lim_reglement,
'daytext', 0, $outputlangs) : null) :
'';
9213 $already_payed_all = 0;
9218 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object(
$object) ?
$object->total_ht :
'';
9220 $substitutionarray[
'__AMOUNT_EXCL_TAX_TEXTCURRENCY__'] = is_object(
$object) ?
dol_convertToWord(
$object->total_ht, $outputlangs, $conf->currency,
true) :
'';
9222 $substitutionarray[
'__AMOUNT__'] = is_object(
$object) ?
$object->total_ttc :
'';
9226 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object(
$object) ?
price2num(
$object->total_ttc - $already_payed_all,
'MT') :
'';
9228 $substitutionarray[
'__AMOUNT_VAT__'] = is_object(
$object) ? (isset(
$object->total_vat) ?
$object->total_vat :
$object->total_tva) :
'';
9232 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9233 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object(
$object) ?
$object->total_localtax1 :
'';
9235 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9236 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object(
$object) ?
$object->total_localtax2 :
'';
9240 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'] = is_object(
$object) ? (
$object->total_ht ?
price(
$object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9241 $substitutionarray[
'__AMOUNT_FORMATTED__'] = is_object(
$object) ? (
$object->total_ttc ?
price(
$object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9242 $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) :
'';
9243 $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)) :
'';
9244 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
9245 $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax1 ?
price(
$object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9247 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
9248 $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'] = is_object(
$object) ? (
$object->total_localtax2 ?
price(
$object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) : null) :
'';
9251 if ($onlykey != 2) {
9252 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATTED__'];
9253 $substitutionarray[
'__AMOUNT_FORMATED__'] = $substitutionarray[
'__AMOUNT_FORMATTED__'];
9254 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = $substitutionarray[
'__AMOUNT_REMAIN_FORMATTED__'];
9255 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = $substitutionarray[
'__AMOUNT_VAT_FORMATTED__'];
9256 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(1)) {
9257 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX2_FORMATTED__'];
9259 if ($mysoc instanceof
Societe && $mysoc->useLocalTax(2)) {
9260 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = $substitutionarray[
'__AMOUNT_TAX3_FORMATTED__'];
9264 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
$object->multicurrency_total_ttc :
'';
9265 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
9266 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object(
$object) && isset(
$object->multicurrency_total_ttc)) ?
dol_convertToWord(
$object->multicurrency_total_ttc, $outputlangs,
$object->multicurrency_code,
true) :
'';
9270 if ($onlykey != 2) {
9271 $substitutionarray[
'__TOTAL_TTC__'] = is_object(
$object) ?
$object->total_ttc :
'';
9272 $substitutionarray[
'__TOTAL_HT__'] = is_object(
$object) ?
$object->total_ht :
'';
9278 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
9279 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
9289 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
9291 $substitutionarray = array_merge($substitutionarray, array(
9292 '__NOW_TMS__' => (
string) $now,
9293 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
9294 '__DAY__' => (
string) $tmp[
'mday'],
9295 '__DAY_TEXT__' => $daytext,
9296 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
9297 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
9298 '__MONTH__' => (
string) $tmp[
'mon'],
9299 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
9300 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
9301 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
9302 '__YEAR__' => (
string) $tmp[
'year'],
9303 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
9304 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
9305 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
9306 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
9307 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
9308 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
9309 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
9310 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
9311 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
9315 if (isModEnabled(
'multicompany')) {
9316 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
9318 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
9319 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
9320 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
9321 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
9322 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
9327 return $substitutionarray;
9346function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
9348 global $conf, $db, $langs;
9350 if (!is_array($substitutionarray)) {
9351 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
9354 if (empty($outputlangs)) {
9355 $outputlangs = $langs;
9365 if (is_object($outputlangs)) {
9367 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
9369 $tmp = explode(
'|', $reg[1]);
9370 if (!empty($tmp[1])) {
9371 $outputlangs->load($tmp[1]);
9374 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
9376 if (empty($converttextinhtmlifnecessary)) {
9378 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9392 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
9400 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
9401 $keyfound = $reg[1];
9403 $value =
'*****forbidden*****';
9405 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
9408 if (empty($converttextinhtmlifnecessary)) {
9410 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
9423 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
9428 foreach ($substitutionarray as $key => $value) {
9429 if (!isset($value)) {
9433 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
9437 if (empty($converttextinhtmlifnecessary)) {
9438 $text = str_replace(
"$key",
"$value", $text);
9450 $text = str_replace(
"$key",
"$value", $text);
9466 $memory_object_list = array();
9467 foreach ($substitutionarray as $key => $value) {
9468 $lazy_load_arr = array();
9469 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
9470 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
9471 $key_to_substitute = $lazy_load_arr[1];
9472 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
9473 $param_arr = explode(
':', $value);
9475 if (count($param_arr) == 4) {
9476 $path = $param_arr[0];
9477 $class = $param_arr[1];
9478 $method = $param_arr[2];
9479 $id = (int) $param_arr[3];
9482 if (!isset($memory_object_list[$class])) {
9484 require_once DOL_DOCUMENT_ROOT . $path;
9485 if (class_exists($class)) {
9486 $memory_object_list[$class] = array(
9494 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
9495 if (method_exists($class, $method)) {
9496 if (!isset($memory_object_list[$class][
'list'][$id])) {
9497 $tmpobj =
new $class($db);
9499 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
9500 $memory_object_list[$class][
'list'][$id] = $tmpobj;
9503 $tmpobj = $memory_object_list[$class][
'list'][$id];
9505 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
9508 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
9534 global $conf, $user;
9536 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
9541 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
9543 foreach ($dirsubstitutions as $reldir) {
9551 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
9552 foreach ($substitfiles as $substitfile) {
9554 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
9557 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
9559 require_once $dir.$substitfile[
'name'];
9561 $function_name = $module.
"_".$callfunc;
9562 if (function_exists($function_name)) {
9563 $function_name($substitutionarray, $outputlangs,
$object, $parameters);
9571 foreach ($substitutionarray as $key => $value) {
9572 $tags .=
'{'.$key.
'} => '.$value.
"\n";
9574 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9587function print_date_range($date_start, $date_end, $format =
'', $outputlangs =
null)
9589 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9602function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
null, $withparenthesis = 1)
9608 if (!is_object($outputlangs)) {
9609 $outputlangs = $langs;
9612 if ($date_start && $date_end) {
9613 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9615 if ($date_start && !$date_end) {
9616 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9618 if (!$date_start && $date_end) {
9619 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9639 if ($nameorder < 0) {
9642 if ($nameorder == 1) {
9644 if ($firstname && $lastname) {
9648 } elseif ($nameorder == 2 || $nameorder == 3) {
9650 if (empty($ret) && $nameorder == 3) {
9655 if (empty($ret) && $nameorder == 5) {
9658 if ($nameorder == 0) {
9659 if ($firstname && $lastname) {
9683 if (!is_array($mesgs)) {
9684 $mesgs = trim((
string) $mesgs);
9687 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9690 $_SESSION[
'dol_events'][$style][] = $mesgs;
9694 foreach ($mesgs as $mesg) {
9695 $mesg = trim((
string) $mesg);
9697 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9700 $_SESSION[
'dol_events'][$style][] = $mesg;
9718function setEventMessages($mesg, $mesgs, $style =
'mesgs', $messagekey =
'', $noduplicate = 0)
9720 if (empty($mesg) && empty($mesgs)) {
9721 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9728 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9729 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9730 dol_print_error(
null,
'Bad parameter style='.$style.
' for setEventMessages');
9732 if (empty($mesgs)) {
9735 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9756 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9757 if (empty($disabledoutputofmessages)) {
9760 unset($_SESSION[
'dol_events'][
'mesgs']);
9763 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9764 if (empty($disabledoutputofmessages)) {
9767 unset($_SESSION[
'dol_events'][
'errors']);
9771 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9772 if (empty($disabledoutputofmessages)) {
9775 unset($_SESSION[
'dol_events'][
'warnings']);
9793function get_htmloutput_mesg($mesgstring =
'', $mesgarray = [], $style =
'ok', $keepembedded = 0)
9795 global $conf, $langs;
9800 $divstart = $divend =
'';
9803 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9804 $divstart =
'<div class="'.$style.
' clearboth">';
9808 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9809 $langs->load(
"errors");
9811 if (is_array($mesgarray) && count($mesgarray)) {
9812 foreach ($mesgarray as $message) {
9814 $out .= $langs->trans($message);
9815 if ($ret < count($mesgarray)) {
9822 $out .= $langs->trans($mesgstring);
9828 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9829 $return =
'<script nonce="'.getNonce().
'">
9830 $(document).ready(function() {
9835 /* jnotify(message, preset of message type, keepmessage) */
9837 "'.($style ==
"ok" ? 3000 : $style).
'",
9838 '.($style ==
"ok" ?
"false" :
"true").
',
9839 { remove: function (){} } );
9880function dol_htmloutput_mesg($mesgstring =
'', $mesgarray = array(), $style =
'ok', $keepembedded = 0)
9882 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9888 if (is_array($mesgarray)) {
9889 foreach ($mesgarray as $val) {
9890 if ($val && preg_match(
'/class="error"/i', $val)) {
9894 if ($val && preg_match(
'/class="warning"/i', $val)) {
9899 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9901 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9904 if ($style ==
'error') {
9907 if ($style ==
'warning') {
9911 if ($iserror || $iswarning) {
9913 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9914 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9915 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9917 if (is_array($mesgarray)) {
9918 $newmesgarray = array();
9919 foreach ($mesgarray as $val) {
9920 if (is_string($val)) {
9921 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9922 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9923 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
9924 $newmesgarray[] = $tmpmesgstring;
9926 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
9929 $mesgarray = $newmesgarray;
9931 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
9966function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
9969 $order = strtolower($order);
9971 if (is_array($array)) {
9972 $sizearray = count($array);
9973 if ($sizearray > 0) {
9975 foreach (array_keys($array) as $key) {
9976 if (is_object($array[$key])) {
9977 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
9980 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9982 if ($natsort == -1) {
9983 $temp[$key] =
'___'.$temp[$key];
9987 if (empty($natsort) || $natsort == -1) {
9988 if ($order ==
'asc') {
9994 if ($case_sensitive) {
9999 if ($order !=
'asc') {
10000 $temp = array_reverse($temp,
true);
10006 foreach (array_keys($temp) as $key) {
10007 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
10026 $str = (string) $str;
10029 $strLength = strlen($str);
10030 for ($i = 0; $i < $strLength; $i++) {
10031 if (ord($str[$i]) < 0x80) {
10033 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
10035 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
10037 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
10039 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
10041 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
10046 for ($j = 0; $j < $n; $j++) {
10047 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
10068 return preg_match(
'//u', $str) ? true :
false;
10080 if (function_exists(
'mb_check_encoding')) {
10082 if (!mb_check_encoding($str,
'ASCII')) {
10086 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
10104 $tmp = ini_get(
"unicode.filesystem_encoding");
10105 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
10106 $tmp =
'iso-8859-1';
10115 if ($tmp ==
'iso-8859-1') {
10116 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
10136function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
10146 if (isset($conf->cache[
'codeid'][$tablename][$key][$fieldid])) {
10147 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10150 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
10152 $sql =
"SELECT ".$fieldid.
" as valuetoget";
10153 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
10154 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
10155 if (!empty($entityfilter)) {
10156 $sql .=
" AND entity IN (".getEntity($tablename).
")";
10162 $resql = $db->query($sql);
10164 $obj = $db->fetch_object($resql);
10166 $conf->cache[
'codeid'][$tablename][$key][$fieldid] = $obj->valuetoget;
10168 $conf->cache[
'codeid'][$tablename][$key][$fieldid] =
'';
10172 return $conf->cache[
'codeid'][$tablename][$key][$fieldid];
10189 if ($matchrule == 1) {
10190 if ($var ==
'mainmenu') {
10192 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
10193 } elseif ($var ==
'leftmenu') {
10195 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
10197 return 'This variable is not accessible with dol_eval';
10200 return 'This value for matchrule is not implemented';
10214function verifCond($strToEvaluate, $onlysimplestring =
'1')
10218 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
10221 $rep =
dol_eval($strToEvaluate, 1, 1, $onlysimplestring);
10222 $rights = (bool) $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
10242function dol_eval($s, $returnvalue = 1, $hideerrors = 1, $onlysimplestring =
'1')
10246 global $db, $langs, $user, $website, $websitepage;
10247 global $action, $mainmenu, $leftmenu;
10249 global $objectoffield;
10255 $isObBufferActive =
false;
10256 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
10257 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
10262 if ($onlysimplestring ==
'1' || $onlysimplestring ==
'2') {
10268 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
10269 if ($onlysimplestring ==
'2') {
10270 $specialcharsallowed .=
'[]';
10273 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
10275 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
10276 if ($returnvalue) {
10277 return 'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s;
10279 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for a simple clean eval string): '.$s, LOG_WARNING);
10285 if (preg_match(
'/\$[\w]*\s*\(/', $s)) {
10286 if ($returnvalue) {
10287 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;
10289 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);
10297 while ($scheck && $savescheck != $scheck) {
10298 $savescheck = $scheck;
10299 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
10300 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
10301 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
10302 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10303 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
10304 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
10307 if (strpos($scheck,
'(') !==
false) {
10308 if ($returnvalue) {
10309 return 'Bad string syntax to evaluate (mode '.$onlysimplestring.
', found call of a function or method without using the direct name of the function): '.$s;
10311 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);
10320 if (is_array($s) || $s ===
'Array') {
10321 if ($returnvalue) {
10322 return 'Bad string syntax to evaluate (value is Array): '.var_export($s,
true);
10324 dol_syslog(
'Bad string syntax to evaluate (value is Array): '.var_export($s,
true), LOG_WARNING);
10328 if (strpos($s,
'::') !==
false) {
10329 if ($returnvalue) {
10330 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
10332 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s, LOG_WARNING);
10336 if (strpos($s,
'`') !==
false) {
10337 if ($returnvalue) {
10338 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
10340 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s, LOG_WARNING);
10344 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
10345 if ($returnvalue) {
10346 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
10348 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s, LOG_WARNING);
10354 $forbiddenphpstrings = array(
'$$',
'$_',
'}[');
10355 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
10357 $forbiddenphpfunctions = array();
10358 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
10359 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
10360 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
10361 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
10362 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
10363 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
10364 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
10365 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
10366 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
10367 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
10369 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
10371 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
10373 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
10376 $oldstringtoclean = $s;
10377 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
10378 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
10379 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
10381 }
while ($oldstringtoclean != $s);
10384 if (strpos($s,
'__forbiddenstring__') !==
false) {
10385 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
10386 if ($returnvalue) {
10387 return 'Bad string syntax to evaluate: '.$s;
10389 dol_syslog(
'Bad string syntax to evaluate: '.$s);
10395 if ($returnvalue) {
10398 $isObBufferActive =
true;
10399 $tmps = @eval(
'return '.$s.
';');
10400 $tmpo = ob_get_clean();
10401 $isObBufferActive =
false;
10403 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10408 $isObBufferActive =
true;
10409 $tmps = eval(
'return '.$s.
';');
10410 $tmpo = ob_get_clean();
10411 $isObBufferActive =
false;
10413 print
'Bad string syntax to evaluate. Some data were output when it should not when evaluating: '.$s;
10418 dol_syslog(
'Do not use anymore dol_eval with param returnvalue=0', LOG_WARNING);
10426 }
catch (Error $e) {
10427 if ($isObBufferActive) {
10429 $tmpo = ob_get_clean();
10430 $isObBufferActive =
false;
10432 $error =
'dol_eval try/catch error : ';
10433 $error .= $e->getMessage();
10435 if ($returnvalue) {
10436 return 'Exception during evaluation: '.$s;
10452 return (trim($element) !=
'');
10465 if (empty($codelang)) {
10469 if ($codelang ==
'auto') {
10470 return '<span class="fa fa-language"></span>';
10473 $langtocountryflag = array(
10475 'ca_ES' =>
'catalonia',
10479 'sw_SW' =>
'unknown',
10489 if (isset($langtocountryflag[$codelang])) {
10490 $flagImage = $langtocountryflag[$codelang];
10492 $tmparray = explode(
'_', $codelang);
10493 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
10498 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
10499 $morecss = $reg[1];
10504 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
10518 if (empty($countrycode)) {
10522 if (strtoupper($countrycode) ==
'MQ') {
10525 if (strtoupper($countrycode) ==
'SE') {
10528 if (strtoupper($countrycode) ==
'CH') {
10529 if ($mysoc->country_code ==
'FR') {
10532 if ($mysoc->country_code ==
'DE') {
10535 if ($mysoc->country_code ==
'IT') {
10717 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10718 if (in_array($buildprimarykeytotest, $locales)) {
10719 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10722 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10723 foreach ($locales as $locale) {
10724 $locale_language = locale_get_primary_language($locale);
10725 $locale_region = locale_get_region($locale);
10726 if (strtoupper($countrycode) == $locale_region) {
10728 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10732 dol_syslog(
"Warning Extension php-intl is not available", LOG_WARNING);
10770 global $hookmanager, $db;
10772 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10773 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10774 $values = explode(
':', $value);
10777 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10782 $posstart = strpos($str,
'(');
10783 if ($posstart > 0) {
10784 $posend = strpos($str,
')');
10785 if ($posstart > 0) {
10786 $res1 = substr($str, $posstart + 1, $posend - $posstart - 1);
10787 if (is_numeric($res1)) {
10788 $postab = (int) $res1;
10789 $values[1] =
'+' . substr($str, $posend + 1);
10793 if (count($values) == 6) {
10797 if ($values[0] != $type) {
10803 if ($filterorigmodule) {
10804 if (strpos($values[3],
'@')) {
10805 if ($filterorigmodule !=
'external') {
10809 if ($filterorigmodule !=
'core') {
10814 $langs->load($values[3]);
10816 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10818 $substitutionarray = array();
10823 $labeltemp = explode(
',', $values[2]);
10824 $label = $langs->trans($labeltemp[0]);
10826 if (!empty($labeltemp[1]) && is_object(
$object) && !empty(
$object->id)) {
10828 $classtoload = $labeltemp[1];
10829 if (class_exists($classtoload)) {
10830 $obj =
new $classtoload($db);
10831 $function = $labeltemp[3];
10832 if ($obj && $function && method_exists($obj, $function)) {
10834 $nbrec = $obj->$function(
$object->id, $obj);
10835 if (!empty($nbrec)) {
10836 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10844 $newtab[1] = $label;
10845 $newtab[2] = str_replace(
'+',
'', $values[1]);
10850 } elseif (count($values) == 5) {
10851 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10853 if ($values[0] != $type) {
10857 if ($filterorigmodule) {
10858 if (strpos($values[3],
'@')) {
10859 if ($filterorigmodule !=
'external') {
10863 if ($filterorigmodule !=
'core') {
10868 $langs->load($values[3]);
10870 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10871 $substitutionarray = array();
10875 $label = $langs->trans($values[2]);
10879 $newtab[1] = $label;
10880 $newtab[2] = str_replace(
'+',
'', $values[1]);
10884 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10885 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10886 if ($values[0] != $type) {
10889 $tabname = str_replace(
'-',
'', $values[1]);
10890 foreach ($head as $key => $val) {
10891 $condition = (!empty($values[3]) ?
verifCond($values[3],
'2') : 1);
10893 if ($head[$key][2] == $tabname && $condition) {
10894 unset($head[$key]);
10903 if (!empty($hookmanager)) {
10904 $parameters = array(
'object' =>
$object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
10905 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters,
$object);
10906 if ($reshook > 0) {
10907 $head = $hookmanager->resArray;
10909 $head = array_merge($head, $hookmanager->resArray);
10928 global $conf, $hookmanager, $user, $debugbar;
10930 global $micro_start_time;
10932 if ($zone ==
'private') {
10933 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
10935 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
10939 print
"\n<!-- A div to store page_y POST parameter -->\n";
10940 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
10942 $parameters = array();
10943 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
10944 if (empty($reshook)) {
10950 if (!empty($conf->use_javascript_ajax)) {
10951 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and mandatory fields, tuning info, ... -->\n";
10952 print
'<script>'.
"\n";
10953 print
'jQuery(document).ready(function() {'.
"\n";
10955 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
10957 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
10958 print
'jQuery("li.menuhider").click(function(event) {';
10959 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
10960 print
' console.log("We click on .menuhider");'.
"\n";
10961 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
10966 if ($action ==
'create' || $action ==
'edit' || (empty($action) && (preg_match(
'/new\.php/', $_SERVER[
"PHP_SELF"]))) || ((empty($action) || $action ==
'addline') && (preg_match(
'/card\.php/', $_SERVER[
"PHP_SELF"])))) {
10967 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
10968 $relativepathstring = $_SERVER[
"PHP_SELF"];
10970 if (constant(
'DOL_URL_ROOT')) {
10971 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
10973 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
10974 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
10976 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
10977 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
10979 if ($defkey !=
'_noquery_') {
10980 $tmpqueryarraytohave = explode(
'&', $defkey);
10982 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10983 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
10985 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
10989 if (!$foundintru) {
10998 foreach ($defval as $paramkey => $paramval) {
11000 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
11001 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
11002 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really useful, but we keep it in case of.
11007 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
11008 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
11010 if ($defkey != '_noquery_') {
11011 $tmpqueryarraytohave = explode('&', $defkey);
11013 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
11014 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
11015 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
11016 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
11020 if (!$foundintru) {
11023 //var_dump($defkey.'-'.$qualified);
11029 foreach ($defval as $paramkey => $paramval) {
11030 // Add property 'required' on input
11031 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11032 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11033 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
";
11034 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
11035 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
11036 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
11039 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
11041 // If we submit the cancel button we remove the required attributes
11042 print 'jQuery("input[
name=\
'cancel\']").click(function() {
11043 console.log("We click on cancel button so removed all required attribute");
11044 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
11054 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
11056 print
"/* JS CODE TO ENABLE to add memory info */\n";
11057 print
'window.console && console.log("';
11062 if (!empty($micro_start_time)) {
11063 $micro_end_time = microtime(
true);
11064 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
11067 if (function_exists(
"memory_get_usage")) {
11068 print
' - Mem: '.memory_get_usage();
11070 if (function_exists(
"memory_get_peak_usage")) {
11071 print
' - Real mem peak: '.memory_get_peak_usage(
true);
11073 if (function_exists(
"zend_loader_file_encoded")) {
11074 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
11079 print
"\n".
'</script>'.
"\n";
11085 foreach ($tmptagarray as $tmptag) {
11087 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
11089 <!-- Global site tag (gtag.js) - Google Analytics -->
11090 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
11092 window.dataLayer = window.dataLayer || [];
11093 function gtag(){dataLayer.push(arguments);}
11094 gtag(\'js\', new Date());
11096 gtag(\'config\', \''.trim($tmptag).
'\');
11103 // Add Xdebug coverage of code
11104 if (defined('XDEBUGCOVERAGE
')) {
11105 print_r(xdebug_get_code_coverage());
11108 // Add DebugBar data
11109 if ($user->hasRight('debugbar
', 'read
') && $debugbar instanceof DebugBar\DebugBar) {
11110 if (isset($debugbar['time
'])) {
11111 // @phan-suppress-next-line PhanPluginUnknownObjectMethodCall
11112 $debugbar['time
']->stopMeasure('pageaftermaster
');
11114 print '<!-- Output debugbar data -->
'."\n";
11115 $renderer = $debugbar->getJavascriptRenderer();
11116 print $renderer->render();
11117 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
11119 print "<!-- Start of log output\n";
11120 //print '<div
class=
"hidden">
'."\n";
11121 foreach ($conf->logbuffer as $logline) {
11122 print $logline."<br>\n";
11124 //print '</div>
'."\n";
11125 print "End of log output -->\n";
11139function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
11141 if (is_null($string)) {
11145 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
11146 // This is a regex string
11147 $newdelimiter = $delimiter;
11149 // This is a simple string
11150 // @phan-suppress-next-line PhanPluginSuspiciousParamPositionInternal
11151 $newdelimiter = preg_quote($delimiter, '/
');
11154 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
11156 foreach ($a as $s) { // each part
11158 if ($pos = strpos($s, $kv)) { // key/value delimiter
11159 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
11160 } else { // key delimiter not found
11178function dol_set_focus($selector)
11180 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
11181 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
11192function dol_getmypid()
11194 if (!function_exists('getmypid
')) {
11195 return mt_rand(99900000, 99965535);
11197 return getmypid(); // May be a number on 64 bits (depending on OS)
11223function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
11225 global $db, $langs;
11227 $value = trim($value);
11230 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
11233 $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
11236 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
11238 $crits = explode(' ', $value);
11240 if (!is_array($fields)) {
11241 $fields = array($fields);
11244 $i1 = 0; // count the nb of and criteria added (all fields / criteria)
11245 foreach ($crits as $crit) { // Loop on each AND criteria
11246 $crit = trim($crit);
11247 $i2 = 0; // count the nb of valid criteria added for this this first criteria
11249 foreach ($fields as $field) {
11251 $tmpcrits = explode('|
', $crit);
11252 $i3 = 0; // count the nb of valid criteria added for this current field
11253 foreach ($tmpcrits as $tmpcrit) {
11254 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11257 $tmpcrit = trim($tmpcrit);
11259 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11262 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
11265 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
11266 if (!empty($reg[1])) {
11267 $operator = $reg[1];
11269 if ($newcrit != '') {
11270 $numnewcrit = price2num($newcrit);
11271 if (is_numeric($numnewcrit)) {
11272 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
11274 $newres .= '1 = 2
'; // force false, we received a corrupted data
11276 $i3++; // a criteria was added to string
11279 $i2++; // a criteria for 1 more field was added to string
11280 } elseif ($mode == 2 || $mode == -2) {
11281 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
11282 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
11283 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
11285 $newres .= ' OR
'.$field.' IS NULL
';
11287 $i2++; // a criteria for 1 more field was added to string
11288 } elseif ($mode == 3 || $mode == -3) {
11289 $tmparray = explode(',
', $crit);
11290 if (count($tmparray)) {
11292 foreach ($tmparray as $val) {
11295 $listofcodes .= ($listofcodes ? ',
' : '');
11296 $listofcodes .= "'".$db->escape($val)."'";
11299 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
11300 $i2++; // a criteria for 1 more field was added to string
11303 $newres .= ' OR
'.$field.' IS NULL
';
11305 } elseif ($mode == 4) {
11306 $tmparray = explode(',
', $crit);
11307 if (count($tmparray)) {
11309 foreach ($tmparray as $val) {
11312 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
11313 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
11314 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
11315 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
11317 $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)
11321 } else { // $mode=0
11322 $tmpcrits = explode('|
', $crit);
11323 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
11324 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
11325 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
11328 $tmpcrit = trim($tmpcrit);
11330 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
11331 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
11333 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
11336 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
11337 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
11339 $tmpcrit2 = $tmpcrit;
11344 if (preg_match('/^!/
', $tmpcrit)) {
11345 $tmps .= $field." NOT LIKE "; // ! as exclude character
11346 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
11348 $tmps .= $field." LIKE ";
11352 if (preg_match('/^[\^\$]/', $tmpcrit)) {
11354 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
11356 if (preg_match('/[\^\$]$/', $tmpcrit)) {
11358 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
11361 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
11365 $newres .= $tmpbefore;
11366 $newres .= $db->escape($tmpcrit2);
11367 $newres .= $tmpafter;
11369 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
11370 $newres .= " OR ".$field." IS NULL)";
11377 $i2++; // a criteria for 1 more field was added to string
11382 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
11386 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
11397function showDirectDownloadLink($object)
11399 global $conf, $langs;
11402 $url = $object->getLastMainDocLink($object->element);
11404 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
11406 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
11407 $out .= ajax_autoselect("directdownloadlink", 0);
11409 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
11423function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
11425 $dirName = dirname($file);
11426 if ($dirName == '.
') {
11430 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
11431 $fileName = basename($fileName);
11433 if (empty($extImgTarget)) {
11434 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
11436 if (empty($extImgTarget)) {
11437 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
11439 if (empty($extImgTarget)) {
11440 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
11442 if (empty($extImgTarget)) {
11443 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
11445 if (empty($extImgTarget)) {
11446 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
11448 if (empty($extImgTarget)) {
11449 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
11452 if (!$extImgTarget) {
11458 $subdir = 'thumbs/
';
11461 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
11474function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
11476 global $conf, $langs;
11478 if (empty($conf->use_javascript_ajax)) {
11482 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
11484 if ($alldata == 1) {
11485 if ($isAllowedForPreview) {
11486 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));
11492 // old behavior, return a string
11493 if ($isAllowedForPreview) {
11494 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
11495 $title = $langs->transnoentities("Preview");
11496 //$title = '%27-alert(document.domain)-%27
';
11497 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
11499 // We need to urlencode the parameter after the dol_escape_js($tmpurl) because $tmpurl may contain n url with param file=abc%27def if file has a ' inside.
11516function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
11519 $out = '<script nonce=
"'.getNonce().'">
11520 jQuery(document).ready(
function () {
11521 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
11525 if ($textonlink === 'image
') {
11526 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
11528 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
11541function dolIsAllowedForPreview($file)
11543 // Check .noexe extension in filename
11544 if (preg_match('/\.noexe$/i
', $file)) {
11548 // Check mime types
11549 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
11550 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
11551 $mime_preview[] = 'svg+xml
';
11553 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
11554 //$mime_preview[]='archive
';
11555 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
11556 if ($num_mime !== false) {
11560 // By default, not allowed for preview
11574function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
11577 $imgmime = 'other.png
';
11578 $famime = 'file-o
';
11581 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
11583 // Plain text files
11584 if (preg_match('/\.txt$/i
', $tmpfile)) {
11585 $mime = 'text/plain
';
11586 $imgmime = 'text.png
';
11587 $famime = 'file-alt
';
11588 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
11589 $mime = 'text/richtext
';
11590 $imgmime = 'text.png
';
11591 $famime = 'file-alt
';
11592 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
11593 $mime = 'text/csv
';
11594 $imgmime = 'text.png
';
11595 $famime = 'file-csv
';
11596 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
11597 $mime = 'text/tab-separated-values
';
11598 $imgmime = 'text.png
';
11599 $famime = 'file-alt
';
11600 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
11601 $mime = 'text/plain
';
11602 $imgmime = 'text.png
';
11603 $famime = 'file-alt
';
11604 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
11605 $mime = 'text/plain
';
11606 $imgmime = 'text.png
';
11608 $famime = 'file-alt
';
11609 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
11610 $mime = 'text/plain
';
11611 $imgmime = 'text.png
';
11613 $famime = 'file-alt
';
11614 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
11615 $mime = 'text/css
';
11616 $imgmime = 'css.png
';
11618 $famime = 'file-alt
';
11619 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
11620 $mime = 'text/plain
';
11621 $imgmime = 'text.png
';
11623 $famime = 'file-alt
';
11624 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11625 $mime = 'text/plain
';
11626 $imgmime = 'text.png
';
11627 $famime = 'file-alt
';
11628 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11629 $mime = 'text/html
';
11630 $imgmime = 'html.png
';
11632 $famime = 'file-alt
';
11633 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11634 $mime = 'text/xml
';
11635 $imgmime = 'other.png
';
11637 $famime = 'file-alt
';
11638 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11639 $mime = 'text/xml
';
11640 $imgmime = 'other.png
';
11642 $famime = 'file-alt
';
11643 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11644 $mime = 'text/plain
';
11645 $imgmime = 'text.png
';
11647 $famime = 'file-code
';
11648 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11649 $mime = 'text/plain
';
11650 $imgmime = 'text.png
';
11652 $famime = 'file-code
';
11653 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11654 $mime = 'text/plain
';
11655 $imgmime = 'text.png
';
11657 $famime = 'file-code
';
11658 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11659 $mime = 'text/plain
';
11660 $imgmime = 'text.png
';
11662 $famime = 'file-code
';
11663 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11664 $mime = 'text/plain
';
11665 $imgmime = 'text.png
';
11667 $famime = 'file-code
';
11668 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11669 $mime = 'text/plain
';
11670 $imgmime = 'text.png
';
11672 $famime = 'file-code
';
11673 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11674 $mime = 'text/plain
';
11675 $imgmime = 'php.png
';
11677 $famime = 'file-code
';
11678 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11679 $mime = 'text/plain
';
11680 $imgmime = 'php.png
';
11682 $famime = 'file-code
';
11683 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11684 $mime = 'text/plain
';
11685 $imgmime = 'pl.png
';
11687 $famime = 'file-code
';
11688 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11689 $mime = 'text/plain
';
11690 $imgmime = 'text.png
';
11692 $famime = 'file-code
';
11693 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11694 $mime = 'text/x-javascript
';
11695 $imgmime = 'jscript.png
';
11697 $famime = 'file-code
';
11698 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11699 $mime = 'application/vnd.oasis.opendocument.presentation
';
11700 $imgmime = 'ooffice.png
';
11701 $famime = 'file-powerpoint
';
11702 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11703 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11704 $imgmime = 'ooffice.png
';
11705 $famime = 'file-excel
';
11706 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11707 $mime = 'application/vnd.oasis.opendocument.text
';
11708 $imgmime = 'ooffice.png
';
11709 $famime = 'file-word
';
11710 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11711 $mime = 'application/msaccess
';
11712 $imgmime = 'mdb.png
';
11714 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11715 $mime = 'application/msword
';
11716 $imgmime = 'doc.png
';
11717 $famime = 'file-word
';
11718 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11719 $mime = 'application/msword
';
11720 $imgmime = 'doc.png
';
11721 $famime = 'file-word
';
11722 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11723 $mime = 'application/vnd.ms-excel
';
11724 $imgmime = 'xls.png
';
11725 $famime = 'file-excel
';
11726 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11727 $mime = 'application/vnd.ms-excel
';
11728 $imgmime = 'xls.png
';
11729 $famime = 'file-excel
';
11730 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11731 $mime = 'application/vnd.ms-excel
';
11732 $imgmime = 'xls.png
';
11733 $famime = 'file-excel
';
11734 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11735 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11736 $imgmime = 'xls.png
';
11737 $famime = 'file-excel
';
11738 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11739 $mime = 'application/vnd.ms-powerpoint
';
11740 $imgmime = 'ppt.png
';
11741 $famime = 'file-powerpoint
';
11742 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11743 $mime = 'application/x-mspowerpoint
';
11744 $imgmime = 'ppt.png
';
11745 $famime = 'file-powerpoint
';
11746 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11747 $mime = 'application/pdf
';
11748 $imgmime = 'pdf.png
';
11749 $famime = 'file-pdf
';
11750 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11751 $mime = 'text/x-bat
';
11752 $imgmime = 'script.png
';
11754 $famime = 'file-code
';
11755 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11756 $mime = 'text/x-sh
';
11757 $imgmime = 'script.png
';
11759 $famime = 'file-code
';
11760 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11761 $mime = 'text/x-ksh
';
11762 $imgmime = 'script.png
';
11764 $famime = 'file-code
';
11765 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11766 $mime = 'text/x-bash
';
11767 $imgmime = 'script.png
';
11769 $famime = 'file-code
';
11770 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11771 $mime = 'image/x-
icon';
11772 $imgmime = 'image.png
';
11773 $famime = 'file-image
';
11774 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11775 $mime = 'image/jpeg
';
11776 $imgmime = 'image.png
';
11777 $famime = 'file-image
';
11778 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11779 $mime = 'image/png
';
11780 $imgmime = 'image.png
';
11781 $famime = 'file-image
';
11782 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11783 $mime = 'image/gif
';
11784 $imgmime = 'image.png
';
11785 $famime = 'file-image
';
11786 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11787 $mime = 'image/bmp
';
11788 $imgmime = 'image.png
';
11789 $famime = 'file-image
';
11790 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11791 $mime = 'image/tiff
';
11792 $imgmime = 'image.png
';
11793 $famime = 'file-image
';
11794 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11795 $mime = 'image/svg+xml
';
11796 $imgmime = 'image.png
';
11797 $famime = 'file-image
';
11798 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11799 $mime = 'image/webp
';
11800 $imgmime = 'image.png
';
11801 $famime = 'file-image
';
11802 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11803 $mime = 'text/calendar
';
11804 $imgmime = 'other.png
';
11805 $famime = 'file-alt
';
11806 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11807 $mime = 'text/calendar
';
11808 $imgmime = 'other.png
';
11809 $famime = 'file-alt
';
11810 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11811 $mime = 'application/x-bittorrent
';
11812 $imgmime = 'other.png
';
11813 $famime = 'file-o
';
11814 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11816 $imgmime = 'audio.png
';
11817 $famime = 'file-audio
';
11818 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11819 $mime = 'video/mp4
';
11820 $imgmime = 'video.png
';
11821 $famime = 'file-video
';
11822 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11823 $mime = 'video/ogg
';
11824 $imgmime = 'video.png
';
11825 $famime = 'file-video
';
11826 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11827 $mime = 'video/webm
';
11828 $imgmime = 'video.png
';
11829 $famime = 'file-video
';
11830 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11831 $mime = 'video/x-msvideo
';
11832 $imgmime = 'video.png
';
11833 $famime = 'file-video
';
11834 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11835 $mime = 'video/divx
';
11836 $imgmime = 'video.png
';
11837 $famime = 'file-video
';
11838 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
11839 $mime = 'video/xvid
';
11840 $imgmime = 'video.png
';
11841 $famime = 'file-video
';
11842 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
11844 $imgmime = 'video.png
';
11845 $famime = 'file-video
';
11846 } elseif (preg_match('/\.(zip|rar|gz|tgz|xz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
11847 // application/xxx where zzz is zip, ...
11849 $imgmime = 'archive.png
';
11850 $famime = 'file-archive
';
11851 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
11852 $mime = 'application/octet-stream
';
11853 $imgmime = 'other.png
';
11854 $famime = 'file-o
';
11855 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
11857 $imgmime = 'library.png
';
11858 $famime = 'file-o
';
11859 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
11861 $imgmime = 'error.png
';
11862 $famime = 'file-alt
';
11865 // Return mimetype string
11866 switch ((int) $mode) {
11868 $tmp = explode('/
', $mime);
11869 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
11891function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
11895 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
11897 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
11899 if (is_null($dictvalues)) {
11900 $dictvalues = array();
11902 $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
11903 if ($checkentity) {
11904 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
11907 $resql = $db->query($sql);
11909 while ($obj = $db->fetch_object($resql)) {
11910 $dictvalues[$obj->$rowidfield] = $obj;
11916 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
11919 if (!empty($dictvalues[$id])) {
11921 $tmp = $dictvalues[$id];
11922 return (property_exists($tmp, $field) ? $tmp->$field :
'');
11937 $stringcolor = str_replace(
'#',
'', $stringcolor);
11939 if (!empty($stringcolor)) {
11941 $tmp = explode(
',', $stringcolor);
11942 if (count($tmp) > 1) {
11947 $hexr = $stringcolor[0].$stringcolor[1];
11948 $hexg = $stringcolor[2].$stringcolor[3];
11949 $hexb = $stringcolor[4].$stringcolor[5];
11950 $r = hexdec($hexr);
11951 $g = hexdec($hexg);
11952 $b = hexdec($hexb);
11954 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
11955 if ($bright > 0.6) {
11976 if (empty($menuentry[
'enabled'])) {
11979 if ($type_user && $menuentry[
'module']) {
11980 $tmploops = explode(
'|', $menuentry[
'module']);
11982 foreach ($tmploops as $tmploop) {
11983 if (in_array($tmploop, $listofmodulesforexternal)) {
11992 if (!$menuentry[
'perms'] && $type_user) {
11998 if (!$menuentry[
'perms']) {
12013 $result = (ceil($n) % $x === 0) ? ceil($n) : (round(($n + $x / 2) / $x) * $x);
12014 return (
int) $result;
12028function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
12030 $csstouse =
'badge';
12031 $csstouse .= (!empty($mode) ?
' badge-'.$mode :
'');
12032 $csstouse .= (!empty($type) ?
' badge-'.$type :
'');
12033 $csstouse .= (empty($params[
'css']) ?
'' :
' '.$params[
'css']);
12036 'class' => $csstouse
12039 if (empty($html)) {
12043 if (!empty($url)) {
12044 $attr[
'href'] = $url;
12047 if ($mode ===
'dot') {
12048 $attr[
'class'] .=
' classfortooltip';
12049 $attr[
'title'] = $html;
12050 $attr[
'aria-label'] = $label;
12055 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12056 foreach ($params[
'attr'] as $key => $value) {
12057 if ($key ==
'class') {
12058 $attr[
'class'] .=
' '.$value;
12059 } elseif ($key ==
'classOverride') {
12060 $attr[
'class'] = $value;
12062 $attr[$key] = $value;
12070 $attr = array_map(
'dol_escape_htmltag', $attr);
12072 $TCompiledAttr = array();
12073 foreach ($attr as $key => $value) {
12074 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12077 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
12079 $tag = !empty($url) ?
'a' :
'span';
12081 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
12097function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
12102 $dolGetBadgeParams = array();
12104 if (!empty($params[
'badgeParams'])) {
12105 $dolGetBadgeParams = $params[
'badgeParams'];
12109 if ($displayMode == 0) {
12110 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
12111 } elseif ($displayMode == 1) {
12112 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12116 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
12117 $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>' :
'');
12120 if (!empty($conf->dol_optimize_smallscreen)) {
12121 if ($displayMode == 0) {
12123 } elseif ($displayMode == 4) {
12125 } elseif ($displayMode == 6) {
12131 $statusImg = array(
12132 'status0' =>
'statut0',
12133 'status1' =>
'statut1',
12134 'status2' =>
'statut2',
12135 'status3' =>
'statut3',
12136 'status4' =>
'statut4',
12137 'status5' =>
'statut5',
12138 'status6' =>
'statut6',
12139 'status7' =>
'statut7',
12140 'status8' =>
'statut8',
12141 'status9' =>
'statut9'
12144 if (!empty($statusImg[$statusType])) {
12145 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
12147 $htmlImg =
img_picto($statusLabel, $statusType);
12150 if ($displayMode === 2) {
12151 $return = $htmlImg.
' '.$htmlLabelShort;
12152 } elseif ($displayMode === 3) {
12153 $return = $htmlImg;
12154 } elseif ($displayMode === 4) {
12155 $return = $htmlImg.
' '.$htmlLabel;
12156 } elseif ($displayMode === 5) {
12157 $return = $htmlLabelShort.
' '.$htmlImg;
12159 $return = $htmlLabel.
' '.$htmlImg;
12163 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
12165 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
12166 if (empty($dolGetBadgeParams[
'attr'][
'title'])) {
12167 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
12169 $dolGetBadgeParams[
'attr'][
'class'] .=
' classfortooltip';
12171 $dolGetBadgeParams[
'attr'][
'title'] =
dol_htmlentitiesbr($dolGetBadgeParams[
'attr'][
'title'], 1);
12174 if ($displayMode == 3) {
12175 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
12176 } elseif ($displayMode === 5) {
12177 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
12179 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
12223function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
12225 global $hookmanager, $action,
$object, $langs;
12228 if (is_array($url)) {
12230 foreach ($url as $key => $subbutton) {
12231 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
12238 if (isset($params[
"areDropdownButtons"]) && $params[
"areDropdownButtons"] ===
false) {
12239 foreach ($url as $button) {
12240 if (!empty($button[
'lang'])) {
12241 $langs->load($button[
'lang']);
12243 $label = $langs->trans($button[
'label']);
12244 $text = $button[
'text'] ??
'';
12245 $actionType = $button[
'actionType'] ??
'';
12246 $tmpUrl = DOL_URL_ROOT.$button[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12247 $id = $button[
'$id'] ??
'';
12248 $userRight = $button[
'perm'] ?? 1;
12249 $params = $button[
'$params'] ?? [];
12251 $out .=
dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $params);
12256 if (count($url) > 1) {
12257 $out .=
'<div class="dropdown inline-block dropdown-holder">';
12258 $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>';
12259 $out .=
'<div class="dropdown-content">';
12260 foreach ($url as $subbutton) {
12261 if (!empty($subbutton[
'lang'])) {
12262 $langs->load($subbutton[
'lang']);
12264 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12265 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], array(
'isDropDown' =>
true));
12270 foreach ($url as $subbutton) {
12271 if (!empty($subbutton[
'lang'])) {
12272 $langs->load($subbutton[
'lang']);
12274 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
12275 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm']);
12284 if (!empty($params[
'isDropdown'])) {
12285 $class =
"dropdown-item";
12287 $class =
'butAction';
12288 if ($actionType ==
'danger' || $actionType ==
'delete') {
12289 $class =
'butActionDelete';
12290 if (!empty($url) && strpos($url,
'token=') ===
false) {
12291 $url .=
'&token='.newToken();
12297 'href' => empty($url) ?
'' : $url,
12301 if (empty($text)) {
12303 $attr[
'title'] =
'';
12305 $attr[
'title'] = $label;
12306 $attr[
'aria-label'] = $label;
12309 if (empty($userRight)) {
12310 $attr[
'class'] =
'butActionRefused';
12311 $attr[
'href'] =
'';
12312 $attr[
'title'] = (($label && $text && $label != $text) ? $label :
'');
12313 $attr[
'title'] = ($attr[
'title'] ? $attr[
'title'].
'<br>' :
'').$langs->trans(
'NotEnoughPermissions');
12321 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12322 foreach ($params[
'attr'] as $key => $value) {
12323 if ($key ==
'class') {
12324 $attr[
'class'] .=
' '.$value;
12325 } elseif ($key ==
'classOverride') {
12326 $attr[
'class'] = $value;
12328 $attr[$key] = $value;
12334 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12335 $attr[
'class'] .=
' classfortooltip';
12339 if ($userRight && !empty($params[
'confirm'])) {
12340 if (!is_array($params[
'confirm'])) {
12341 $params[
'confirm'] = array();
12344 if (empty($params[
'confirm'][
'url'])) {
12345 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
12349 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
12350 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
12351 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
12352 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
12353 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
12354 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
12355 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
12357 $attr[
'class'] .=
' butActionConfirm';
12360 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12361 unset($attr[
'href']);
12365 $attr = array_map(
'dol_escape_htmltag', $attr);
12367 $TCompiledAttr = array();
12368 foreach ($attr as $key => $value) {
12369 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
12372 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
12374 $tag = !empty($attr[
'href']) ?
'a' :
'span';
12377 $parameters = array(
12378 'TCompiledAttr' => $TCompiledAttr,
12379 'compiledAttributes' => $compiledAttributes,
12384 'actionType' => $actionType,
12387 'userRight' => $userRight,
12388 'params' => $params
12391 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters,
$object, $action);
12392 if ($reshook < 0) {
12396 if (empty($reshook)) {
12398 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
12400 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
12403 return $hookmanager->resPrint;
12415 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
12427 if (!empty($fieldValidationErrorMsg)) {
12428 $out .=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
12429 $out .=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
12448function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
12450 global $langs, $conf, $user;
12453 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
12457 $class =
'btnTitle';
12458 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
12459 $class .=
' btnTitlePlus';
12461 $useclassfortooltip = 1;
12463 if (!empty($params[
'morecss'])) {
12464 $class .=
' '.$params[
'morecss'];
12469 'href' => empty($url) ?
'' : $url
12472 if (!empty($helpText)) {
12474 } elseif (empty($attr[
'title']) && $label) {
12475 $attr[
'title'] = $label;
12476 $useclassfortooltip = 0;
12479 if ($status == 2) {
12480 $attr[
'class'] .=
' btnTitleSelected';
12481 } elseif ($status <= 0) {
12482 $attr[
'class'] .=
' refused';
12484 $attr[
'href'] =
'';
12486 if ($status == -1) {
12487 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
12488 } elseif ($status == 0) {
12489 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
12493 if (!empty($attr[
'title']) && $useclassfortooltip) {
12494 $attr[
'class'] .=
' classfortooltip';
12502 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12503 foreach ($params[
'attr'] as $key => $value) {
12504 if ($key ==
'class') {
12505 $attr[
'class'] .=
' '.$value;
12506 } elseif ($key ==
'classOverride') {
12507 $attr[
'class'] = $value;
12509 $attr[$key] = $value;
12514 if (isset($attr[
'href']) && empty($attr[
'href'])) {
12515 unset($attr[
'href']);
12521 $attr = array_map(
'dol_escape_htmltag', $attr);
12523 $TCompiledAttr = array();
12524 foreach ($attr as $key => $value) {
12525 $TCompiledAttr[] = $key.
'="'.$value.
'"';
12528 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
12530 $tag = (empty($attr[
'href']) ?
'span' :
'a');
12532 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
12533 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
12534 if (!empty($params[
'forcenohideoftext'])) {
12535 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
12537 $button .=
'</'.$tag.
'>';
12553 global $conf, $db, $hookmanager;
12559 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
12562 $module = $elementType;
12563 $element = $elementType;
12564 $subelement = $elementType;
12565 $table_element = $elementType;
12568 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $elementType, $regs)) {
12569 $element = $subelement = $regs[1];
12570 $module = $regs[2];
12575 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
12576 $module = $element = $regs[1];
12577 $subelement = $regs[2];
12581 if (substr($elementType, -3) ==
'det') {
12582 $module = preg_replace(
'/det$/',
'', $element);
12583 $subelement = preg_replace(
'/det$/',
'', $subelement);
12584 $classpath = $module.
'/class';
12585 $classfile = $module;
12586 $classname = preg_replace(
'/det$/',
'Line', $element);
12587 if (in_array($module, array(
'expedition',
'propale',
'facture',
'contrat',
'fichinter',
'commandefournisseur'))) {
12588 $classname = preg_replace(
'/det$/',
'Ligne', $element);
12592 if ($elementType ==
"action" || $elementType ==
"actioncomm") {
12593 $classpath =
'comm/action/class';
12594 $subelement =
'Actioncomm';
12595 $module =
'agenda';
12596 $table_element =
'actioncomm';
12597 } elseif ($elementType ==
'cronjob') {
12598 $classpath =
'cron/class';
12600 $table_element =
'cron';
12601 } elseif ($elementType ==
'adherent_type') {
12602 $classpath =
'adherents/class';
12603 $classfile =
'adherent_type';
12604 $module =
'adherent';
12605 $subelement =
'adherent_type';
12606 $classname =
'AdherentType';
12607 $table_element =
'adherent_type';
12608 } elseif ($elementType ==
'bank_account') {
12609 $classpath =
'compta/bank/class';
12611 $classfile =
'account';
12612 $classname =
'Account';
12613 } elseif ($elementType ==
'category') {
12614 $classpath =
'categories/class';
12615 $module =
'categorie';
12616 $subelement =
'categorie';
12617 $table_element =
'categorie';
12618 } elseif ($elementType ==
'contact') {
12619 $classpath =
'contact/class';
12620 $classfile =
'contact';
12621 $module =
'societe';
12622 $subelement =
'contact';
12623 $table_element =
'socpeople';
12624 } elseif ($elementType ==
'inventory') {
12625 $module =
'product';
12626 $classpath =
'product/inventory/class';
12627 } elseif ($elementType ==
'stock' || $elementType ==
'entrepot') {
12629 $classpath =
'product/stock/class';
12630 $classfile =
'entrepot';
12631 $classname =
'Entrepot';
12632 $table_element =
'entrepot';
12633 } elseif ($elementType ==
'project') {
12634 $classpath =
'projet/class';
12635 $module =
'projet';
12636 $table_element =
'projet';
12637 } elseif ($elementType ==
'project_task') {
12638 $classpath =
'projet/class';
12639 $module =
'projet';
12640 $subelement =
'task';
12641 $table_element =
'projet_task';
12642 } elseif ($elementType ==
'facture' || $elementType ==
'invoice') {
12643 $classpath =
'compta/facture/class';
12644 $module =
'facture';
12645 $subelement =
'facture';
12646 $table_element =
'facture';
12647 } elseif ($elementType ==
'facturerec') {
12648 $classpath =
'compta/facture/class';
12649 $module =
'facture';
12650 $classname =
'FactureRec';
12651 } elseif ($elementType ==
'commande' || $elementType ==
'order') {
12652 $classpath =
'commande/class';
12653 $module =
'commande';
12654 $subelement =
'commande';
12655 $table_element =
'commande';
12656 } elseif ($elementType ==
'propal') {
12657 $classpath =
'comm/propal/class';
12658 $table_element =
'propal';
12659 } elseif ($elementType ==
'shipping') {
12660 $classpath =
'expedition/class';
12661 $classfile =
'expedition';
12662 $classname =
'Expedition';
12663 $module =
'expedition';
12664 $table_element =
'expedition';
12665 } elseif ($elementType ==
'delivery_note') {
12666 $classpath =
'delivery/class';
12667 $subelement =
'delivery';
12668 $module =
'expedition';
12669 } elseif ($elementType ==
'delivery') {
12670 $classpath =
'delivery/class';
12671 $subelement =
'delivery';
12672 $module =
'expedition';
12673 } elseif ($elementType ==
'supplier_proposal') {
12674 $classpath =
'supplier_proposal/class';
12675 $module =
'supplier_proposal';
12676 $element =
'supplierproposal';
12677 $classfile =
'supplier_proposal';
12678 $subelement =
'supplierproposal';
12679 } elseif ($elementType ==
'contract') {
12680 $classpath =
'contrat/class';
12681 $module =
'contrat';
12682 $subelement =
'contrat';
12683 $table_element =
'contract';
12684 } elseif ($elementType ==
'mailing') {
12685 $classpath =
'comm/mailing/class';
12686 $module =
'mailing';
12687 $classfile =
'mailing';
12688 $classname =
'Mailing';
12690 } elseif ($elementType ==
'member') {
12691 $classpath =
'adherents/class';
12692 $module =
'adherent';
12693 $subelement =
'adherent';
12694 $table_element =
'adherent';
12695 } elseif ($elementType ==
'usergroup') {
12696 $classpath =
'user/class';
12698 } elseif ($elementType ==
'mo') {
12699 $classpath =
'mrp/class';
12704 $table_element =
'mrp_mo';
12705 } elseif ($elementType ==
'cabinetmed_cons') {
12706 $classpath =
'cabinetmed/class';
12707 $module =
'cabinetmed';
12708 $subelement =
'cabinetmedcons';
12709 $table_element =
'cabinetmedcons';
12710 } elseif ($elementType ==
'fichinter') {
12711 $classpath =
'fichinter/class';
12712 $module =
'ficheinter';
12713 $subelement =
'fichinter';
12714 $table_element =
'fichinter';
12715 } elseif ($elementType ==
'dolresource' || $elementType ==
'resource') {
12716 $classpath =
'resource/class';
12717 $module =
'resource';
12718 $subelement =
'dolresource';
12719 $table_element =
'resource';
12720 } elseif ($elementType ==
'propaldet') {
12721 $classpath =
'comm/propal/class';
12722 $module =
'propal';
12723 $subelement =
'propaleligne';
12724 } elseif ($elementType ==
'opensurvey_sondage') {
12725 $classpath =
'opensurvey/class';
12726 $module =
'opensurvey';
12727 $subelement =
'opensurveysondage';
12728 } elseif ($elementType ==
'order_supplier') {
12729 $classpath =
'fourn/class';
12730 $module =
'fournisseur';
12731 $classfile =
'fournisseur.commande';
12732 $element =
'order_supplier';
12734 $classname =
'CommandeFournisseur';
12735 $table_element =
'commande_fournisseur';
12736 } elseif ($elementType ==
'commande_fournisseurdet') {
12737 $classpath =
'fourn/class';
12738 $module =
'fournisseur';
12739 $classfile =
'fournisseur.commande';
12740 $element =
'commande_fournisseurdet';
12742 $classname =
'CommandeFournisseurLigne';
12743 $table_element =
'commande_fournisseurdet';
12744 } elseif ($elementType ==
'invoice_supplier') {
12745 $classpath =
'fourn/class';
12746 $module =
'fournisseur';
12747 $classfile =
'fournisseur.facture';
12748 $element =
'invoice_supplier';
12750 $classname =
'FactureFournisseur';
12751 $table_element =
'facture_fourn';
12752 } elseif ($elementType ==
"service") {
12753 $classpath =
'product/class';
12754 $subelement =
'product';
12755 $table_element =
'product';
12756 } elseif ($elementType ==
'salary') {
12757 $classpath =
'salaries/class';
12758 $module =
'salaries';
12759 } elseif ($elementType ==
'payment_salary') {
12760 $classpath =
'salaries/class';
12761 $classfile =
'paymentsalary';
12762 $classname =
'PaymentSalary';
12763 $module =
'salaries';
12764 } elseif ($elementType ==
'productlot') {
12765 $module =
'productbatch';
12766 $classpath =
'product/stock/class';
12767 $classfile =
'productlot';
12768 $classname =
'Productlot';
12769 $element =
'productlot';
12771 $table_element =
'product_lot';
12772 } elseif ($elementType ==
'societeaccount') {
12773 $classpath =
'societe/class';
12774 $classfile =
'societeaccount';
12775 $classname =
'SocieteAccount';
12776 $module =
'societe';
12777 } elseif ($elementType ==
'websitepage') {
12778 $classpath =
'website/class';
12779 $classfile =
'websitepage';
12780 $classname =
'Websitepage';
12781 $module =
'website';
12782 $subelement =
'websitepage';
12783 $table_element =
'website_page';
12784 } elseif ($elementType ==
'fiscalyear') {
12785 $classpath =
'core/class';
12786 $module =
'accounting';
12787 $subelement =
'fiscalyear';
12788 } elseif ($elementType ==
'chargesociales') {
12789 $classpath =
'compta/sociales/class';
12791 $table_element =
'chargesociales';
12792 } elseif ($elementType ==
'tva') {
12793 $classpath =
'compta/tva/class';
12796 $table_element =
'tva';
12797 } elseif ($elementType ==
'emailsenderprofile') {
12799 $classpath =
'core/class';
12800 $classfile =
'emailsenderprofile';
12801 $classname =
'EmailSenderProfile';
12802 $table_element =
'c_email_senderprofile';
12804 } elseif ($elementType ==
'conferenceorboothattendee') {
12805 $classpath =
'eventorganization/class';
12806 $classfile =
'conferenceorboothattendee';
12807 $classname =
'ConferenceOrBoothAttendee';
12808 $module =
'eventorganization';
12809 } elseif ($elementType ==
'conferenceorbooth') {
12810 $classpath =
'eventorganization/class';
12811 $classfile =
'conferenceorbooth';
12812 $classname =
'ConferenceOrBooth';
12813 $module =
'eventorganization';
12814 } elseif ($elementType ==
'ccountry') {
12816 $classpath =
'core/class';
12817 $classfile =
'ccountry';
12818 $classname =
'Ccountry';
12819 $table_element =
'c_country';
12823 if (empty($classfile)) {
12824 $classfile = strtolower($subelement);
12826 if (empty($classname)) {
12827 $classname = ucfirst($subelement);
12829 if (empty($classpath)) {
12830 $classpath = $module.
'/class';
12836 if ($module && isset($conf->$module)) {
12837 if (!empty($conf->$module->multidir_output[$conf->entity])) {
12838 $dir_output = $conf->$module->multidir_output[$conf->entity];
12839 } elseif (!empty($conf->$module->output[$conf->entity])) {
12840 $dir_output = $conf->$module->output[$conf->entity];
12841 } elseif (!empty($conf->$module->dir_output)) {
12842 $dir_output = $conf->$module->dir_output;
12847 if ($element ==
'order_supplier') {
12848 $dir_output = $conf->fournisseur->commande->dir_output;
12849 } elseif ($element ==
'invoice_supplier') {
12850 $dir_output = $conf->fournisseur->facture->dir_output;
12852 $dir_output .= $subdir;
12854 $elementProperties = array(
12855 'module' => $module,
12856 'element' => $element,
12857 'table_element' => $table_element,
12858 'subelement' => $subelement,
12859 'classpath' => $classpath,
12860 'classfile' => $classfile,
12861 'classname' => $classname,
12862 'dir_output' => $dir_output
12867 if (!is_object($hookmanager)) {
12868 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
12871 $hookmanager->initHooks(array(
'elementproperties'));
12875 $parameters = array(
12876 'elementType' => $elementType,
12877 'elementProperties' => $elementProperties
12880 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
12883 $elementProperties = $hookmanager->resArray;
12884 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
12885 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
12889 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
12890 unset($hookmanager->contextarray[$key]);
12893 return $elementProperties;
12908function fetchObjectByElement($element_id, $element_type, $element_ref =
'', $useCache = 0, $maxCacheByType = 10)
12910 global $db, $globalCacheForGetObjectFromCache;
12916 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
12921 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
12922 } elseif ($element_prop[
'module'] ==
'societeaccount') {
12923 $ismodenabled = isModEnabled(
'website') || isModEnabled(
'webportal');
12925 $ismodenabled = isModEnabled($element_prop[
'module']);
12930 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
12931 if ($useCache === 1
12932 && !empty($globalCacheForGetObjectFromCache[$element_type])
12933 && !empty($globalCacheForGetObjectFromCache[$element_type][$element_id])
12934 && is_object($globalCacheForGetObjectFromCache[$element_type][$element_id])
12936 return $globalCacheForGetObjectFromCache[$element_type][$element_id];
12939 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
12941 if (class_exists($element_prop[
'classname'])) {
12942 $className = $element_prop[
'classname'];
12943 $objecttmp =
new $className($db);
12944 '@phan-var-force CommonObject $objecttmp';
12946 if ($element_id > 0 || !empty($element_ref)) {
12947 $ret = $objecttmp->fetch($element_id, $element_ref);
12949 if (empty($objecttmp->module)) {
12950 $objecttmp->module = $element_prop[
'module'];
12953 if ($useCache > 0) {
12954 if (!isset($globalCacheForGetObjectFromCache[$element_type])) {
12955 $globalCacheForGetObjectFromCache[$element_type] = [];
12959 if (! empty($globalCacheForGetObjectFromCache[$element_type]) && is_array($globalCacheForGetObjectFromCache[$element_type]) && count($globalCacheForGetObjectFromCache[$element_type]) >= $maxCacheByType) {
12960 array_shift($globalCacheForGetObjectFromCache[$element_type]);
12963 $globalCacheForGetObjectFromCache[$element_type][$element_id] = $objecttmp;
12987 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)) {
13003 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
13015 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
13027 if (empty($conf->cache[
'nonce'])) {
13031 return $conf->cache[
'nonce'];
13048function startSimpleTable($header, $link =
"", $arguments =
"", $emptyColumns = 0, $number = -1, $pictofulllist =
'')
13052 print
'<div class="div-table-responsive-no-min">';
13053 print
'<table class="noborder centpercent">';
13054 print
'<tr class="liste_titre">';
13056 print ($emptyColumns < 1) ?
'<th>' :
'<th colspan="'.($emptyColumns + 1).
'">';
13058 print
'<span class="valignmiddle">'.$langs->trans($header).
'</span>';
13060 if (!empty($link)) {
13061 if (!empty($arguments)) {
13062 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
13064 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
13068 if ($number > -1) {
13069 print
'<span class="badge marginleftonlyshort">'.$number.
'</span>';
13070 } elseif (!empty($link)) {
13071 print
'<span class="badge marginleftonlyshort">...</span>';
13074 if (!empty($link)) {
13080 if ($number < 0 && !empty($link)) {
13081 print
'<th class="right">';
13101 if ($addLineBreak) {
13117function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
13122 print
'<tr class="oddeven">';
13123 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
13128 if ($nbofloop === 0) {
13134 $colspan = $tableColumnCount;
13135 } elseif ($num > $nbofloop) {
13136 $colspan = $tableColumnCount;
13138 $colspan = $tableColumnCount - 1;
13141 if ($extraRightColumn) {
13145 print
'<tr class="liste_total">';
13147 if ($nbofloop > 0 && $num > $nbofloop) {
13148 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
13150 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
13151 print
'<td class="right centpercent">'.price($total).
'</td>';
13154 if ($extraRightColumn) {
13171 if ($method == -1) {
13182 while (ob_get_level()) {
13187 if ($method == 0) {
13188 readfile($fullpath_original_file_osencoded);
13189 } elseif ($method == 1) {
13191 $handle = fopen($fullpath_original_file_osencoded,
"rb");
13192 while (!feof($handle)) {
13193 print fread($handle, 8192);
13196 } elseif ($method == 2) {
13198 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
13199 $handle2 = fopen(
"php://output",
"wb");
13200 stream_copy_to_stream($handle1, $handle2);
13225 if ($texttoshow ===
'none') {
13226 $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>';
13227 } elseif ($texttoshow) {
13228 $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>';
13230 $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>';
13245 $result = json_decode($stringtodecode);
13246 if ($result ===
null) {
13247 $result = unserialize($stringtodecode);
13274 if ($filter ===
'') {
13277 if (!preg_match(
'/^\(.*\)$/', $filter)) {
13278 $filter =
'(' . $filter .
')';
13281 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
13282 $firstandlastparenthesis = 0;
13284 if (!
dolCheckFilters($filter, $errorstr, $firstandlastparenthesis)) {
13288 return 'Filter syntax error - '.$errorstr;
13293 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
13294 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
13297 if (preg_match(
'/[^\(\)]/', $t)) {
13298 $tmperrorstr =
'Bad syntax of the search string';
13299 $errorstr =
'Bad syntax of the search string: '.$filter;
13303 return 'Filter error - '.$tmperrorstr;
13307 $ret = ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
13309 if (is_object($db)) {
13310 $ret = str_replace(
'__NOW__', $db->idate(
dol_now()), $ret);
13312 if (is_object($user)) {
13313 $ret = str_replace(
'__USER_ID__', (
string) $user->id, $ret);
13328 $arrayofandtags = array();
13332 $parenthesislevel = 0;
13337 if ($parenthesislevel >= 1) {
13338 $sqlfilters = preg_replace(
'/^\(/',
'', preg_replace(
'/\)$/',
'', $sqlfilters));
13343 $countparenthesis = 0;
13344 while ($i < $nbofchars) {
13347 if ($char ==
'(') {
13348 $countparenthesis++;
13349 } elseif ($char ==
')') {
13350 $countparenthesis--;
13353 if ($countparenthesis == 0) {
13354 $char2 =
dol_substr($sqlfilters, $i + 1, 1);
13355 $char3 =
dol_substr($sqlfilters, $i + 2, 1);
13356 if ($char ==
'A' && $char2 ==
'N' && $char3 ==
'D') {
13359 if (!preg_match(
'/^\(.*\)$/', $s)) {
13362 $arrayofandtags[] = $s;
13375 if (!preg_match(
'/^\(.*\)$/', $s)) {
13378 $arrayofandtags[] = $s;
13381 return $arrayofandtags;
13393function dolCheckFilters($sqlfilters, &$error =
'', &$parenthesislevel = 0)
13397 $tmp = $sqlfilters;
13401 $parenthesislevel = 0;
13409 if ($char ==
'(') {
13410 if ($i == $parenthesislevel && $parenthesislevel == $counter) {
13412 $parenthesislevel++;
13415 } elseif ($char ==
')') {
13416 $nbcharremaining = ($nb - $i - 1);
13417 if ($nbcharremaining >= $counter) {
13418 $parenthesislevel = min($parenthesislevel, $counter - 1);
13420 if ($parenthesislevel > $counter && $nbcharremaining >= $counter) {
13421 $parenthesislevel = $counter;
13426 if ($counter < 0) {
13427 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13428 $parenthesislevel = 0;
13436 if ($counter > 0) {
13437 $error =
"Wrong balance of parenthesis in sqlfilters=".$sqlfilters;
13438 $parenthesislevel = 0;
13456 if (empty($matches[1])) {
13459 $tmp = explode(
':', $matches[1]);
13460 if (count($tmp) < 3) {
13480 if (empty($matches[1])) {
13483 $tmp = explode(
':', $matches[1], 3);
13484 if (count($tmp) < 3) {
13488 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
13490 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
13493 'NOTLIKE' =>
'NOT LIKE',
13494 'ISNOT' =>
'IS NOT',
13495 'NOTIN' =>
'NOT IN',
13499 if (array_key_exists($operator, $realOperator)) {
13500 $operator = $realOperator[$operator];
13503 $tmpescaped = $tmp[2];
13509 if ($operator ==
'IN' || $operator ==
'NOT IN') {
13511 $tmpescaped2 =
'(';
13513 $tmpelemarray = explode(
',', $tmpescaped);
13514 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
13516 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
13517 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
13519 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
13522 $tmpescaped2 .= implode(
',', $tmpelemarray);
13523 $tmpescaped2 .=
')';
13525 $tmpescaped = $tmpescaped2;
13526 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
13527 if (preg_match(
'/^\'([^\']*)\'$/', $tmpescaped, $regbis)) {
13528 $tmpescaped = $regbis[1];
13531 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
13532 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
13535 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
13537 if (strtoupper($tmpescaped) ==
'NULL') {
13538 $tmpescaped =
'NULL';
13539 } elseif (is_int($tmpescaped)) {
13540 $tmpescaped = (int) $tmpescaped;
13542 $tmpescaped = (float) $tmpescaped;
13546 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
13563 $out =
'<!-- timeline icon -->'.
"\n";
13564 $iconClass =
'fa fa-comments';
13569 if ($histo[$key][
'percent'] == -1) {
13570 $colorClass =
'timeline-icon-not-applicble';
13571 $pictoTitle = $langs->trans(
'StatusNotApplicable');
13572 } elseif ($histo[$key][
'percent'] == 0) {
13573 $colorClass =
'timeline-icon-todo';
13574 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
13575 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
13576 $colorClass =
'timeline-icon-in-progress';
13577 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
13578 } elseif ($histo[$key][
'percent'] >= 100) {
13579 $colorClass =
'timeline-icon-done';
13580 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
13583 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
13584 $iconClass =
'fa fa-ticket';
13585 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
13586 $iconClass =
'fa fa-pencilxxx';
13587 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13588 $iconClass =
'fa fa-comments';
13589 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13590 $iconClass =
'fa fa-mask';
13592 if ($actionstatic->type_picto) {
13593 $img_picto =
img_picto(
'', $actionstatic->type_picto);
13595 if ($actionstatic->type_code ==
'AC_RDV') {
13596 $iconClass =
'fa fa-handshake';
13597 } elseif ($actionstatic->type_code ==
'AC_TEL') {
13598 $iconClass =
'fa fa-phone';
13599 } elseif ($actionstatic->type_code ==
'AC_FAX') {
13600 $iconClass =
'fa fa-fax';
13601 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
13602 $iconClass =
'fa fa-envelope';
13603 } elseif ($actionstatic->type_code ==
'AC_INT') {
13604 $iconClass =
'fa fa-shipping-fast';
13605 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
13606 $iconClass =
'fa fa-robot';
13607 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
13608 $iconClass =
'fa fa-robot';
13613 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
13627 $documents = array();
13629 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
13630 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
13631 $sql .=
" WHERE ecm.filepath = 'agenda/".((int)
$object->id).
"'";
13633 $sql .=
' ORDER BY ecm.position ASC';
13635 $resql = $db->query($sql);
13637 if ($db->num_rows($resql)) {
13638 while ($obj = $db->fetch_object($resql)) {
13639 $documents[$obj->id] = $obj;
13665function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
null, $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
13667 global $user, $conf;
13670 global $param, $massactionbutton;
13672 require_once DOL_DOCUMENT_ROOT .
'/comm/action/class/actioncomm.class.php';
13675 if (!is_object($filterobj) && !is_object($objcon)) {
13680 '@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';
13685 $sortfield_list = explode(
',', $sortfield);
13686 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
13687 $sortfield_new_list = array();
13688 foreach ($sortfield_list as $sortfield_value) {
13689 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
13691 $sortfield_new = implode(
',', $sortfield_new_list);
13696 if (isModEnabled(
'agenda')) {
13698 if (is_object($objcon) && $objcon->id > 0) {
13699 $sql =
"SELECT DISTINCT a.id, a.label as label,";
13701 $sql =
"SELECT a.id, a.label as label,";
13703 $sql .=
" a.datep as dp,";
13704 $sql .=
" a.note as message,";
13705 $sql .=
" a.datep2 as dp2,";
13706 $sql .=
" a.percent as percent, 'action' as type,";
13707 $sql .=
" a.fk_element, a.elementtype,";
13708 $sql .=
" a.fk_contact,";
13709 $sql .=
" a.email_from as msg_from,";
13710 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
13711 $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";
13712 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13713 $sql .=
", sp.lastname, sp.firstname";
13714 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13715 $sql .=
", m.lastname, m.firstname";
13716 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13718 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13720 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13722 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13724 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13727 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
13728 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
13729 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
13731 $force_filter_contact = $filterobj instanceof
User;
13733 if (is_object($objcon) && $objcon->id > 0) {
13734 $force_filter_contact =
true;
13735 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
13736 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
13739 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13740 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
13741 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
13742 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
13743 $sql .=
" ON er.resource_type = 'dolresource'";
13744 $sql .=
" AND er.element_id = a.id";
13745 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
13746 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13747 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
13748 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13749 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
13750 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13751 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
13752 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13753 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
13754 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13755 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
13756 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13757 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
13760 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
13761 if (!$force_filter_contact) {
13762 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
13763 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
13764 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
13765 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
13766 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13767 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
13768 if ($filterobj->id) {
13769 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13771 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13772 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
13773 if ($filterobj->id) {
13774 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13776 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13777 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
13778 if ($filterobj->id) {
13779 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13781 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13782 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
13783 if ($filterobj->id) {
13784 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13786 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
13787 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
13788 if ($filterobj->id) {
13789 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13791 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
13792 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
13793 if ($filterobj->id) {
13794 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
13798 $sql .=
" AND u.rowid = ". ((int) $filterobj->id);
13802 if (!empty($actioncode)) {
13804 if ($actioncode ==
'AC_NON_AUTO') {
13805 $sql .=
" AND c.type != 'systemauto'";
13806 } elseif ($actioncode ==
'AC_ALL_AUTO') {
13807 $sql .=
" AND c.type = 'systemauto'";
13809 if ($actioncode ==
'AC_OTH') {
13810 $sql .=
" AND c.type != 'systemauto'";
13811 } elseif ($actioncode ==
'AC_OTH_AUTO') {
13812 $sql .=
" AND c.type = 'systemauto'";
13816 if ($actioncode ==
'AC_NON_AUTO') {
13817 $sql .=
" AND c.type != 'systemauto'";
13818 } elseif ($actioncode ==
'AC_ALL_AUTO') {
13819 $sql .=
" AND c.type = 'systemauto'";
13821 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
13825 if ($donetodo ==
'todo') {
13826 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
13827 } elseif ($donetodo ==
'done') {
13828 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
13830 if (is_array($filters) && $filters[
'search_agenda_label']) {
13831 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
13836 if (isModEnabled(
'mailing') && !empty($objcon->email)
13837 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
13838 $langs->load(
"mails");
13840 $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";
13841 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
13842 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
13843 $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";
13844 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13845 $sql2 .=
", '' as lastname, '' as firstname";
13846 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13847 $sql2 .=
", '' as lastname, '' as firstname";
13848 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13849 $sql2 .=
", '' as ref";
13850 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13851 $sql2 .=
", '' as ref";
13852 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13853 $sql2 .=
", '' as ref";
13855 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
13856 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
13857 $sql2 .=
" AND mc.statut = 1";
13858 $sql2 .=
" AND u.rowid = m.fk_user_valid";
13859 $sql2 .=
" AND mc.fk_mailing=m.rowid";
13862 if ($sql || $sql2) {
13863 if (!empty($sql) && !empty($sql2)) {
13864 $sql = $sql.
" UNION ".$sql2;
13865 } elseif (empty($sql) && !empty($sql2)) {
13874 $sql .= $db->order($sortfield_new, $sortorder);
13876 $sql .= $db->plimit($limit + 1, $offset);
13879 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
13880 $resql = $db->query($sql);
13883 $num = $db->num_rows($resql);
13885 $imaxinloop = ($limit ? min($num, $limit) : $num);
13886 while ($i < $imaxinloop) {
13887 $obj = $db->fetch_object($resql);
13889 if ($obj->type ==
'action') {
13891 $contactaction->id = $obj->id;
13892 $result = $contactaction->fetchResources();
13895 setEventMessage(
"actions.lib::show_actions_messaging Error fetch resource",
'errors');
13901 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
13902 $tododone =
'todo';
13905 $histo[$numaction] = array(
13906 'type' => $obj->type,
13907 'tododone' => $tododone,
13909 'datestart' => $db->jdate($obj->dp),
13910 'dateend' => $db->jdate($obj->dp2),
13911 'note' => $obj->label,
13913 'percent' => $obj->percent,
13915 'userid' => $obj->user_id,
13916 'login' => $obj->user_login,
13917 'userfirstname' => $obj->user_firstname,
13918 'userlastname' => $obj->user_lastname,
13919 'userphoto' => $obj->user_photo,
13920 'msg_from' => $obj->msg_from,
13922 'contact_id' => $obj->fk_contact,
13923 'socpeopleassigned' => $contactaction->socpeopleassigned,
13924 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
13925 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
13926 'fk_element' => $obj->fk_element,
13927 'elementtype' => $obj->elementtype,
13929 'acode' => $obj->acode,
13930 'alabel' => $obj->alabel,
13931 'libelle' => $obj->alabel,
13932 'apicto' => $obj->apicto
13935 $histo[$numaction] = array(
13936 'type' => $obj->type,
13937 'tododone' =>
'done',
13939 'datestart' => $db->jdate($obj->dp),
13940 'dateend' => $db->jdate($obj->dp2),
13941 'note' => $obj->label,
13943 'percent' => $obj->percent,
13944 'acode' => $obj->acode,
13946 'userid' => $obj->user_id,
13947 'login' => $obj->user_login,
13948 'userfirstname' => $obj->user_firstname,
13949 'userlastname' => $obj->user_lastname,
13950 'userphoto' => $obj->user_photo
13965 if (!isModEnabled(
'agenda')) {
13966 $langs->loadLangs(array(
"admin",
"errors"));
13967 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
13970 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
13971 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
13973 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
13974 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
13975 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
13976 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
13981 $userstatic =
new User($db);
13982 $contactstatic =
new Contact($db);
13983 $userGetNomUrlCache = array();
13984 $contactGetNomUrlCache = array();
13986 $out .=
'<div class="filters-container" >';
13987 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
13988 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
13990 if ($objcon && get_class($objcon) ==
'Contact' &&
13991 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
13992 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
13994 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
13996 if (($filterobj && get_class($filterobj) ==
'Societe')) {
13997 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
13999 $out .=
'<input type="hidden" name="userid" value="'.$filterobj->id.
'" />';
14004 $out .=
'<div class="div-table-responsive-no-min">';
14005 $out .=
'<table class="noborder borderbottom centpercent">';
14007 $out .=
'<tr class="liste_titre">';
14011 $out .=
'<th class="liste_titre width50 middle">';
14012 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14013 $out .= $searchpicto;
14017 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
14019 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
14021 $out .=
'<th class="liste_titre"></th>';
14023 $out .=
'<th class="liste_titre">';
14024 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
14026 $out .= $formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
14028 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
14029 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
14034 $out .=
'<th class="liste_titre width50 middle">';
14035 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
14036 $out .= $searchpicto;
14043 $out .=
'</table>';
14050 $out .=
'<ul class="timeline">';
14054 if ($filterobj instanceof
Societe) {
14055 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14057 if ($filterobj instanceof
User) {
14058 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
14060 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
14061 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
14062 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
14064 if ($filterobj instanceof
Societe) {
14067 if ($filterobj instanceof
User) {
14073 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
14075 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
14077 $actualCycleDate =
false;
14080 foreach ($histo as $key => $value) {
14081 $actionstatic->fetch($histo[$key][
'id']);
14083 $actionstatic->type_picto = $histo[$key][
'apicto'];
14084 $actionstatic->type_code = $histo[$key][
'acode'];
14086 $labeltype = $actionstatic->type_code;
14087 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
14088 $labeltype =
'AC_OTH';
14090 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14091 $labeltype = $langs->trans(
"Message");
14093 if (!empty($arraylist[$labeltype])) {
14094 $labeltype = $arraylist[$labeltype];
14096 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
14097 $labeltype .=
' - '.$arraylist[$actionstatic->code];
14101 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
14103 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
14105 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
14106 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
14107 $out .=
'<!-- timeline time label -->';
14108 $out .=
'<li class="time-label">';
14109 $out .=
'<span class="timeline-badge-date">';
14110 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
14113 $out .=
'<!-- /.timeline-label -->';
14117 $out .=
'<!-- timeline item -->'.
"\n";
14118 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
14121 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
14126 $out .=
'<div class="timeline-item">'.
"\n";
14128 $out .=
'<span class="time timeline-header-action2">';
14130 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
14131 $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").
' ';
14132 $out .= $histo[$key][
'id'];
14135 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
14138 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
14139 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
14140 $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).
'">';
14142 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
14149 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
14150 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
14151 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
14152 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
14153 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
14154 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
14155 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
14157 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
14161 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14164 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14167 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
14170 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
14176 $out .=
"</span></span>\n";
14179 $out .=
'<h3 class="timeline-header">';
14182 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
14183 if ($histo[$key][
'userid'] > 0) {
14184 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
14185 $userstatic->fetch($histo[$key][
'userid']);
14186 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
14188 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
14189 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
14190 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
14191 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
14192 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
14194 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
14197 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
14202 $out .=
' <div class="messaging-title inline-block">';
14204 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
14205 $out .= $labeltype.
' - ';
14209 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
14210 $out .= $langs->trans(
'TicketNewMessage');
14211 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
14212 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
14213 } elseif (isset($histo[$key][
'type'])) {
14214 if ($histo[$key][
'type'] ==
'action') {
14215 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14216 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
14217 $libelle = $histo[$key][
'note'];
14218 $actionstatic->id = $histo[$key][
'id'];
14220 } elseif ($histo[$key][
'type'] ==
'mailing') {
14221 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
14222 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
14223 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
14226 $libelle .= $histo[$key][
'note'];
14231 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
14232 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
14233 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
14235 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
14236 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
14238 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
14239 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
14242 $out .=
' - '.$link;
14251 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
14252 && $actionstatic->code !=
'AC_TICKET_CREATE'
14253 && $actionstatic->code !=
'AC_TICKET_MODIFY'
14255 $out .=
'<div class="timeline-body wordbreak small">';
14256 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
14258 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
14259 $out .=
'<div class="readmore-block --closed" >';
14260 $out .=
' <div class="readmore-block__excerpt">';
14262 $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>';
14264 $out .=
' <div class="readmore-block__full-text" >';
14266 $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>';
14280 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
14282 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
14283 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14285 $contact->fetch($cid);
14286 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14288 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14292 $contactList .= !empty($contactList) ?
', ' :
'';
14293 $contactList .= $contact->getNomUrl(1);
14294 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14295 if (!empty($contact->phone_pro)) {
14296 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
14302 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
14303 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
14304 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
14306 $result = $contact->fetch($histo[$key][
'contact_id']);
14307 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
14309 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
14310 $result = ($contact instanceof
Contact) ? $contact->id : 0;
14314 $footer .= $contact->getNomUrl(1);
14315 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
14316 if (!empty($contact->phone_pro)) {
14317 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
14324 if (!empty($documents)) {
14325 $footer .=
'<div class="timeline-documents-container">';
14326 foreach ($documents as $doc) {
14327 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
14328 $footer .=
' data-id="'.$doc->id.
'" ';
14329 $footer .=
' data-path="'.$doc->filepath.
'"';
14330 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
14333 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
14335 $file = $actionstatic->id.
'/'.$doc->filename;
14336 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
14337 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
14338 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
14340 $mimeAttr =
' mime="'.$mime.
'" ';
14342 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
14343 $class .=
' documentpreview';
14346 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
14347 $footer .=
img_mime($filePath).
' '.$doc->filename;
14350 $footer .=
'</span>';
14352 $footer .=
'</div>';
14355 if (!empty($footer)) {
14356 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
14359 $out .=
'</div>'.
"\n";
14362 $out .=
'<!-- END timeline item -->';
14368 jQuery(document).ready(function () {
14369 $(document).on("click", "[data-read-more-action]", function(e){
14370 let readMoreBloc = $(this).closest(".readmore-block");
14371 if(readMoreBloc.length > 0){
14372 e.preventDefault();
14373 if($(this).attr("data-read-more-action") == "close"){
14374 readMoreBloc.addClass("--closed").removeClass("--open");
14375 $("html, body").animate({
14376 scrollTop: readMoreBloc.offset().top - 200
14379 readMoreBloc.addClass("--open").removeClass("--closed");
14387 if (empty($histo)) {
14388 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
14409function GETPOSTDATE($prefix, $hourTime =
'', $gm =
'auto')
14412 if ($hourTime ===
'getpost') {
14416 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
14417 $hour = intval($m[1]);
14418 $minute = intval($m[2]);
14419 $second = intval($m[3]);
14421 $hour = $minute = $second = 0;
14424 $hour = min($hour, 23);
14425 $minute = min($minute, 59);
14426 $second = min($second, 59);
14441function buildParamDate($prefix, $timestamp =
null, $hourTime =
'', $gm =
'auto')
14443 if ($timestamp ===
null) {
14444 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
14451 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
14452 $TParam = array_merge($TParam, array(
14459 return '&' . http_build_query($TParam);
14481function recordNotFound($message =
'', $printheader = 1, $printfooter = 1, $showonlymessage = 0, $params =
null)
14483 global $conf, $db, $langs, $hookmanager;
14486 if (!is_object($langs)) {
14487 include_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
14489 $langs->setDefaultLang();
14492 $langs->load(
"errors");
14494 if ($printheader) {
14495 if (function_exists(
"llxHeader")) {
14497 } elseif (function_exists(
"llxHeaderVierge")) {
14502 print
'<div class="error">';
14503 if (empty($message)) {
14504 print $langs->trans(
"ErrorRecordNotFound");
14506 print $langs->trans($message);
14511 if (empty($showonlymessage)) {
14512 if (empty($hookmanager)) {
14513 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
14516 $hookmanager->initHooks(array(
'main'));
14519 $parameters = array(
'message' => $message,
'params' => $params);
14520 $reshook = $hookmanager->executeHooks(
'getErrorRecordNotFound', $parameters,
$object, $action);
14521 print $hookmanager->resPrint;
14524 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.
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_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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).
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.
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_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