71 public $errors = array();
81 public $cache_types_paiements = array();
82 public $cache_conditions_paiements = array();
83 public $cache_transport_mode = array();
85 public $cache_availability = array();
86 public $cache_demand_reason = array();
87 public $cache_types_fees = array();
88 public $cache_vatrates = array();
89 public $cache_invoice_subtype = array();
91 public $cache_rule_for_lines_dates = array();
120 public function editfieldkey($text, $htmlname, $preselected,
$object, $perm, $typeofdata =
'string', $moreparam =
'', $fieldrequired = 0, $notabletag = 0, $paramid =
'id', $help =
'')
127 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !preg_match(
'/^select;/', $typeofdata)) {
129 $tmp = explode(
':', $typeofdata);
130 $ret .=
'<div class="editkey_' . $tmp[0] . (!empty($tmp[1]) ?
' ' . $tmp[1] :
'') .
'" id="' . $htmlname .
'">';
131 if ($fieldrequired) {
132 $ret .=
'<span class="fieldrequired">';
137 $ret .= $langs->trans($text);
139 if ($fieldrequired) {
142 $ret .=
'</div>' .
"\n";
144 if ($fieldrequired) {
145 $ret .=
'<span class="fieldrequired">';
150 $ret .= $langs->trans($text);
152 if ($fieldrequired) {
157 if (empty($notabletag) && $perm) {
158 $ret .=
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
160 if ($fieldrequired) {
161 $ret .=
'<span class="fieldrequired">';
166 $ret .= $langs->trans($text);
168 if ($fieldrequired) {
171 if (!empty($notabletag)) {
174 if (empty($notabletag) && $perm) {
177 if (empty($notabletag) && $perm) {
178 $ret .=
'<td class="right">';
180 if ($htmlname &&
GETPOST(
'action',
'aZ09') !=
'edit' . $htmlname && $perm) {
181 $ret .=
'<a class="editfielda reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?action=edit' . $htmlname .
'&token=' .
newToken() .
'&' . $paramid .
'=' .
$object->id . $moreparam .
'">' .
img_edit($langs->trans(
'Edit'), ($notabletag ? 0 : 1)) .
'</a>';
183 if (!empty($notabletag) && $notabletag == 1) {
190 if (!empty($notabletag) && $notabletag == 3) {
193 if (empty($notabletag) && $perm) {
196 if (empty($notabletag) && $perm) {
197 $ret .=
'</tr></table>';
227 public function editfieldval($text, $htmlname, $value,
$object, $perm, $typeofdata =
'string', $editvalue =
'', $extObject =
null, $custommsg =
null, $moreparam =
'', $notabletag = 1, $formatfunc =
'', $paramid =
'id', $gm =
'auto', $moreoptions = array(), $editaction =
'')
229 global
$conf, $langs;
234 if (empty($typeofdata)) {
235 return 'ErrorBadParameter typeofdata is empty';
238 if ($typeofdata ==
'datetime') {
239 $typeofdata =
'dayhour';
242 if (preg_match(
'/^(\w+)\((\d+)\)$/', $typeofdata, $reg)) {
243 if ($reg[1] ==
'varchar') {
244 $typeofdata =
'string';
245 } elseif ($reg[1] ==
'int') {
246 $typeofdata =
'numeric';
248 return 'ErrorBadParameter ' . $typeofdata;
253 if (
getDolGlobalString(
'MAIN_USE_JQUERY_JEDITABLE') && !preg_match(
'/^select;|day|datepicker|dayhour|datehourpicker/', $typeofdata)) {
254 $ret .= $this->
editInPlace(
$object, $value, $htmlname, ($perm ? 1 : 0), $typeofdata, $editvalue, $extObject, $custommsg);
256 if ($editaction ==
'') {
257 $editaction =
GETPOST(
'action',
'aZ09');
259 $editmode = ($editaction ==
'edit' . $htmlname);
261 $ret .=
"<!-- formeditfieldval -->\n";
262 $ret .=
'<form method="post" action="' . $_SERVER[
"PHP_SELF"] . ($moreparam ?
'?' . $moreparam :
'') .
'">';
263 $ret .=
'<input type="hidden" name="action" value="set' . $htmlname .
'">';
264 $ret .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
265 $ret .=
'<input type="hidden" name="' . $paramid .
'" value="' .
$object->id .
'">';
266 if (empty($notabletag)) {
267 $ret .=
'<table class="nobordernopadding centpercent">';
269 if (empty($notabletag)) {
272 if (preg_match(
'/^(string|safehtmlstring|email|phone|url)/', $typeofdata)) {
273 $tmp = explode(
':', $typeofdata);
274 $ret .=
'<input type="text" id="' . $htmlname .
'" name="' . $htmlname .
'" value="' . ($editvalue ? $editvalue : $value) .
'"' . (empty($tmp[1]) ?
'' :
' size="' . $tmp[1] .
'"') .
' autofocus>';
275 } elseif (preg_match(
'/^(integer)/', $typeofdata)) {
276 $tmp = explode(
':', $typeofdata);
277 $valuetoshow =
price2num($editvalue ? $editvalue : $value, 0);
278 $ret .=
'<input type="text" id="' . $htmlname .
'" name="' . $htmlname .
'" value="' . $valuetoshow .
'"' . (empty($tmp[1]) ?
'' :
' size="' . $tmp[1] .
'"') .
' autofocus>';
279 } elseif (preg_match(
'/^(numeric|amount)/', $typeofdata)) {
280 $tmp = explode(
':', $typeofdata);
281 $valuetoshow =
price2num($editvalue ? $editvalue : $value);
282 $ret .=
'<input type="text" id="' . $htmlname .
'" name="' . $htmlname .
'" value="' . ($valuetoshow !=
'' ?
price($valuetoshow) :
'') .
'"' . (empty($tmp[1]) ?
'' :
' size="' . $tmp[1] .
'"') .
' autofocus>';
283 } elseif (preg_match(
'/^(checkbox)/', $typeofdata)) {
284 $tmp = explode(
':', $typeofdata);
285 $ret .=
'<input type="checkbox" id="' . $htmlname .
'" name="' . $htmlname .
'" value="' . ($value ? $value :
'on') .
'"' . ($value ?
' checked' :
'') . (empty($tmp[1]) ?
'' : $tmp[1]) .
'/>';
286 } elseif (preg_match(
'/^text/', $typeofdata) || preg_match(
'/^note/', $typeofdata)) {
287 $tmp = explode(
':', $typeofdata);
288 $cols = (empty($tmp[2]) ?
'' : $tmp[2]);
290 if (preg_match(
'/%/', $cols)) {
291 $morealt =
' style="width: ' . $cols .
'"';
294 $valuetoshow = ($editvalue ? $editvalue : $value);
295 $ret .=
'<textarea id="' . $htmlname .
'" name="' . $htmlname .
'" wrap="soft" rows="' . (empty($tmp[1]) ?
'20' : $tmp[1]) .
'"' . ($cols ?
' cols="' . $cols .
'"' :
'class="quatrevingtpercent"') . $morealt .
'" autofocus>';
298 $valuetoshow = str_replace(
'&',
'&', $valuetoshow);
300 $ret .=
'</textarea><div class="clearboth"></div>';
301 } elseif ($typeofdata ==
'day' || $typeofdata ==
'datepicker') {
302 $addnowlink = empty($moreoptions[
'addnowlink']) ? 0 : $moreoptions[
'addnowlink'];
303 $adddateof = empty($moreoptions[
'adddateof']) ?
'' : $moreoptions[
'adddateof'];
304 $labeladddateof = empty($moreoptions[
'labeladddateof']) ?
'' : $moreoptions[
'labeladddateof'];
305 $ret .= $this->
selectDate($value, $htmlname, 0, 0, 1,
'form' . $htmlname, 1, $addnowlink, 0,
'',
'', $adddateof,
'', 1, $labeladddateof,
'', $gm);
306 } elseif ($typeofdata ==
'dayhour' || $typeofdata ==
'datehourpicker') {
307 $addnowlink = empty($moreoptions[
'addnowlink']) ? 0 : $moreoptions[
'addnowlink'];
308 $adddateof = empty($moreoptions[
'adddateof']) ?
'' : $moreoptions[
'adddateof'];
309 $labeladddateof = empty($moreoptions[
'labeladddateof']) ?
'' : $moreoptions[
'labeladddateof'];
310 $ret .= $this->
selectDate($value, $htmlname, 1, 1, 1,
'form' . $htmlname, 1, $addnowlink, 0,
'',
'', $adddateof,
'', 1, $labeladddateof,
'', $gm);
311 } elseif (preg_match(
'/^select;/', $typeofdata)) {
312 $arraydata = explode(
',', preg_replace(
'/^select;/',
'', $typeofdata));
313 $arraylist = array();
314 foreach ($arraydata as $val) {
315 $tmp = explode(
':', $val);
316 $tmpkey = str_replace(
'|',
':', $tmp[0]);
317 $arraylist[$tmpkey] = $tmp[1];
319 $ret .= $this->
selectarray($htmlname, $arraylist, $value);
320 } elseif (preg_match(
'/^link/', $typeofdata)) {
322 } elseif (preg_match(
'/^ckeditor/', $typeofdata)) {
323 $tmp = explode(
':', $typeofdata);
324 require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
325 $doleditor =
new DolEditor($htmlname, ($editvalue ? $editvalue : $value), (empty($tmp[2]) ?
'' : $tmp[2]), (empty($tmp[3]) ? 100 : (int) $tmp[3]), (empty($tmp[1]) ?
'dolibarr_notes' : $tmp[1]),
'In', (empty($tmp[5]) ? false : (bool) $tmp[5]), (isset($tmp[8]) ? ($tmp[8] ? true :
false) :
true),
true, (empty($tmp[6]) ? 20 : (int) $tmp[6]), (empty($tmp[7]) ?
'100' : $tmp[7]));
326 $ret .= $doleditor->Create(1);
327 } elseif ($typeofdata ==
'asis') {
328 $ret .= ($editvalue ? $editvalue : $value);
330 if (empty($notabletag)) {
335 if (empty($notabletag)) {
339 $ret .=
'<input type="submit" class="smallpaddingimp nomargingtop nomarginbottom button' . (empty($notabletag) ?
'' :
' ') .
'" name="modify" value="' . $langs->trans(
"Save") .
'">';
340 if (preg_match(
'/ckeditor|textarea/', $typeofdata) && empty($notabletag)) {
341 $ret .=
'<br>' .
"\n";
343 $ret .=
'<input type="submit" class="smallpaddingimp nomargingtop nomarginbottom button button-cancel' . (empty($notabletag) ?
'' :
' ') .
'" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
344 if (empty($notabletag)) {
348 if (empty($notabletag)) {
349 $ret .=
'</tr></table>' .
"\n";
351 $ret .=
'</form>' .
"\n";
353 if (preg_match(
'/^email/', $typeofdata)) {
355 } elseif (preg_match(
'/^phone/', $typeofdata)) {
357 } elseif (preg_match(
'/^url/', $typeofdata)) {
359 } elseif (preg_match(
'/^(amount|numeric)/', $typeofdata)) {
360 $ret .= ($value !=
'' ?
price($value, 0, $langs, 0, -1, -1,
$conf->currency) :
'');
361 } elseif (preg_match(
'/^checkbox/', $typeofdata)) {
362 $tmp = explode(
':', $typeofdata);
363 $ret .=
'<input type="checkbox" disabled id="' . $htmlname .
'" name="' . $htmlname .
'" value="' . $value .
'"' . ($value ?
' checked' :
'') . ($tmp[1] ? $tmp[1] :
'') .
'/>';
364 } elseif (preg_match(
'/^text/', $typeofdata) || preg_match(
'/^note/', $typeofdata)) {
366 } elseif (preg_match(
'/^(safehtmlstring|restricthtml)/', $typeofdata)) {
368 } elseif ($typeofdata ==
'day' || $typeofdata ==
'datepicker') {
369 $ret .=
'<span class="valuedate">' .
dol_print_date($value,
'day', $gm) .
'</span>';
370 } elseif ($typeofdata ==
'dayhour' || $typeofdata ==
'datehourpicker') {
371 $ret .=
'<span class="valuedate">' .
dol_print_date($value,
'dayhour', $gm) .
'</span>';
372 } elseif (preg_match(
'/^select;/', $typeofdata)) {
373 $arraydata = explode(
',', preg_replace(
'/^select;/',
'', $typeofdata));
374 $arraylist = array();
375 foreach ($arraydata as $val) {
376 $tmp = explode(
':', $val);
377 $arraylist[$tmp[0]] = $tmp[1];
379 $ret .= $arraylist[$value];
380 if ($htmlname ==
'fk_product_type') {
382 $ret =
img_picto($langs->trans(
"Product"),
'product',
'class="paddingleftonly paddingrightonly colorgrey"') . $ret;
384 $ret =
img_picto($langs->trans(
"Service"),
'service',
'class="paddingleftonly paddingrightonly colorgrey"') . $ret;
387 } elseif (preg_match(
'/^ckeditor/', $typeofdata)) {
390 $firstline = preg_replace(
'/<br>.*/',
'', $tmpcontent);
391 $firstline = preg_replace(
'/[\n\r].*/',
'', $firstline);
392 $tmpcontent = $firstline . ((strlen($firstline) != strlen($tmpcontent)) ?
'...' :
'');
398 if (empty($moreoptions[
'valuealreadyhtmlescaped'])) {
406 if ($formatfunc && method_exists(
$object, $formatfunc)) {
407 $ret =
$object->$formatfunc($ret);
427 global
$conf, $langs, $extralanguages;
432 $arrayoflangcode = array();
437 if (is_array($arrayoflangcode) && count($arrayoflangcode)) {
438 if (!is_object($extralanguages)) {
439 include_once DOL_DOCUMENT_ROOT .
'/core/class/extralanguages.class.php';
442 $extralanguages->fetch_name_extralanguages(
'societe');
444 if (!is_array($extralanguages->attributes[
$object->element]) || empty($extralanguages->attributes[
$object->element][$fieldname])) {
448 $result .=
'<!-- Widget for translation -->' .
"\n";
449 $result .=
'<div class="inline-block paddingleft image-' .
$object->element .
'-' . $fieldname .
'">';
450 $s =
img_picto($langs->trans(
"ShowOtherLanguages"),
'language',
'', 0, 0, 0,
'',
'fa-15 editfieldlang');
454 $result .=
'<div class="inline-block hidden field-' .
$object->element .
'-' . $fieldname .
'">';
456 $resultforextrlang =
'';
457 foreach ($arrayoflangcode as $langcode) {
458 $valuetoshow = GETPOSTISSET(
'field-' .
$object->element .
"-" . $fieldname .
"-" . $langcode) ?
GETPOST(
'field-' .
$object->element .
'-' . $fieldname .
"-" . $langcode, $check) :
'';
459 if (empty($valuetoshow)) {
460 $object->fetchValuesForExtraLanguages();
462 $valuetoshow =
$object->array_languages[$fieldname][$langcode];
466 $resultforextrlang .= $s;
469 if ($typeofdata ==
'textarea') {
470 $resultforextrlang .=
'<textarea name="field-' .
$object->element .
"-" . $fieldname .
"-" . $langcode .
'" id="' . $fieldname .
"-" . $langcode .
'" class="' . $morecss .
'" rows="' . ROWS_2 .
'" wrap="soft">';
471 $resultforextrlang .= $valuetoshow;
472 $resultforextrlang .=
'</textarea>';
474 $resultforextrlang .=
'<input type="text" class="inputfieldforlang ' . ($morecss ?
' ' . $morecss :
'') .
'" name="field-' .
$object->element .
'-' . $fieldname .
'-' . $langcode .
'" value="' . $valuetoshow .
'">';
477 $result .= $resultforextrlang;
480 $result .=
'<script nonce="' .
getNonce() .
'">$(".image-' .
$object->element .
'-' . $fieldname .
'").click(function() { console.log("Toggle lang widget"); jQuery(".field-' .
$object->element .
'-' . $fieldname .
'").toggle(); });</script>';
499 protected function editInPlace(
$object, $value, $htmlname, $condition, $inputType =
'textarea', $editvalue =
null, $extObject =
null, $custommsg =
null)
504 if (preg_match(
'/^text/', $inputType)) {
506 } elseif (preg_match(
'/^numeric/', $inputType)) {
507 $value =
price($value);
508 } elseif ($inputType ==
'day' || $inputType ==
'datepicker') {
514 $table_element =
false;
518 $ext_element =
false;
519 $button_only =
false;
526 $table_element =
$object->table_element;
530 if (is_object($extObject)) {
531 $ext_element = $extObject->element;
534 if (preg_match(
'/^(string|email|numeric)/', $inputType)) {
535 $tmp = explode(
':', $inputType);
536 $inputType = $tmp[0];
537 if (!empty($tmp[1])) {
538 $inputOption = $tmp[1];
540 if (!empty($tmp[2])) {
541 $savemethod = $tmp[2];
543 $out .=
'<input id="width_' . $htmlname .
'" value="' . $inputOption .
'" type="hidden"/>' .
"\n";
544 } elseif ((preg_match(
'/^day$/', $inputType)) || (preg_match(
'/^datepicker/', $inputType)) || (preg_match(
'/^datehourpicker/', $inputType))) {
545 $tmp = explode(
':', $inputType);
546 $inputType = $tmp[0];
547 if (!empty($tmp[1])) {
548 $inputOption = $tmp[1];
550 if (!empty($tmp[2])) {
551 $savemethod = $tmp[2];
554 $out .=
'<input id="timestamp" type="hidden"/>' .
"\n";
555 } elseif (preg_match(
'/^(select|autocomplete)/', $inputType)) {
556 $tmp = explode(
':', $inputType);
557 $inputType = $tmp[0];
558 $loadmethod = $tmp[1];
559 if (!empty($tmp[2])) {
560 $savemethod = $tmp[2];
562 if (!empty($tmp[3])) {
565 } elseif (preg_match(
'/^textarea/', $inputType)) {
566 $tmp = explode(
':', $inputType);
567 $inputType = $tmp[0];
568 $rows = (empty($tmp[1]) ?
'8' : $tmp[1]);
569 $cols = (empty($tmp[2]) ?
'80' : $tmp[2]);
570 } elseif (preg_match(
'/^ckeditor/', $inputType)) {
571 $tmp = explode(
':', $inputType);
572 $inputType = $tmp[0];
574 if (!empty($tmp[2])) {
577 if (!empty($tmp[3])) {
580 if (!empty($tmp[4])) {
581 $savemethod = $tmp[4];
584 if (isModEnabled(
'fckeditor')) {
585 $out .=
'<input id="ckeditor_toolbar" value="' . $toolbar .
'" type="hidden"/>' .
"\n";
587 $inputType =
'textarea';
591 $out .=
'<input id="element_' . $htmlname .
'" value="' . $element .
'" type="hidden"/>' .
"\n";
592 $out .=
'<input id="table_element_' . $htmlname .
'" value="' . $table_element .
'" type="hidden"/>' .
"\n";
593 $out .=
'<input id="fk_element_' . $htmlname .
'" value="' . $fk_element .
'" type="hidden"/>' .
"\n";
594 $out .=
'<input id="loadmethod_' . $htmlname .
'" value="' . $loadmethod .
'" type="hidden"/>' .
"\n";
595 if (!empty($savemethod)) {
596 $out .=
'<input id="savemethod_' . $htmlname .
'" value="' . $savemethod .
'" type="hidden"/>' .
"\n";
598 if (!empty($ext_element)) {
599 $out .=
'<input id="ext_element_' . $htmlname .
'" value="' . $ext_element .
'" type="hidden"/>' .
"\n";
601 if (!empty($custommsg)) {
602 if (is_array($custommsg)) {
603 if (!empty($custommsg[
'success'])) {
604 $out .=
'<input id="successmsg_' . $htmlname .
'" value="' . $custommsg[
'success'] .
'" type="hidden"/>' .
"\n";
606 if (!empty($custommsg[
'error'])) {
607 $out .=
'<input id="errormsg_' . $htmlname .
'" value="' . $custommsg[
'error'] .
'" type="hidden"/>' .
"\n";
610 $out .=
'<input id="successmsg_' . $htmlname .
'" value="' . $custommsg .
'" type="hidden"/>' .
"\n";
613 if ($inputType ==
'textarea') {
614 $out .=
'<input id="textarea_' . $htmlname .
'_rows" value="' . $rows .
'" type="hidden"/>' .
"\n";
615 $out .=
'<input id="textarea_' . $htmlname .
'_cols" value="' . $cols .
'" type="hidden"/>' .
"\n";
617 $out .=
'<span id="viewval_' . $htmlname .
'" class="viewval_' . $inputType . ($button_only ?
' inactive' :
' active') .
'">' . $value .
'</span>' .
"\n";
618 $out .=
'<span id="editval_' . $htmlname .
'" class="editval_' . $inputType . ($button_only ?
' inactive' :
' active') .
' hideobject">' . (!empty($editvalue) ? $editvalue : $value) .
'</span>' .
"\n";
644 public function textwithtooltip($text, $htmltext, $tooltipon = 1, $direction = 0, $img =
'', $extracss =
'', $notabs = 3, $incbefore =
'', $noencodehtmltext = 0, $tooltiptrigger =
'', $forcenowrap = 0)
647 $text = $incbefore . $text;
652 $direction = (int) $direction;
662 $htmltext = str_replace(array(
"\r",
"\n"),
'', $htmltext);
665 if ($direction < 0) {
666 $extracss = ($extracss ? $extracss :
'') . ($notabs != 3 ?
' inline-block' :
'');
667 $extrastyle =
'padding: 0px; padding-left: 2px;';
669 if ($direction > 0) {
670 $extracss = ($extracss ? $extracss :
'') . ($notabs != 3 ?
' inline-block' :
'');
671 $extrastyle =
'padding: 0px; padding-right: 2px;';
674 $classfortooltip =
'classfortooltip';
679 if ($tooltiptrigger ==
'') {
680 $htmltext = str_replace(
'"',
'"', $htmltext);
682 $classfortooltip =
'classfortooltiponclick';
683 $textfordialog .=
'<div style="display: none;" id="idfortooltiponclick_' . $tooltiptrigger .
'" class="classfortooltiponclicktext"';
687 $textfordialog .=
' title="'.$langs->trans(
"Note").
'"';
689 $textfordialog .=
'>' . $htmltext .
'</div>';
691 if ($tooltipon == 2 || $tooltipon == 3) {
692 $paramfortooltipimg =
' class="' . $classfortooltip . ($notabs != 3 ?
' inline-block' :
'') . ($extracss ?
' ' . $extracss :
'') .
'" style="padding: 0px;' . ($extrastyle ?
' ' . $extrastyle :
'') .
'"';
693 if ($tooltiptrigger ==
'') {
694 $paramfortooltipimg .=
' title="' . ($noencodehtmltext ? $htmltext :
dol_escape_htmltag($htmltext, 1)) .
'"';
696 $paramfortooltipimg .=
' dolid="' . $tooltiptrigger .
'"';
699 $paramfortooltipimg = ($extracss ?
' class="' . $extracss .
'"' :
'') . ($extrastyle ?
' style="' . $extrastyle .
'"' :
'');
701 if ($tooltipon == 1 || $tooltipon == 3) {
702 $paramfortooltiptd =
' class="' . ($tooltipon == 3 ?
'cursorpointer ' :
'') . $classfortooltip . ($tag !=
'td' ?
' inline-block' :
'') . ($extracss ?
' ' . $extracss :
'') .
'" style="padding: 0px;' . ($extrastyle ?
' ' . $extrastyle :
'') .
'" ';
703 if ($tooltiptrigger ==
'') {
704 $paramfortooltiptd .=
' title="' . ($noencodehtmltext ? $htmltext :
dol_escape_htmltag($htmltext, 1)) .
'"';
706 $paramfortooltiptd .=
' dolid="' . $tooltiptrigger .
'"';
709 $paramfortooltiptd = ($extracss ?
' class="' . $extracss .
'"' :
'') . ($extrastyle ?
' style="' . $extrastyle .
'"' :
'');
711 if (empty($notabs)) {
712 $s .=
'<table class="nobordernopadding"><tr style="height: auto;">';
713 } elseif ($notabs == 2) {
714 $s .=
'<div class="inline-block' . ($forcenowrap ?
' nowrap' :
'') .
'">';
717 if ($direction < 0) {
718 $s .=
'<' . $tag . $paramfortooltipimg;
720 $s .=
' class="valigntop" width="14"';
722 $s .=
'>' . $textfordialog . $img .
'</' . $tag .
'>';
726 if ((
string) $text !=
'') {
727 $s .=
'<' . $tag . $paramfortooltiptd .
'>' . $text .
'</' . $tag .
'>';
730 if ($direction > 0) {
731 $s .=
'<' . $tag . $paramfortooltipimg;
733 $s .=
' class="valignmiddle" width="14"';
735 $s .=
'>' . $textfordialog . $img .
'</' . $tag .
'>';
737 if (empty($notabs)) {
738 $s .=
'</tr></table>';
739 } elseif ($notabs == 2) {
760 public function textwithpicto($text, $htmltooltip, $direction = 1, $type =
'help', $extracss =
'valignmiddle', $noencodehtmltext = 0, $notabs = 3, $tooltiptrigger =
'', $forcenowrap = 0)
762 global
$conf, $langs;
767 } elseif ($type ==
'1') {
771 $tooltiptrigger = preg_replace(
'/[^a-z0-9]/i',
'', $tooltiptrigger);
773 if (preg_match(
'/onsmartphone$/', $tooltiptrigger) && empty(
$conf->dol_no_mouse_hover)) {
774 $tooltiptrigger = preg_replace(
'/^.*onsmartphone$/',
'', $tooltiptrigger);
777 if ($tooltiptrigger) {
778 $alt = $langs->transnoentitiesnoconv(
"ClickToShowHelp");
782 if (empty(
$conf->use_javascript_ajax)) {
783 if ($type ==
'info' || $type ==
'infoclickable' || $type ==
'help' || $type ==
'helpclickable') {
792 if (!empty(
$conf->dol_no_mouse_hover) && empty($tooltiptrigger)) {
793 if ($type ==
'info' || $type ==
'infoclickable' || $type ==
'help' || $type ==
'helpclickable') {
804 if ($type ==
'info') {
805 $img =
img_help(($tooltiptrigger !=
'' ? 2 : 0), $alt);
806 } elseif ($type ==
'help') {
807 $img =
img_help(($tooltiptrigger !=
'' ? 2 : 1), $alt);
808 } elseif ($type ==
'helpclickable') {
809 $img =
img_help(($tooltiptrigger !=
'' ? 2 : 1), $alt);
810 } elseif ($type ==
'superadmin') {
813 } elseif ($type ==
'admin') {
816 } elseif ($type ==
'warning') {
818 } elseif ($type !=
'none') {
823 $tooltipon = ((($tooltiptrigger && !$img) || strpos($type,
'clickable')) ? 3 : 2);
825 return $this->
textwithtooltip($text, $htmltooltip, $tooltipon, $direction, $img, $extracss, $notabs,
'', $noencodehtmltext, $tooltiptrigger, $forcenowrap);
838 public function selectMassAction($selected, $arrayofaction, $alwaysvisible = 0, $name =
'massaction', $cssclass =
'checkforselect')
840 global
$conf, $langs, $hookmanager;
843 $ret =
'<div class="centpercent center">';
844 $ret .=
'<select class="flat' . (empty(
$conf->use_javascript_ajax) ?
'' :
' hideobject') .
' ' . $name .
' ' . $name .
'select valignmiddle alignstart" id="' . $name .
'" name="' . $name .
'"' . ($disabled ?
' disabled="disabled"' :
'') .
'>';
847 $parameters = array();
848 $reshook = $hookmanager->executeHooks(
'addMoreMassActions', $parameters);
851 if (is_array($arrayofaction) && count($arrayofaction) == 0 && empty($hookmanager->resPrint)) {
854 if (empty($reshook)) {
855 $ret .=
'<option value="0"' . ($disabled ?
' disabled="disabled"' :
'') .
'>-- ' . $langs->trans(
"SelectAction") .
' --</option>';
856 if (is_array($arrayofaction)) {
857 foreach ($arrayofaction as $code => $label) {
858 $ret .=
'<option value="' . $code .
'"' . ($disabled ?
' disabled="disabled"' :
'') .
' data-html="' .
dol_escape_htmltag($label) .
'">' . $label .
'</option>';
862 $ret .= $hookmanager->resPrint;
866 if (empty(
$conf->dol_optimize_smallscreen)) {
871 $ret .=
'<input type="submit" name="confirmmassactioninvisible" style="display: none" tabindex="-1">';
872 $ret .=
'<input type="submit" disabled name="confirmmassaction"' . (empty(
$conf->use_javascript_ajax) ?
'' :
' style="display: none"') .
' class="reposition button smallpaddingimp' . (empty(
$conf->use_javascript_ajax) ?
'' :
' hideobject') .
' ' . $name .
' ' . $name .
'confirmed" value="' .
dol_escape_htmltag($langs->trans(
"Confirm")) .
'">';
875 if (!empty(
$conf->use_javascript_ajax)) {
876 $ret .=
'<!-- JS CODE TO ENABLE mass action select -->
878 function initCheckForSelect(mode, name, cssclass) { /* mode is 0 during init of page or click all, 1 when we click on 1 checkboxi, "name" refers to the class of the massaction button, "cssclass" to the class of the checkfor select boxes */
879 atleastoneselected=0;
880 jQuery("."+cssclass).each(function( index ) {
881 /* console.log( index + ": " + $( this ).text() ); */
882 if ($(this).is(\':checked\')) atleastoneselected++;
885 console.log("initCheckForSelect mode="+mode+" name="+name+" cssclass="+cssclass+" atleastoneselected="+atleastoneselected);
887 if (atleastoneselected || ' . ((int) $alwaysvisible) .
') {
888 jQuery("."+name).show();
889 ' . ($selected ?
'if (atleastoneselected) { jQuery("."+name+"select").val("' . $selected .
'").trigger(\'change\'); jQuery("."+name+"confirmed").prop(\'disabled\', false); }' :
'') .
'
890 ' . ($selected ?
'if (! atleastoneselected) { jQuery("."+name+"select").val("0").trigger(\'change\'); jQuery("."+name+"confirmed").prop(\'disabled\', true); } ' :
'') .
'
892 jQuery("."+name).hide();
893 jQuery("."+name+"other").hide();
897 jQuery(document).ready(function () {
898 initCheckForSelect(0, "' . $name .
'", "' . $cssclass .
'");
899 jQuery(".' . $cssclass .
'").click(function() {
900 initCheckForSelect(1, "' . $name .
'", "' . $cssclass .
'");
902 jQuery(".' . $name .
'select").change(function() {
903 var massaction = $( this ).val();
904 var urlform = $( this ).closest("form").attr("action").replace("#show_files","");
905 if (massaction == "builddoc") {
906 urlform = urlform + "#show_files";
908 $( this ).closest("form").attr("action", urlform);
909 console.log("we select a mass action name=' . $name .
' massaction="+massaction+" - "+urlform);
910 /* Warning: if you set submit button to disabled, post using Enter will no more work if there is no other button */
911 if ($(this).val() != \'0\') {
912 jQuery(".' . $name .
'confirmed").prop(\'disabled\', false);
913 jQuery(".' . $name .
'other").hide(); /* To disable if another div was open */
914 jQuery(".' . $name .
'"+massaction).show();
916 jQuery(".' . $name .
'confirmed").prop(\'disabled\', true);
917 jQuery(".' . $name .
'other").hide(); /* To disable any div open */
947 public function select_country($selected =
'', $htmlname =
'country_id', $htmloption =
'', $maxlength = 0, $morecss =
'minwidth300', $usecodeaskey =
'', $showempty = 1, $disablefavorites = 0, $addspecialentries = 0, $exclude_country_code = array(), $hideflags = 0, $forcecombo = 0)
950 global $langs, $mysoc;
952 $langs->load(
"dict");
955 $countryArray = array();
958 $atleastonefavorite = 0;
960 $sql =
"SELECT rowid, code as code_iso, code_iso as code_iso3, label, favorite, eec";
961 $sql .=
" FROM " . $this->db->prefix() .
"c_country";
962 $sql .=
" WHERE active > 0";
965 dol_syslog(get_class($this) .
"::select_country", LOG_DEBUG);
966 $resql = $this->db->query($sql);
968 $out .=
'<select id="select' . $htmlname .
'" class="flat maxwidth200onsmartphone selectcountry' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'" ' . $htmloption .
'>';
969 $num = $this->db->num_rows($resql);
973 $obj = $this->db->fetch_object($resql);
975 $countryArray[$i][
'rowid'] = $obj->rowid;
976 $countryArray[$i][
'code_iso'] = $obj->code_iso;
977 $countryArray[$i][
'code_iso3'] = $obj->code_iso3;
978 $countryArray[$i][
'label'] = ($obj->code_iso && $langs->transnoentitiesnoconv(
"Country" . $obj->code_iso) !=
"Country" . $obj->code_iso ? $langs->transnoentitiesnoconv(
"Country" . $obj->code_iso) : ($obj->label !=
'-' ? $obj->label :
''));
979 $countryArray[$i][
'favorite'] = $obj->favorite;
980 $countryArray[$i][
'eec'] = $obj->eec;
981 $favorite[$i] = $obj->favorite;
986 if (empty($disablefavorites)) {
987 $array1_sort_order = SORT_DESC;
988 $array2_sort_order = SORT_ASC;
989 array_multisort($favorite, $array1_sort_order, $label, $array2_sort_order, $countryArray);
995 if (is_numeric($showempty)) {
996 $out .=
'<option value=""> </option>' .
"\n";
998 $out .=
'<option value="-1">' . $langs->trans($showempty) .
'</option>' .
"\n";
1002 if ($addspecialentries) {
1004 $out .=
'<option value="special_allnotme"' . ($selected ==
'special_allnotme' ?
' selected' :
'') .
'>' . $langs->trans(
"CountriesExceptMe", $langs->transnoentitiesnoconv(
"Country" . $mysoc->country_code)) .
'</option>';
1005 $out .=
'<option value="special_eec"' . ($selected ==
'special_eec' ?
' selected' :
'') .
'>' . $langs->trans(
"CountriesInEEC") .
'</option>';
1006 if ($mysoc->isInEEC()) {
1007 $out .=
'<option value="special_eecnotme"' . ($selected ==
'special_eecnotme' ?
' selected' :
'') .
'>' . $langs->trans(
"CountriesInEECExceptMe", $langs->transnoentitiesnoconv(
"Country" . $mysoc->country_code)) .
'</option>';
1009 $out .=
'<option value="special_noteec"' . ($selected ==
'special_noteec' ?
' selected' :
'') .
'>' . $langs->trans(
"CountriesNotInEEC") .
'</option>';
1010 $out .=
'<option value="" disabled class="selectoptiondisabledwhite">------------</option>';
1013 foreach ($countryArray as $row) {
1015 if (empty($row[
'rowid'])) {
1018 if (is_array($exclude_country_code) && count($exclude_country_code) && in_array($row[
'code_iso'], $exclude_country_code)) {
1022 if (empty($disablefavorites) && $row[
'favorite'] && $row[
'code_iso']) {
1023 $atleastonefavorite++;
1025 if (empty($row[
'favorite']) && $atleastonefavorite) {
1026 $atleastonefavorite = 0;
1027 $out .=
'<option value="" disabled class="selectoptiondisabledwhite">------------</option>';
1031 if ($row[
'label']) {
1032 $labeltoshow .=
dol_trunc($row[
'label'], $maxlength,
'middle');
1034 $labeltoshow .=
' ';
1036 if ($row[
'code_iso']) {
1037 $labeltoshow .=
' <span class="opacitymedium">(' . $row[
'code_iso'] .
')</span>';
1038 if (empty($hideflags)) {
1039 $tmpflag =
picto_from_langcode($row[
'code_iso'],
'class="saturatemedium paddingrightonly"', 1);
1040 $labeltoshow = $tmpflag .
' ' . $labeltoshow;
1044 if ($selected && $selected !=
'-1' && ($selected == $row[
'rowid'] || $selected == $row[
'code_iso'] || $selected == $row[
'code_iso3'] || $selected == $row[
'label'])) {
1045 $out .=
'<option value="' . ($usecodeaskey ? ($usecodeaskey ==
'code2' ? $row[
'code_iso'] : $row[
'code_iso3']) : $row[
'rowid']) .
'" selected data-html="' .
dol_escape_htmltag($labeltoshow) .
'" data-eec="' . ((int) $row[
'eec']) .
'">';
1047 $out .=
'<option value="' . ($usecodeaskey ? ($usecodeaskey ==
'code2' ? $row[
'code_iso'] : $row[
'code_iso3']) : $row[
'rowid']) .
'" data-html="' .
dol_escape_htmltag($labeltoshow) .
'" data-eec="' . ((int) $row[
'eec']) .
'">';
1050 $out .=
'</option>' .
"\n";
1053 $out .=
'</select>';
1059 if (empty($forcecombo)) {
1060 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
1061 $out .=
ajax_combobox(
'select' . $htmlname, array(), 0, 0,
'resolve');
1082 public function select_incoterms($selected =
'', $location_incoterms =
'', $page =
'', $htmlname =
'incoterm_id', $htmloption =
'', $forcecombo = 1, $events = array(), $disableautocomplete = 0)
1085 global
$conf, $langs;
1087 $langs->load(
"dict");
1091 $incotermArray = array();
1093 $sql =
"SELECT rowid, code";
1094 $sql .=
" FROM " . $this->db->prefix() .
"c_incoterms";
1095 $sql .=
" WHERE active > 0";
1096 $sql .=
" ORDER BY code ASC";
1098 dol_syslog(get_class($this) .
"::select_incoterm", LOG_DEBUG);
1099 $resql = $this->db->query($sql);
1101 if (
$conf->use_javascript_ajax && !$forcecombo) {
1102 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
1106 if (!empty($page)) {
1107 $out .=
'<form method="post" action="' . $page .
'">';
1108 $out .=
'<input type="hidden" name="action" value="set_incoterms">';
1109 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1112 $out .=
'<select id="' . $htmlname .
'" class="flat selectincoterm width75" name="' . $htmlname .
'" ' . $htmloption .
'>';
1113 $out .=
'<option value="0"> </option>';
1114 $num = $this->db->num_rows($resql);
1118 $obj = $this->db->fetch_object($resql);
1119 $incotermArray[$i][
'rowid'] = $obj->rowid;
1120 $incotermArray[$i][
'code'] = $obj->code;
1124 foreach ($incotermArray as $row) {
1125 if ($selected && ($selected == $row[
'rowid'] || $selected == $row[
'code'])) {
1126 $out .=
'<option value="' . $row[
'rowid'] .
'" selected>';
1128 $out .=
'<option value="' . $row[
'rowid'] .
'">';
1132 $out .= $row[
'code'];
1135 $out .=
'</option>';
1138 $out .=
'</select>';
1141 if (
$conf->use_javascript_ajax && empty($disableautocomplete)) {
1142 $out .=
ajax_multiautocompleter(
'location_incoterms', array(), DOL_URL_ROOT .
'/core/ajax/locationincoterms.php') .
"\n";
1145 $out .=
'<input id="location_incoterms" class="maxwidthonsmartphone heightofcombo" type="text" name="location_incoterms" value="' . $location_incoterms .
'">' .
"\n";
1147 if (!empty($page)) {
1148 $out .=
'<input type="submit" class="button valignmiddle smallpaddingimp nomargintop nomarginbottom" value="' . $langs->trans(
"Modify") .
'"></form>';
1172 public function select_type_of_lines($selected =
'', $htmlname =
'type', $showempty = 0, $hidetext = 0, $forceall = 0, $morecss =
"", $useajaxcombo = 1)
1178 if ($forceall == 1 || (empty($forceall) && isModEnabled(
"product") && isModEnabled(
"service"))
1179 || (empty($forceall) && !isModEnabled(
'product') && !isModEnabled(
'service'))) {
1180 if (empty($hidetext)) {
1181 print $langs->trans(
"Type").
'...';
1183 print
'<select class="flat'.($morecss ?
' '.$morecss :
'').
'" id="select_' . $htmlname .
'" name="' . $htmlname .
'">';
1185 print
'<option value="-1" class="opacitymedium"'.($useajaxcombo ?
'' :
' disabled="disabled"');
1186 if ($selected == -1) {
1190 if (is_numeric($showempty)) {
1198 print
'<option value="0"';
1199 if (0 == $selected || ($selected == -1 &&
getDolGlobalString(
'MAIN_FREE_PRODUCT_CHECKED_BY_DEFAULT') ==
'product')) {
1202 print
'>' . $langs->trans(
"Product");
1204 print
'<option value="1"';
1205 if (1 == $selected || ($selected == -1 &&
getDolGlobalString(
'MAIN_FREE_PRODUCT_CHECKED_BY_DEFAULT') ==
'service')) {
1208 print
'>' . $langs->trans(
"Service");
1212 if ($useajaxcombo) {
1217 if ((empty($forceall) && !isModEnabled(
'product') && isModEnabled(
"service")) || $forceall == 3) {
1218 print $langs->trans(
"Service");
1219 print
'<input type="hidden" name="' . $htmlname .
'" value="1">';
1221 if ((empty($forceall) && isModEnabled(
"product") && !isModEnabled(
'service')) || $forceall == 2) {
1222 print $langs->trans(
"Product");
1223 print
'<input type="hidden" name="' . $htmlname .
'" value="0">';
1225 if ($forceall < 0) {
1226 print
'<input type="hidden" name="' . $htmlname .
'" value="1">';
1242 $num = count($this->cache_types_fees);
1249 $langs->load(
"trips");
1251 $sql =
"SELECT c.code, c.label";
1252 $sql .=
" FROM " . $this->db->prefix() .
"c_type_fees as c";
1253 $sql .=
" WHERE active > 0";
1255 $resql = $this->db->query($sql);
1257 $num = $this->db->num_rows($resql);
1261 $obj = $this->db->fetch_object($resql);
1264 $label = ($obj->code != $langs->trans($obj->code) ? $langs->trans($obj->code) : $langs->trans($obj->label));
1265 $this->cache_types_fees[$obj->code] = $label;
1269 asort($this->cache_types_fees);
1291 global $user, $langs;
1293 dol_syslog(__METHOD__ .
" selected=" . $selected .
", htmlname=" . $htmlname, LOG_DEBUG);
1297 print
'<select id="select_' . $htmlname .
'" class="flat" name="' . $htmlname .
'">';
1299 print
'<option value="-1"';
1300 if ($selected == -1) {
1303 print
'> </option>';
1306 foreach ($this->cache_types_fees as $key => $value) {
1307 print
'<option value="' . $key .
'"';
1308 if ($key == $selected) {
1318 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1347 public function select_company($selected =
'', $htmlname =
'socid', $filter =
'', $showempty =
'', $showtype = 0, $forcecombo = 0, $events = array(), $limit = 0, $morecss =
'minwidth100', $moreparam =
'', $selected_input_value =
'', $hidelabel = 1, $ajaxoptions = array(), $multiple =
false, $excludeids = array(), $showcode = 0)
1350 global
$conf, $langs;
1354 if (!empty(
$conf->use_javascript_ajax) &&
getDolGlobalString(
'COMPANY_USE_SEARCH_TO_SELECT') && !$forcecombo) {
1355 if (is_null($ajaxoptions)) {
1356 $ajaxoptions = array();
1359 require_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
1363 if ($selected && empty($selected_input_value)) {
1364 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
1365 $societetmp =
new Societe($this->db);
1366 $societetmp->fetch($selected);
1367 $selected_input_value = $societetmp->name;
1372 $urloption =
'htmlname=' . urlencode((
string) (str_replace(
'.',
'_', $htmlname))) .
'&outjson=1&filter=' . urlencode((
string) ($filter)) . (empty($excludeids) ?
'' :
'&excludeids=' . implode(
',', $excludeids)) . ($showtype ?
'&showtype=' . urlencode((
string) ($showtype)) :
'') . ($showcode ?
'&showcode=' . urlencode((
string) ($showcode)) :
'');
1374 $out .=
'<!-- force css to be higher than dialog popup --><style type="text/css">.ui-autocomplete { z-index: 1010; }</style>';
1375 if (empty($hidelabel)) {
1376 $out .= $langs->trans(
"RefOrLabel") .
' : ';
1377 } elseif ($hidelabel == 1 && !is_numeric($showempty)) {
1378 $placeholder = $langs->trans($showempty);
1379 } elseif ($hidelabel > 1) {
1380 $placeholder = $langs->trans(
"RefOrLabel");
1381 if ($hidelabel == 2) {
1382 $out .=
img_picto($langs->trans(
"Search"),
'search');
1385 $out .=
'<input type="text" class="' . $morecss .
'" name="search_' . $htmlname .
'" id="search_' . $htmlname .
'" value="' . $selected_input_value .
'"' . ($placeholder ?
' placeholder="' .
dol_escape_htmltag($placeholder) .
'"' :
'') .
' ' . (
getDolGlobalString(
'THIRDPARTY_SEARCH_AUTOFOCUS') ?
'autofocus' :
'') .
' />';
1386 if ($hidelabel == 3) {
1387 $out .=
img_picto($langs->trans(
"Search"),
'search');
1392 $out .=
ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.
'/societe/ajax/company.php', $urloption,
getDolGlobalInt(
'COMPANY_USE_SEARCH_TO_SELECT'), 0, $ajaxoptions);
1395 $out .= $this->
select_thirdparty_list($selected, $htmlname, $filter, $showempty, $showtype, $forcecombo, $events,
'', 0, $limit, $morecss, $moreparam, $multiple, $excludeids, $showcode);
1429 public function select_contact($socid, $selected =
'', $htmlname =
'contactid', $showempty = 0, $exclude =
'', $limitto =
'', $showfunction = 0, $morecss =
'', $nokeyifsocid =
true, $showsoc = 0, $forcecombo = 0, $events = array(), $moreparam =
'', $htmlid =
'', $selected_input_value =
'', $filter =
'')
1433 global
$conf, $langs;
1438 if ($nokeyifsocid && $socid > 0) {
1439 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = 0;
1442 if (!empty(
$conf->use_javascript_ajax) &&
getDolGlobalString(
'CONTACT_USE_SEARCH_TO_SELECT') && !$forcecombo) {
1443 if (is_null($events)) {
1447 require_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
1451 if ($selected && empty($selected_input_value)) {
1452 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
1453 $contacttmp =
new Contact($this->db);
1454 $contacttmp->fetch($selected);
1455 $selected_input_value = $contacttmp->getFullName($langs);
1458 if (!is_numeric($showempty)) {
1459 $placeholder = $showempty;
1463 $urloption =
'htmlname=' . urlencode((
string) (str_replace(
'.',
'_', $htmlname))) .
'&outjson=1&filter=' . urlencode((
string) ($filter)) . (empty($exclude) ?
'' :
'&exclude=' . urlencode($exclude)) . ($showsoc ?
'&showsoc=' . urlencode((
string) ($showsoc)) :
'');
1465 $out .=
'<!-- force css to be higher than dialog popup --><style type="text/css">.ui-autocomplete { z-index: 1010; }</style>';
1467 $out .=
'<input type="text" class="' . $morecss .
'" name="search_' . $htmlname .
'" id="search_' . $htmlname .
'" value="' . $selected_input_value .
'"' . ($placeholder ?
' placeholder="' .
dol_escape_htmltag($placeholder) .
'"' :
'') .
' ' . (
getDolGlobalString(
'CONTACT_SEARCH_AUTOFOCUS') ?
'autofocus' :
'') .
' />';
1471 $out .=
ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.
'/contact/ajax/contact.php', $urloption,
getDolGlobalInt(
'CONTACT_USE_SEARCH_TO_SELECT'), 0, $events);
1475 $disableifempty = 0;
1479 $out .= $this->
selectcontacts($socid, $selected, $htmlname, $showempty, $exclude, $limitto, $showfunction, $morecss, $options_only, $showsoc, $forcecombo, $events, $moreparam, $htmlid, $multiple, $disableifempty);
1482 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = $sav;
1514 public function select_thirdparty_list($selected =
'', $htmlname =
'socid', $filter =
'', $showempty =
'', $showtype = 0, $forcecombo = 0, $events = array(), $filterkey =
'', $outputmode = 0, $limit = 0, $morecss =
'minwidth100', $moreparam =
'', $multiple =
false, $excludeids = array(), $showcode = 0)
1517 global $user, $langs;
1518 global $hookmanager;
1520 $langs->loadLangs(array(
"companies",
"suppliers"));
1524 $outarray = array();
1526 if ($selected ===
'') {
1527 $selected = array();
1528 } elseif (!is_array($selected)) {
1529 $selected = array($selected);
1533 if (function_exists(
'testSqlAndScriptInject')) {
1536 return 'SQLInjectionTryDetected';
1540 if ($filter !=
'') {
1541 if (preg_match(
'/[\(\)]/', $filter)) {
1547 if (function_exists(
'testSqlAndScriptInject')) {
1550 return 'SQLInjectionTryDetected';
1556 dol_syslog(
"Warning, select_thirdparty_list was called with a filter criteria not using the Universal Search Syntax.", LOG_WARNING);
1561 $sql =
"SELECT s.rowid, s.nom as name, s.name_alias, s.tva_intra, s.client, s.fournisseur, s.code_client, s.code_fournisseur";
1563 $sql .=
", s.address, s.zip, s.town";
1564 $sql .=
", dictp.code as country_code";
1566 $sql .=
" FROM " . $this->db->prefix() .
"societe as s";
1568 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"c_country as dictp ON dictp.rowid = s.fk_pays";
1570 if (!$user->hasRight(
'societe',
'client',
'voir')) {
1571 $sql .=
", " . $this->db->prefix() .
"societe_commerciaux as sc";
1573 $sql .=
" WHERE s.entity IN (" .
getEntity(
'societe') .
")";
1574 if (!empty($user->socid)) {
1575 $sql .=
" AND s.rowid = " . ((int) $user->socid);
1580 $sql .=
" AND (" . $filter .
")";
1582 if (!$user->hasRight(
'societe',
'client',
'voir')) {
1583 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = " . ((int) $user->id);
1586 $sql .=
" AND s.status <> 0";
1588 if (!empty($excludeids)) {
1589 $sql .=
" AND s.rowid NOT IN (" . $this->db->sanitize(implode(
',', $excludeids)) .
")";
1592 $parameters = array();
1593 $reshook = $hookmanager->executeHooks(
'selectThirdpartyListWhere', $parameters);
1594 $sql .= $hookmanager->resPrint;
1596 if ($filterkey && $filterkey !=
'') {
1600 $search_crit = explode(
' ', $filterkey);
1602 if (count($search_crit) > 1) {
1605 foreach ($search_crit as $crit) {
1609 $sql .=
"(s.nom LIKE '" . $this->db->escape($prefix . $crit) .
"%')";
1612 if (count($search_crit) > 1) {
1615 if (isModEnabled(
'barcode')) {
1616 $sql .=
" OR s.barcode LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
1618 $sql .=
" OR s.code_client LIKE '" . $this->db->escape($prefix . $filterkey) .
"%' OR s.code_fournisseur LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
1619 $sql .=
" OR s.name_alias LIKE '" . $this->db->escape($prefix . $filterkey) .
"%' OR s.tva_intra LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
1622 $sql .= $this->db->order(
"nom",
"ASC");
1623 $sql .= $this->db->plimit($limit, 0);
1626 dol_syslog(get_class($this).
"::select_thirdparty_list", LOG_DEBUG);
1627 $resql = $this->db->query($sql);
1630 $out .=
'<select id="' . $htmlname .
'" class="flat' . ($morecss ?
' ' . $morecss :
'') .
'"' . ($moreparam ?
' ' . $moreparam :
'') .
' name="' . $htmlname . ($multiple ?
'[]' :
'') .
'" ' . ($multiple ?
'multiple' :
'') .
'>' .
"\n";
1632 $textifempty = (($showempty && !is_numeric($showempty)) ? $langs->trans($showempty) :
'');
1636 if ($showempty && !is_numeric($showempty)) {
1637 $textifempty = $langs->trans($showempty);
1639 $textifempty .= $langs->trans(
"All");
1643 $out .=
'<option value="-1" data-html="' .
dol_escape_htmltag(
'<span class="opacitymedium">' . ($textifempty ? $textifempty :
' ') .
'</span>') .
'">' . $textifempty .
'</option>' .
"\n";
1646 $companytemp =
new Societe($this->db);
1648 $num = $this->db->num_rows($resql);
1652 $obj = $this->db->fetch_object($resql);
1655 if (($obj->client) && (!empty($obj->code_client))) {
1656 $label = $obj->code_client .
' - ';
1658 if (($obj->fournisseur) && (!empty($obj->code_fournisseur))) {
1659 $label .= $obj->code_fournisseur .
' - ';
1661 $label .=
' ' . $obj->name;
1663 $label = $obj->name;
1666 if (!empty($obj->name_alias)) {
1667 $label .=
' (' . $obj->name_alias .
')';
1671 $label .=
' - '.$obj->tva_intra;
1674 $labelhtml = $label;
1677 $companytemp->id = $obj->rowid;
1678 $companytemp->client = $obj->client;
1679 $companytemp->fournisseur = $obj->fournisseur;
1680 $tmptype = $companytemp->getTypeUrl(1,
'', 0,
'span');
1682 $labelhtml .=
' ' . $tmptype;
1685 if ($obj->client || $obj->fournisseur) {
1688 if ($obj->client == 1 || $obj->client == 3) {
1689 $label .= $langs->trans(
"Customer");
1691 if ($obj->client == 2 || $obj->client == 3) {
1692 $label .= ($obj->client == 3 ?
', ' :
'') . $langs->trans(
"Prospect");
1694 if ($obj->fournisseur) {
1695 $label .= ($obj->client ?
', ' :
'') . $langs->trans(
"Supplier");
1697 if ($obj->client || $obj->fournisseur) {
1703 $s = ($obj->address ?
' - ' . $obj->address :
'') . ($obj->zip ?
' - ' . $obj->zip :
'') . ($obj->town ?
' ' . $obj->town :
'');
1704 if (!empty($obj->country_code)) {
1705 $s .=
', ' . $langs->trans(
'Country' . $obj->country_code);
1711 if (empty($outputmode)) {
1712 if (in_array($obj->rowid, $selected)) {
1713 $out .=
'<option value="' . $obj->rowid .
'" selected data-html="' .
dol_escape_htmltag($labelhtml, 0, 0,
'', 0, 1) .
'">' .
dol_escape_htmltag($label, 0, 0,
'', 0, 1) .
'</option>';
1715 $out .=
'<option value="' . $obj->rowid .
'" data-html="' .
dol_escape_htmltag($labelhtml, 0, 0,
'', 0, 1) .
'">' .
dol_escape_htmltag($label, 0, 0,
'', 0, 1) .
'</option>';
1718 array_push($outarray, array(
'key' => $obj->rowid,
'value' => $label,
'label' => $label,
'labelhtml' => $labelhtml));
1722 if (($i % 10) == 0) {
1727 $out .=
'</select>' .
"\n";
1729 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
1736 $this->result = array(
'nbofthirdparties' => $num);
1770 public function selectcontacts($socid, $selected = array(), $htmlname =
'contactid', $showempty = 0, $exclude =
'', $limitto =
'', $showfunction = 0, $morecss =
'', $options_only = 0, $showsoc = 0, $forcecombo = 0, $events = array(), $moreparam =
'', $htmlid =
'', $multiple =
false, $disableifempty = 0, $filter =
'')
1772 global
$conf, $user, $langs, $hookmanager, $action;
1774 $langs->load(
'companies');
1776 if (empty($htmlid)) {
1777 $htmlid = $htmlname;
1781 $outarray = array();
1783 if ($selected ===
'') {
1784 $selected = array();
1785 } elseif (!is_array($selected)) {
1786 $selected = array((
int) $selected);
1790 if (function_exists(
'testSqlAndScriptInject')) {
1793 return 'SQLInjectionTryDetected';
1797 if ($filter !=
'') {
1798 if (preg_match(
'/[\(\)]/', $filter)) {
1804 if (function_exists(
'testSqlAndScriptInject')) {
1807 return 'SQLInjectionTryDetected';
1813 dol_syslog(
"Warning, select_thirdparty_list was called with a filter criteria not using the Universal Search Filter Syntax.", LOG_WARNING);
1817 if (!is_object($hookmanager)) {
1818 include_once DOL_DOCUMENT_ROOT .
'/core/class/hookmanager.class.php';
1823 $sql =
"SELECT sp.rowid, sp.lastname, sp.statut, sp.firstname, sp.poste, sp.email, sp.phone, sp.phone_perso, sp.phone_mobile, sp.town AS contact_town";
1824 if ($showsoc > 0 ||
getDolGlobalString(
'CONTACT_SHOW_EMAIL_PHONE_TOWN_SELECTLIST')) {
1825 $sql .=
", s.nom as company, s.town AS company_town";
1827 $sql .=
" FROM " . $this->db->prefix() .
"socpeople as sp";
1828 if ($showsoc > 0 ||
getDolGlobalString(
'CONTACT_SHOW_EMAIL_PHONE_TOWN_SELECTLIST')) {
1829 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"societe as s ON s.rowid = sp.fk_soc";
1831 $sql .=
" WHERE sp.entity IN (" .
getEntity(
'contact') .
")";
1832 $sql .=
" AND ((sp.fk_user_creat = ".((int) $user->id).
" AND sp.priv = 1) OR sp.priv = 0)";
1833 if ($socid > 0 || $socid == -1) {
1834 $sql .=
" AND sp.fk_soc = " . ((int) $socid);
1837 $sql .=
" AND sp.statut <> 0";
1840 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
1841 $sql .=
" AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = sp.fk_soc AND sc.fk_user = ".(int) $user->id .
")";
1843 if ($user->socid > 0) {
1844 $sql .=
" AND sp.fk_soc = ".((int) $user->socid);
1849 $sql .=
" AND (" . $filter .
")";
1852 $parameters = array();
1853 $reshook = $hookmanager->executeHooks(
'selectContactListWhere', $parameters);
1854 $sql .= $hookmanager->resPrint;
1855 $sql .=
" ORDER BY sp.lastname ASC";
1857 dol_syslog(get_class($this) .
"::selectcontacts", LOG_DEBUG);
1858 $resql = $this->db->query($sql);
1860 $num = $this->db->num_rows($resql);
1862 if ($htmlname !=
'none' && !$options_only) {
1863 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" id="' . $htmlid .
'" name="' . $htmlname . ($multiple ?
'[]' :
'') .
'" ' . (($num || empty($disableifempty)) ?
'' :
' disabled') . ($multiple ?
'multiple' :
'') .
' ' . (!empty($moreparam) ? $moreparam :
'') .
'>';
1866 if ($showempty && !is_numeric($showempty)) {
1867 $textforempty = $showempty;
1868 $out .=
'<option class="optiongrey" value="-1"' . (in_array(-1, $selected) ?
' selected' :
'') .
'>' . $textforempty .
'</option>';
1870 if (($showempty == 1 || ($showempty == 3 && $num > 1)) && !$multiple) {
1871 $out .=
'<option value="0"' . (in_array(0, $selected) ?
' selected' :
'') .
'> </option>';
1873 if ($showempty == 2) {
1874 $out .=
'<option value="0"' . (in_array(0, $selected) ?
' selected' :
'') .
'>-- ' . $langs->trans(
"Internal") .
' --</option>';
1880 include_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
1881 $contactstatic =
new Contact($this->db);
1884 $obj = $this->db->fetch_object($resql);
1887 $extendedInfos =
'';
1889 $extendedInfos = array();
1890 $email = trim($obj->email);
1891 if (!empty($email)) {
1892 $extendedInfos[] = $email;
1894 $phone = trim($obj->phone);
1895 $phone_perso = trim($obj->phone_perso);
1896 $phone_mobile = trim($obj->phone_mobile);
1897 if (!empty($phone)) {
1898 $extendedInfos[] = $phone;
1900 if (!empty($phone_perso)) {
1901 $extendedInfos[] = $phone_perso;
1903 if (!empty($phone_mobile)) {
1904 $extendedInfos[] = $phone_mobile;
1907 $contact_town = trim($obj->contact_town);
1908 $company_town = trim($obj->company_town);
1909 if (!empty($contact_town)) {
1910 $extendedInfos[] = $contact_town;
1911 } elseif (!empty($company_town)) {
1912 $extendedInfos[] = $company_town;
1914 $extendedInfos = implode(
' - ', $extendedInfos);
1915 if (!empty($extendedInfos)) {
1916 $extendedInfos =
' - ' . $extendedInfos;
1920 $contactstatic->id = $obj->rowid;
1921 $contactstatic->lastname = $obj->lastname;
1922 $contactstatic->firstname = $obj->firstname;
1923 if ($obj->statut == 1) {
1925 if ($htmlname !=
'none') {
1927 if (is_array($exclude) && count($exclude) && in_array($obj->rowid, $exclude)) {
1930 if (is_array($limitto) && count($limitto) && !in_array($obj->rowid, $limitto)) {
1933 if (!empty($selected) && in_array($obj->rowid, $selected)) {
1934 $out .=
'<option value="' . $obj->rowid .
'"';
1936 $out .=
' disabled';
1938 $out .=
' selected>';
1940 $tmplabel = $contactstatic->getFullName($langs) . $extendedInfos;
1941 if ($showfunction && $obj->poste) {
1942 $tmplabel .=
' (' . $obj->poste .
')';
1944 if (($showsoc > 0) && $obj->company) {
1945 $tmplabel .=
' - (' . $obj->company .
')';
1949 $out .=
'</option>';
1951 $out .=
'<option value="' . $obj->rowid .
'"';
1953 $out .=
' disabled';
1957 $tmplabel = $contactstatic->getFullName($langs) . $extendedInfos;
1958 if ($showfunction && $obj->poste) {
1959 $tmplabel .=
' (' . $obj->poste .
')';
1961 if (($showsoc > 0) && $obj->company) {
1962 $tmplabel .=
' - (' . $obj->company .
')';
1966 $out .=
'</option>';
1969 if (in_array($obj->rowid, $selected)) {
1970 $tmplabel = $contactstatic->getFullName($langs) . $extendedInfos;
1971 if ($showfunction && $obj->poste) {
1972 $tmplabel .=
' (' . $obj->poste .
')';
1974 if (($showsoc > 0) && $obj->company) {
1975 $tmplabel .=
' - (' . $obj->company .
')';
1982 if ($tmplabel !=
'') {
1983 array_push($outarray, array(
'key' => $obj->rowid,
'value' => $tmplabel,
'label' => $tmplabel,
'labelhtml' => $tmplabel));
1989 $labeltoshow = ($socid != -1) ? ($langs->trans($socid ?
"NoContactDefinedForThirdParty" :
"NoContactDefined")) : $langs->trans(
'SelectAThirdPartyFirst');
1990 $out .=
'<option class="disabled" value="-1"' . (($showempty == 2 || $multiple) ?
'' :
' selected') .
' disabled="disabled">';
1991 $out .= $labeltoshow;
1992 $out .=
'</option>';
1995 $parameters = array(
1997 'htmlname' => $htmlname,
2000 'showfunction' => $showfunction,
2001 'showsoc' => $showsoc,
2004 $reshook = $hookmanager->executeHooks(
'afterSelectContactOptions', $parameters, $this, $action);
2006 if ($htmlname !=
'none' && !$options_only) {
2007 $out .=
'</select>';
2010 if (
$conf->use_javascript_ajax && !$forcecombo && !$options_only) {
2011 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
2017 if ($options_only === 2) {
2045 global $langs,
$conf;
2048 $sql =
"SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc,";
2049 $sql .=
" re.description, re.fk_facture_source";
2050 $sql .=
" FROM " . $this->db->prefix() .
"societe_remise_except as re";
2051 $sql .=
" WHERE re.fk_soc = " . (int) $socid;
2052 $sql .=
" AND re.entity = " .
$conf->entity;
2054 $sql .=
" AND " . $filter;
2056 $sql .=
" ORDER BY re.description ASC";
2058 dol_syslog(get_class($this) .
"::select_remises", LOG_DEBUG);
2059 $resql = $this->db->query($sql);
2061 print
'<select id="select_' . $htmlname .
'" class="flat maxwidthonsmartphone" name="' . $htmlname .
'">';
2062 $num = $this->db->num_rows($resql);
2064 $qualifiedlines = $num;
2068 print
'<option value="0"> </option>';
2070 $obj = $this->db->fetch_object($resql);
2071 $desc =
dol_trunc($obj->description, 40);
2072 if (preg_match(
'/\(CREDIT_NOTE\)/', $desc)) {
2073 $desc = preg_replace(
'/\(CREDIT_NOTE\)/', $langs->trans(
"CreditNote"), $desc);
2075 if (preg_match(
'/\(DEPOSIT\)/', $desc)) {
2076 $desc = preg_replace(
'/\(DEPOSIT\)/', $langs->trans(
"Deposit"), $desc);
2078 if (preg_match(
'/\(EXCESS RECEIVED\)/', $desc)) {
2079 $desc = preg_replace(
'/\(EXCESS RECEIVED\)/', $langs->trans(
"ExcessReceived"), $desc);
2081 if (preg_match(
'/\(EXCESS PAID\)/', $desc)) {
2082 $desc = preg_replace(
'/\(EXCESS PAID\)/', $langs->trans(
"ExcessPaid"), $desc);
2086 if ($selected > 0 && $selected == $obj->rowid) {
2087 $selectstring =
' selected';
2091 if ($maxvalue > 0 && $obj->amount_ttc > $maxvalue) {
2093 $disabled =
' disabled';
2096 if (
getDolGlobalString(
'MAIN_SHOW_FACNUMBER_IN_DISCOUNT_LIST') && !empty($obj->fk_facture_source)) {
2097 $tmpfac =
new Facture($this->db);
2098 if ($tmpfac->fetch($obj->fk_facture_source) > 0) {
2099 $desc = $desc .
' - ' . $tmpfac->ref;
2103 print
'<option value="' . $obj->rowid .
'"' . $selectstring . $disabled .
'>' . $desc .
' (' .
price($obj->amount_ht) .
' ' . $langs->trans(
"HT") .
' - ' .
price($obj->amount_ttc) .
' ' . $langs->trans(
"TTC") .
')</option>';
2110 return $qualifiedlines;
2135 public function select_users($selected =
'', $htmlname =
'userid', $show_empty = 0, $exclude =
null, $disabled = 0, $include =
'', $enableonly = array(), $force_entity =
'0')
2138 print $this->
select_dolusers($selected, $htmlname, $show_empty, $exclude, $disabled, $include, $enableonly, $force_entity);
2167 public function select_dolusers($selected =
'', $htmlname =
'userid', $show_empty = 0, $exclude =
null, $disabled = 0, $include =
'', $enableonly =
'', $force_entity =
'', $maxlength = 0, $showstatus = 0, $morefilter =
'', $showalso = 0, $enableonlytext =
'', $morecss =
'', $notdisabled = 0, $outputmode = 0, $multiple =
false, $forcecombo = 0)
2170 global
$conf, $user, $langs, $hookmanager;
2174 if ((is_numeric($selected) && ($selected < -3 || empty($selected))) && !
getDolGlobalString(
'SOCIETE_DISABLE_DEFAULT_SALESREPRESENTATIVE')) {
2175 $selected = $user->id;
2178 if ($selected ===
'') {
2179 $selected = array();
2180 } elseif (!is_array($selected)) {
2181 $selected = array($selected);
2185 $excludeUsers =
null;
2186 if (is_array($exclude)) {
2187 $excludeUsers = implode(
",", $exclude);
2191 $includeUsers =
null;
2192 $includeUsersArray = array();
2193 if (is_array($include)) {
2194 $includeUsersArray = $include;
2195 } elseif ($include ==
'hierarchy') {
2197 $includeUsersArray = $user->getAllChildIds(0);
2198 } elseif ($include ==
'hierarchyme') {
2200 $includeUsersArray = $user->getAllChildIds(1);
2215 $includeUsers = implode(
",", $includeUsersArray);
2220 $outarray = array();
2221 $outarray2 = array();
2224 $showlabelofentity = isModEnabled(
'multicompany') && !
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE') &&
$conf->entity == 1 && !empty($user->admin) && empty($user->entity) && !preg_match(
'/^search_/', $htmlname);
2225 $userissuperadminentityone = isModEnabled(
'multicompany') &&
$conf->entity == 1 && $user->admin && empty($user->entity);
2228 $sql =
"SELECT DISTINCT u.rowid, u.lastname as lastname, u.firstname, u.statut as status, u.login, u.admin, u.entity, u.gender, u.photo";
2229 if ($showlabelofentity) {
2230 $sql .=
", e.label";
2232 $sql .=
" FROM " . $this->db->prefix() .
"user as u";
2233 if ($showlabelofentity) {
2234 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"entity as e ON e.rowid = u.entity";
2237 if ($userissuperadminentityone && $force_entity !==
'default') {
2238 if (!empty($force_entity)) {
2239 $sql .=
" WHERE u.entity IN (0, " . $this->db->sanitize($force_entity) .
")";
2241 $sql .=
" WHERE u.entity IS NOT NULL";
2244 if (isModEnabled(
'multicompany') &&
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE')) {
2245 $sql .=
" WHERE u.rowid IN (SELECT ug.fk_user FROM ".$this->db->prefix().
"usergroup_user as ug WHERE ug.entity IN (".
getEntity(
'usergroup').
"))";
2247 $sql .=
" WHERE u.entity IN (" .
getEntity(
'user') .
")";
2251 if (!empty($user->socid)) {
2252 $sql .=
" AND u.fk_soc = " . ((int) $user->socid);
2254 if (is_array($exclude) && $excludeUsers) {
2255 $sql .=
" AND u.rowid NOT IN (" . $this->db->sanitize($excludeUsers) .
")";
2257 if ($includeUsers) {
2258 $sql .=
" AND u.rowid IN (" . $this->db->sanitize($includeUsers) .
")";
2261 $sql .=
" AND u.statut <> 0";
2264 $sql .=
" AND u.employee <> 0";
2267 $sql .=
" AND u.fk_soc IS NULL";
2269 if (!empty($morefilter)) {
2272 if ($errormessage) {
2273 $this->errors[] = $errormessage;
2274 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
2275 if ($outputmode == 0) {
2276 return 'Error bad param $morefilter';
2284 $reshook = $hookmanager->executeHooks(
'addSQLWhereFilterOnSelectUsers', array(), $this, $action);
2285 if (!empty($reshook)) {
2286 $sql .= $hookmanager->resPrint;
2290 $sql .=
" ORDER BY u.statut DESC, u.firstname ASC, u.lastname ASC";
2292 $sql .=
" ORDER BY u.statut DESC, u.lastname ASC, u.firstname ASC";
2295 dol_syslog(get_class($this) .
"::select_dolusers", LOG_DEBUG);
2297 $resql = $this->db->query($sql);
2299 $num = $this->db->num_rows($resql);
2303 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
' minwidth200') .
'" id="' . $htmlname .
'" name="' . $htmlname . ($multiple ?
'[]' :
'') .
'" ' . ($multiple ?
'multiple' :
'') .
' ' . ($disabled ?
' disabled' :
'') .
'>';
2304 if ($show_empty && !$multiple) {
2305 $textforempty =
' ';
2306 if (!empty(
$conf->use_javascript_ajax)) {
2307 $textforempty =
' ';
2309 if (!is_numeric($show_empty)) {
2310 $textforempty = $show_empty;
2312 $out .=
'<option class="optiongrey" value="' . ($show_empty < 0 ? $show_empty : -1) .
'"' . ((empty($selected) || in_array(-1, $selected)) ?
' selected' :
'') .
'>' . $textforempty .
'</option>' .
"\n";
2314 $outarray[($show_empty < 0 ? $show_empty : -1)] = $textforempty;
2315 $outarray2[($show_empty < 0 ? $show_empty : -1)] = array(
2316 'id' => ($show_empty < 0 ? $show_empty : -1),
2317 'label' => $textforempty,
2318 'labelhtml' => $textforempty,
2323 if ($showalso == 2 || $showalso == 3) {
2324 $out .=
'<option value="-3"' . ((in_array(-3, $selected)) ?
' selected' :
'') .
'>-- ' . $langs->trans(
"MyTeam") .
' --</option>' .
"\n";
2326 $hasAtLeastOneSubordinate = (count($user->getAllChildIds(1)) > 1);
2327 if ($hasAtLeastOneSubordinate) {
2329 $outarray[-3] =
'-- ' . $langs->trans(
"MyTeam") .
' --';
2330 $outarray2[-3] = array(
2332 'label' =>
'-- ' . $langs->trans(
"MyTeam") .
' --',
2333 'labelhtml' =>
'-- ' . $langs->trans(
"MyTeam") .
' --',
2339 if ($showalso == 1 || $showalso == 3) {
2340 $out .=
'<option value="-2"' . ((in_array(-2, $selected)) ?
' selected' :
'') .
'>-- ' . $langs->trans(
"Everybody") .
' --</option>' .
"\n";
2342 $outarray[-2] =
'-- ' . $langs->trans(
"Everybody") .
' --';
2343 $outarray2[-2] = array(
2345 'label' =>
'-- ' . $langs->trans(
"Everybody") .
' --',
2346 'labelhtml' =>
'-- ' . $langs->trans(
"Everybody") .
' --',
2352 $userstatic =
new User($this->db);
2355 $obj = $this->db->fetch_object($resql);
2357 $userstatic->id = $obj->rowid;
2358 $userstatic->lastname = $obj->lastname;
2359 $userstatic->firstname = $obj->firstname;
2360 $userstatic->photo = $obj->photo;
2361 $userstatic->status = $obj->status;
2362 $userstatic->entity = $obj->entity;
2363 $userstatic->admin = $obj->admin;
2364 $userstatic->gender = $obj->gender;
2367 if (is_array($enableonly) && count($enableonly) && !in_array($obj->rowid, $enableonly)) {
2368 $disableline = ($enableonlytext ? $enableonlytext :
'1');
2372 $labeltoshowhtml =
'';
2379 $labeltoshow .= $userstatic->getFullName($langs, $fullNameMode, -1, $maxlength);
2380 $labeltoshowhtml .= $userstatic->getFullName($langs, $fullNameMode, -1, $maxlength);
2381 if (empty($obj->firstname) && empty($obj->lastname)) {
2382 $labeltoshow .= $obj->login;
2383 $labeltoshowhtml .= $obj->login;
2390 $moreinfo .= ($moreinfo ?
' - ' :
' (');
2391 $moreinfohtml .= ($moreinfohtml ?
' - ' :
' <span class="opacitymedium">(');
2392 $moreinfo .= $obj->login;
2393 $moreinfohtml .= $obj->login;
2395 if ($showstatus >= 0) {
2396 if ($obj->status == 1 && $showstatus == 1) {
2397 $moreinfo .= ($moreinfo ?
' - ' :
' (') . $langs->trans(
'Enabled');
2398 $moreinfohtml .= ($moreinfohtml ?
' - ' :
' <span class="opacitymedium">(') . $langs->trans(
'Enabled');
2400 if ($obj->status == 0 && $showstatus == 1) {
2401 $moreinfo .= ($moreinfo ?
' - ' :
' (') . $langs->trans(
'Disabled');
2402 $moreinfohtml .= ($moreinfohtml ?
' - ' :
' <span class="opacitymedium">(') . $langs->trans(
'Disabled');
2405 if ($showlabelofentity) {
2406 if (empty($obj->entity)) {
2407 $moreinfo .= ($moreinfo ?
' - ' :
' (') . $langs->trans(
"AllEntities");
2408 $moreinfohtml .= ($moreinfohtml ?
' - ' :
' <span class="opacitymedium">(') . $langs->trans(
"AllEntities");
2410 if ($obj->entity !=
$conf->entity) {
2411 $moreinfo .= ($moreinfo ?
' - ' :
' (') . ($obj->label ? $obj->label : $langs->trans(
"EntityNameNotDefined"));
2412 $moreinfohtml .= ($moreinfohtml ?
' - ' :
' <span class="opacitymedium">(').($obj->label ? $obj->label : $langs->trans(
"EntityNameNotDefined"));
2416 $moreinfo .= (!empty($moreinfo) ?
')' :
'');
2417 $moreinfohtml .= (!empty($moreinfohtml) ?
')</span>' :
'');
2418 if (!empty($disableline) && $disableline !=
'1') {
2420 $moreinfo .=
' - ' . $disableline;
2421 $moreinfohtml .=
' - ' . $disableline;
2423 $labeltoshow .= $moreinfo;
2424 $labeltoshowhtml .= $moreinfohtml;
2426 $out .=
'<option value="' . $obj->rowid .
'"';
2427 if (!empty($disableline)) {
2428 $out .=
' disabled';
2430 if ((!empty($selected[0]) && is_object($selected[0])) ? $selected[0]->id == $obj->rowid : in_array($obj->rowid, $selected)) {
2431 $out .=
' selected';
2433 $out .=
' data-html="';
2435 $outhtml = $userstatic->getNomUrl(-3,
'', 0, 1, 24, 1,
'login',
'', 1) .
' ';
2436 if ($showstatus >= 0 && $obj->status == 0) {
2437 $outhtml .=
'<strike class="opacitymediumxxx">';
2439 $outhtml .= $labeltoshowhtml;
2440 if ($showstatus >= 0 && $obj->status == 0) {
2441 $outhtml .=
'</strike>';
2443 $labeltoshowhtml = $outhtml;
2447 $out .= $labeltoshow;
2448 $out .=
'</option>';
2450 $outarray[$userstatic->id] = $userstatic->getFullName($langs, $fullNameMode, -1, $maxlength) . $moreinfo;
2451 $outarray2[$userstatic->id] = array(
2452 'id' => $userstatic->id,
2453 'label' => $labeltoshow,
2454 'labelhtml' => $labeltoshowhtml,
2462 $out .=
'<select class="flat" id="' . $htmlname .
'" name="' . $htmlname .
'" disabled>';
2463 $out .=
'<option value="">' . $langs->trans(
"None") .
'</option>';
2465 $out .=
'</select>';
2467 if ($num && !$forcecombo) {
2469 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
2478 if ($outputmode == 2) {
2480 } elseif ($outputmode) {
2512 public function select_dolusers_forevent($action =
'', $htmlname =
'userid', $show_empty = 0, $exclude =
null, $disabled = 0, $include = array(), $enableonly = array(), $force_entity =
'0', $maxlength = 0, $showstatus = 0, $morefilter =
'', $showproperties = 0, $listofuserid = array(), $listofcontactid = array(), $listofotherid = array(), $canremoveowner = 1)
2515 global $langs, $user;
2517 $userstatic =
new User($this->db);
2520 if (!empty($_SESSION[
'assignedtouser'])) {
2521 $assignedtouser = json_decode($_SESSION[
'assignedtouser'],
true);
2522 if (!is_array($assignedtouser)) {
2523 $assignedtouser = array();
2526 $assignedtouser = array();
2528 $nbassignetouser = count($assignedtouser);
2531 if ($nbassignetouser) {
2532 $out .=
'<ul class="attendees">';
2536 foreach ($assignedtouser as $key => $value) {
2537 if ($value[
'id'] == $ownerid) {
2542 $userstatic->fetch($value[
'id']);
2543 $out .= $userstatic->getNomUrl(-1);
2545 $ownerid = $value[
'id'];
2546 $out .=
' (' . $langs->trans(
"Owner") .
')';
2549 if ($nbassignetouser > 1 && $action !=
'view') {
2550 $canremoveassignee = 1;
2553 if (!$canremoveowner) {
2554 $canremoveassignee = 0;
2556 if (!$user->hasRight(
'agenda',
'allactions',
'create')) {
2557 $canremoveassignee = 0;
2562 if ($canremoveassignee) {
2565 $out .=
' <input type="image" style="border: 0px;" src="' .
img_picto($langs->trans(
"Remove"),
'delete',
'', 0, 1) .
'" value="' . $userstatic->id .
'" class="removedassigned reposition" id="removedassigned_' . $userstatic->id .
'" name="removedassigned_' . $userstatic->id .
'">';
2569 if ($showproperties) {
2570 if ($ownerid == $value[
'id'] && is_array($listofuserid) && count($listofuserid) && in_array($ownerid, array_keys($listofuserid))) {
2571 $out .=
'<div class="myavailability inline-block">';
2572 $out .=
'<span class="hideonsmartphone"> - ';
2575 $out .=
' <input title="'.$langs->trans(
"Availability").
'" id="transparency" class="paddingrightonly" ' . ($action ==
'view' ?
'disabled' :
'') .
' type="checkbox" name="transparency"' . ($listofuserid[$ownerid][
'transparency'] ?
' checked' :
'') .
'><label for="transparency">' . $langs->trans(
"Busy") .
'</label>';
2585 if ($nbassignetouser) {
2590 if ($action !=
'view') {
2591 $out .=
'<input type="hidden" class="removedassignedhidden" name="removedassigned" value="">';
2592 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">jQuery(document).ready(function () {';
2593 $out .=
'jQuery(".removedassigned").click(function() { jQuery(".removedassignedhidden").val(jQuery(this).val()); });';
2594 $out .=
'jQuery(".assignedtouser").change(function() { console.log(jQuery(".assignedtouser option:selected").val());';
2595 $out .=
' if (jQuery(".assignedtouser option:selected").val() > 0) { jQuery("#' . $action .
'assignedtouser").attr("disabled", false); }';
2596 $out .=
' else { jQuery("#' . $action .
'assignedtouser").attr("disabled", true); }';
2598 $out .=
'})</script>';
2599 $out .= $this->
select_dolusers(
'', $htmlname, $show_empty, $exclude, $disabled, $include, $enableonly, $force_entity, $maxlength, $showstatus, $morefilter);
2600 $out .=
' <input type="submit" disabled class="button valignmiddle smallpaddingimp reposition" id="' . $action .
'assignedtouser" name="' . $action .
'assignedtouser" value="' .
dol_escape_htmltag($langs->trans(
"Add")) .
'">';
2627 public function select_dolresources_forevent($action =
'', $htmlname =
'userid', $show_empty = 0, $exclude =
null, $disabled = 0, $include = array(), $enableonly = array(), $force_entity =
'0', $maxlength = 0, $showstatus = 0, $morefilter =
'', $showproperties = 0, $listofresourceid = array())
2632 require_once DOL_DOCUMENT_ROOT.
'/resource/class/html.formresource.class.php';
2633 require_once DOL_DOCUMENT_ROOT.
'/resource/class/dolresource.class.php';
2638 if (!empty($_SESSION[
'assignedtoresource'])) {
2639 $assignedtoresource = json_decode($_SESSION[
'assignedtoresource'],
true);
2640 if (!is_array($assignedtoresource)) {
2641 $assignedtoresource = array();
2644 $assignedtoresource = array();
2646 $nbassignetoresource = count($assignedtoresource);
2649 if ($nbassignetoresource) {
2650 $out .=
'<ul class="attendees">';
2654 foreach ($assignedtoresource as $key => $value) {
2656 $resourcestatic->fetch($value[
'id']);
2657 $out .= $resourcestatic->getNomUrl(-1);
2658 if ($nbassignetoresource >= 1 && $action !=
'view') {
2659 $out .=
' <input type="image" style="border: 0px;" src="' .
img_picto($langs->trans(
"Remove"),
'delete',
'', 0, 1) .
'" value="' . $resourcestatic->id .
'" class="removedassignedresource reposition" id="removedassignedresource_' . $resourcestatic->id .
'" name="removedassignedresource_' . $resourcestatic->id .
'">';
2662 if ($showproperties) {
2663 if (is_array($listofresourceid) && count($listofresourceid)) {
2664 $out .=
'<div class="myavailability inline-block">';
2665 $out .=
'<span class="hideonsmartphone"> - ';
2668 $out .=
' <input title="'.$langs->trans(
"Availability").
'" id="transparencyresource'.$value[
'id'].
'" class="paddingrightonly" ' . ($action ==
'view' ?
'disabled' :
'') .
' type="checkbox" name="transparency"' . ($listofresourceid[$value[
'id']][
'transparency'] ?
' checked' :
'') .
'><label for="transparencyresource'.$value[
'id'].
'">' . $langs->trans(
"Busy") .
'</label>';
2678 if ($nbassignetoresource) {
2683 if ($action !=
'view') {
2684 $out .=
'<input type="hidden" class="removedassignedresourcehidden" name="removedassignedresource" value="">';
2685 $out .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">jQuery(document).ready(function () {';
2686 $out .=
'jQuery(".removedassignedresource").click(function() { jQuery(".removedassignedresourcehidden").val(jQuery(this).val()); });';
2687 $out .=
'jQuery(".assignedtoresource").change(function() { console.log(jQuery(".assignedtoresource option:selected").val());';
2688 $out .=
' if (jQuery(".assignedtoresource option:selected").val() > 0) { jQuery("#' . $action .
'assignedtoresource").attr("disabled", false); }';
2689 $out .=
' else { jQuery("#' . $action .
'assignedtoresource").attr("disabled", true); }';
2691 $out .=
'})</script>';
2694 $out .=
img_picto(
'',
'resource',
'class="pictofixedwidth"');
2695 $out .= $formresources->select_resource_list(0, $htmlname,
'', 1, 1, 0, $events,
'', 2, 0);
2697 $out .=
' <input type="submit" disabled class="button valignmiddle smallpaddingimp reposition" id="' . $action .
'assignedtoresource" name="' . $action .
'assignedtoresource" value="' .
dol_escape_htmltag($langs->trans(
"Add")) .
'">';
2735 public function select_produits($selected = 0, $htmlname =
'productid', $filtertype =
'', $limit = 0, $price_level = 0, $status = 1, $finished = 2, $selected_input_value =
'', $hidelabel = 0, $ajaxoptions = array(), $socid = 0, $showempty =
'1', $forcecombo = 0, $morecss =
'', $hidepriceinlabel = 0, $warehouseStatus =
'', $selected_combinations =
null, $nooutput = 0, $status_purchase = -1, $warehouseId = 0)
2738 global $langs,
$conf;
2743 $price_level = (!empty($price_level) ? $price_level : 0);
2744 if (is_null($ajaxoptions)) {
2745 $ajaxoptions = array();
2748 if (strval($filtertype) ===
'' && (isModEnabled(
"product") || isModEnabled(
"service"))) {
2749 if (isModEnabled(
"product") && !isModEnabled(
'service')) {
2751 } elseif (!isModEnabled(
'product') && isModEnabled(
"service")) {
2757 $placeholder = (is_numeric($showempty) ?
'' :
'placeholder="'.dolPrintHTML($showempty).
'"');
2759 if ($selected && empty($selected_input_value)) {
2760 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
2761 $producttmpselect =
new Product($this->db);
2762 $producttmpselect->fetch($selected);
2763 $selected_input_value = $producttmpselect->ref;
2764 unset($producttmpselect);
2767 if ($filtertype ==
'') {
2768 if (!isModEnabled(
'product')) {
2770 } elseif (!isModEnabled(
'service')) {
2775 $urloption = ($socid > 0 ?
'socid=' . $socid .
'&' :
'') .
'htmlname=' . $htmlname .
'&outjson=1&price_level=' . $price_level .
'&type=' . $filtertype .
'&mode=1&status=' . $status .
'&status_purchase=' . $status_purchase .
'&finished=' . $finished .
'&hidepriceinlabel=' . $hidepriceinlabel .
'&warehousestatus=' . $warehouseStatus;
2776 if ((
int) $warehouseId > 0) {
2777 $urloption .=
'&warehouseid=' . (int) $warehouseId;
2780 if (isModEnabled(
'variants') && is_array($selected_combinations)) {
2786 <!-- script to auto show attributes select tags if a variant was selected -->
2787 <script nonce="' .
getNonce() .
'">
2788 // auto show attributes fields
2789 selected = ' . json_encode($selected_combinations) .
';
2792 jQuery(document).ready(function () {
2794 jQuery("input[name=\'prod_entry_mode\']").change(function () {
2795 if (jQuery(this).val() == \'free\') {
2796 jQuery(\'div#attributes_box\').empty();
2800 jQuery("'.$htmltag.
'#' . $htmlname .
'").change(function () {
2802 if (!jQuery(this).val()) {
2803 jQuery(\'div#attributes_box\').empty();
2807 console.log("A change has started. We get variants fields to inject html select");
2809 jQuery.getJSON("' . DOL_URL_ROOT .
'/variants/ajax/getCombinations.php", {
2810 id: jQuery(this).val()
2811 }, function (data) {
2812 jQuery(\'div#attributes_box\').empty();
2814 jQuery.each(data, function (key, val) {
2816 combvalues[val.id] = val.values;
2818 var span = jQuery(document.createElement(\'div\')).css({
2819 \'display\': \'table-row\'
2823 jQuery(document.createElement(\'div\')).text(val.label).css({
2824 \'font-weight\': \'bold\',
2825 \'display\': \'table-cell\'
2829 var html = jQuery(document.createElement(\'select\')).attr(\'name\', \'combinations[\' + val.id + \']\').css({
2830 \'margin-left\': \'15px\',
2831 \'white-space\': \'pre\'
2833 jQuery(document.createElement(\'option\')).val(\'\')
2836 jQuery.each(combvalues[val.id], function (key, val) {
2837 var tag = jQuery(document.createElement(\'option\')).val(val.id).html(val.value);
2839 if (selected[val.fk_product_attribute] == val.id) {
2840 tag.attr(\'selected\', \'selected\');
2847 jQuery(\'div#attributes_box\').append(span);
2852 ' . ($selected ?
'jQuery("'.$htmltag.
'#' . $htmlname .
'").change();' :
'') .
'
2858 if (empty($hidelabel)) {
2860 } elseif ($hidelabel > 1) {
2862 if ($hidelabel == 2) {
2863 $out .=
img_picto($langs->trans(
"Search"),
'search');
2867 $out .=
'<input type="text" class="minwidth100' . ($morecss ?
' ' . $morecss :
'') .
'" name="search_' . $htmlname .
'" id="search_' . $htmlname .
'" value="' . $selected_input_value .
'"' . $placeholder .
' ' . (
getDolGlobalString(
'PRODUCT_SEARCH_AUTOFOCUS') ?
'autofocus' :
'') .
' />';
2868 if ($hidelabel == 3) {
2869 $out .=
img_picto($langs->trans(
"Search"),
'search');
2872 $out .=
ajax_autocompleter((
string) $selected, $htmlname, DOL_URL_ROOT .
'/product/ajax/products.php', $urloption,
getDolGlobalInt(
'PRODUIT_USE_SEARCH_TO_SELECT'),
getDolGlobalInt(
'PRODUCT_SEARCH_AUTO_SELECT_IF_ONLY_ONE', 1), $ajaxoptions);
2874 $out .= $this->
select_produits_list($selected, $htmlname, $filtertype, $limit, $price_level,
'', $status, $finished, 0, $socid, $showempty, $forcecombo, $morecss, $hidepriceinlabel, $warehouseStatus, $status_purchase, $warehouseId);
2876 if (isModEnabled(
'variants') && is_array($selected_combinations)) {
2880 $htmltag =
'select';
2882 <!-- script to auto show attributes select tags if a variant was selected -->
2883 <script nonce="' .
getNonce() .
'">
2884 // auto show attributes fields
2885 selected = ' . json_encode($selected_combinations) .
';
2888 jQuery(document).ready(function () {
2890 jQuery("input[name=\'prod_entry_mode\']").change(function () {
2891 if (jQuery(this).val() == \'free\') {
2892 jQuery(\'div#attributes_box\').empty();
2896 jQuery("'.$htmltag.
'#' . $htmlname .
'").change(function () {
2898 if (!jQuery(this).val()) {
2899 jQuery(\'div#attributes_box\').empty();
2903 console.log("A change has started. We get variants fields to inject html select");
2905 jQuery.getJSON("' . DOL_URL_ROOT .
'/variants/ajax/getCombinations.php", {
2906 id: jQuery(this).val()
2907 }, function (data) {
2908 jQuery(\'div#attributes_box\').empty();
2910 jQuery.each(data, function (key, val) {
2912 combvalues[val.id] = val.values;
2914 var span = jQuery(document.createElement(\'div\')).css({
2915 \'display\': \'table-row\'
2919 jQuery(document.createElement(\'div\')).text(val.label).css({
2920 \'font-weight\': \'bold\',
2921 \'display\': \'table-cell\'
2925 var html = jQuery(document.createElement(\'select\')).attr(\'name\', \'combinations[\' + val.id + \']\').css({
2926 \'margin-left\': \'15px\',
2927 \'white-space\': \'pre\'
2929 jQuery(document.createElement(\'option\')).val(\'\')
2932 jQuery.each(combvalues[val.id], function (key, val) {
2933 var tag = jQuery(document.createElement(\'option\')).val(val.id).html(val.value);
2935 if (selected[val.fk_product_attribute] == val.id) {
2936 tag.attr(\'selected\', \'selected\');
2943 jQuery(\'div#attributes_box\').append(span);
2948 ' . ($selected ?
'jQuery("'.$htmltag.
'#' . $htmlname .
'").change();' :
'') .
'
2955 if (empty($nooutput)) {
2979 public function select_bom($selected =
'', $htmlname =
'bom_id', $limit = 0, $status = 1, $type = 0, $showempty =
'1', $morecss =
'', $nooutput =
'', $forcecombo = 0, $TProducts = [])
2984 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
2990 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
2995 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'" id="' . $htmlname .
'">';
2997 $sql =
'SELECT b.rowid, b.ref, b.label as bomLabel, p.label as productLabel';
2998 $sql .=
' FROM ' . $this->db->prefix() .
'bom_bom as b';
2999 $sql .=
' INNER JOIN ' . $this->db->prefix() .
'product as p ON b.fk_product = p.rowid';
3000 $sql .=
' WHERE b.entity IN (' .
getEntity(
'bom') .
')';
3001 if (!empty($status)) {
3002 $sql .=
' AND status = ' . (int) $status;
3004 if (!empty($type)) {
3005 $sql .=
' AND bomtype = ' . (int) $type;
3007 if (!empty($TProducts)) {
3008 $sql .=
' AND fk_product IN (' . $this->db->sanitize(implode(
',', $TProducts)) .
')';
3010 if (!empty($limit)) {
3011 $sql .=
' LIMIT ' . (int) $limit;
3013 $resql = $db->query($sql);
3016 $out .=
'<option value="-1"';
3017 if (empty($selected)) {
3018 $out .=
' selected';
3020 $out .=
'> </option>';
3022 while ($obj = $db->fetch_object($resql)) {
3023 $out .=
'<option value="' . $obj->rowid .
'"';
3024 if ($obj->rowid == $selected) {
3027 $out .=
'>' . $obj->ref .
' - ' . $obj->productLabel .
' - ' . $obj->bomLabel .
'</option>';
3033 $out .=
'</select>';
3034 if (empty($nooutput)) {
3069 public function select_produits_list($selected = 0, $htmlname =
'productid', $filtertype =
'', $limit = 20, $price_level = 0, $filterkey =
'', $status = 1, $finished = 2, $outputmode = 0, $socid = 0, $showempty =
'1', $forcecombo = 0, $morecss =
'maxwidth500', $hidepriceinlabel = 0, $warehouseStatus =
'', $status_purchase = -1, $warehouseId = 0)
3073 global $hookmanager;
3076 $outarray = array();
3080 $langs->load(
'other');
3083 $warehouseStatusArray = array();
3084 if (!empty($warehouseStatus)) {
3085 require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
3086 if (preg_match(
'/warehouseclosed/', $warehouseStatus)) {
3089 if (preg_match(
'/warehouseopen/', $warehouseStatus)) {
3092 if (preg_match(
'/warehouseinternal/', $warehouseStatus)) {
3097 $selectFields =
" p.rowid, p.ref, p.label, p.description, p.barcode, p.fk_country, p.fk_product_type, p.price, p.price_ttc, p.price_base_type, p.tva_tx, p.default_vat_code, p.duration, p.fk_price_expression";
3098 if (count($warehouseStatusArray)) {
3099 $selectFieldsGrouped =
", sum(" . $this->db->ifsql(
"e.statut IS NULL",
"0",
"ps.reel") .
") as stock";
3101 $selectFieldsGrouped =
", " . $this->db->ifsql(
"p.stock IS NULL",
'0',
"p.stock") .
" AS stock";
3107 $parameters = array();
3108 $reshook = $hookmanager->executeHooks(
'selectProductsListSelect', $parameters);
3109 if (empty($reshook)) {
3110 $sql .= $selectFields.$selectFieldsGrouped.$hookmanager->resPrint;
3112 $sql .= $hookmanager->resPrint;
3117 $sql .=
", (SELECT " . $this->db->prefix() .
"categorie_product.fk_categorie
3118 FROM " . $this->db->prefix() .
"categorie_product
3119 WHERE " . $this->db->prefix() .
"categorie_product.fk_product=p.rowid
3121 ) AS categorie_product_id ";
3126 $sql .=
', pcp.rowid as idprodcustprice, pcp.price as custprice, pcp.price_ttc as custprice_ttc,';
3127 $sql .=
' pcp.price_base_type as custprice_base_type, pcp.tva_tx as custtva_tx, pcp.default_vat_code as custdefault_vat_code, pcp.ref_customer as custref, pcp.discount_percent as custdiscount_percent';
3128 $selectFields .=
", idprodcustprice, custprice, custprice_ttc, custprice_base_type, custtva_tx, custdefault_vat_code, custref, custdiscount_percent";
3132 $sql .=
", u.label as unit_long, u.short_label as unit_short, p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units, p.surface, p.surface_units, p.volume, p.volume_units";
3133 $selectFields .=
', unit_long, unit_short, p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units, p.surface, p.surface_units, p.volume, p.volume_units';
3138 $sql .=
", pl.label as label_translated";
3139 $sql .=
", pl.description as description_translated";
3140 $selectFields .=
", label_translated";
3141 $selectFields .=
", description_translated";
3145 $sql .=
", (SELECT pp.rowid FROM " . $this->db->prefix() .
"product_price as pp WHERE pp.fk_product = p.rowid";
3146 if ($price_level >= 1 &&
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES')) {
3147 $sql .=
" AND price_level = " . ((int) $price_level);
3149 $sql .=
" ORDER BY date_price";
3150 $sql .=
" DESC LIMIT 1) as price_rowid";
3151 $sql .=
", (SELECT pp.price_by_qty FROM " . $this->db->prefix() .
"product_price as pp WHERE pp.fk_product = p.rowid";
3152 if ($price_level >= 1 &&
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES')) {
3153 $sql .=
" AND price_level = " . ((int) $price_level);
3155 $sql .=
" ORDER BY date_price";
3156 $sql .=
" DESC LIMIT 1) as price_by_qty";
3157 $selectFields .=
", price_rowid, price_by_qty";
3160 $sql .=
" FROM ".$this->db->prefix().
"product as p";
3163 $sql .=
" USE INDEX (" . $this->db->sanitize(
getDolGlobalString(
'MAIN_PRODUCT_FORCE_INDEX')) .
")";
3167 $parameters = array(
3170 $reshook = $hookmanager->executeHooks(
'selectProductsListFrom', $parameters);
3171 $sql .= $hookmanager->resPrint;
3173 if (count($warehouseStatusArray)) {
3174 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"product_stock as ps on ps.fk_product = p.rowid";
3175 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"entrepot as e on ps.fk_entrepot = e.rowid AND e.entity IN (" .
getEntity(
'stock') .
")";
3176 $sql .=
' AND e.statut IN (' . $this->db->sanitize($this->db->escape(implode(
',', $warehouseStatusArray))) .
')';
3182 $sql .=
" LEFT JOIN (";
3183 $sql .=
" SELECT pcp1.*";
3184 $sql .=
" FROM " . $this->db->prefix() .
"product_customer_price AS pcp1";
3185 $sql .=
" LEFT JOIN (";
3186 $sql .=
" SELECT fk_soc, fk_product, MIN(date_begin) AS date_begin";
3187 $sql .=
" FROM " . $this->db->prefix() .
"product_customer_price";
3188 $sql .=
" WHERE fk_soc = " . ((int) $socid);
3189 $sql .=
" AND date_begin <= '" . $this->db->idate($now) .
"'";
3190 $sql .=
" AND (date_end IS NULL OR '" . $this->db->idate($now) .
"' <= date_end)";
3191 $sql .=
" GROUP BY fk_soc, fk_product";
3192 $sql .=
" ) AS pcp2 ON pcp1.fk_soc = pcp2.fk_soc AND pcp1.fk_product = pcp2.fk_product AND pcp1.date_begin = pcp2.date_begin";
3193 $sql .=
" WHERE pcp2.fk_soc IS NOT NULL";
3194 $sql .=
" ) AS pcp ON pcp.fk_soc = " . ((int) $socid) .
" AND pcp.fk_product = p.rowid";
3198 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"c_units u ON u.rowid = p.fk_unit";
3202 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"product_lang as pl ON pl.fk_product = p.rowid ";
3204 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
3205 $soc =
new Societe($this->db);
3206 $result = $soc->fetch($socid);
3207 if ($result > 0 && !empty($soc->default_lang)) {
3208 $sql .=
" AND pl.lang = '" . $this->db->escape($soc->default_lang) .
"'";
3210 $sql .=
" AND pl.lang = '" . $this->db->escape($langs->getDefaultLang()) .
"'";
3213 $sql .=
" AND pl.lang = '" . $this->db->escape($langs->getDefaultLang()) .
"'";
3218 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"product_attribute_combination pac ON pac.fk_product_child = p.rowid";
3221 $sql .=
' WHERE p.entity IN (' .
getEntity(
'product') .
')';
3224 $sql .=
" AND pac.rowid IS NULL";
3227 if ($finished == 0) {
3228 $sql .=
" AND p.finished = " . ((int) $finished);
3229 } elseif ($finished == 1) {
3230 $sql .=
" AND p.finished = ".((int) $finished);
3233 $sql .=
" AND p.tosell = ".((int) $status);
3235 if ($status_purchase >= 0) {
3236 $sql .=
" AND p.tobuy = " . ((int) $status_purchase);
3239 if (strval($filtertype) !=
'') {
3240 $sql .=
" AND p.fk_product_type = " . ((int) $filtertype);
3241 } elseif (!isModEnabled(
'product')) {
3242 $sql .=
" AND p.fk_product_type = 1";
3243 } elseif (!isModEnabled(
'service')) {
3244 $sql .=
" AND p.fk_product_type = 0";
3247 if ((
int) $warehouseId > 0) {
3248 $sql .=
" AND EXISTS (SELECT psw.fk_product FROM " . $this->db->prefix() .
"product_stock as psw WHERE psw.reel>0 AND psw.fk_entrepot=".(int) $warehouseId.
" AND psw.fk_product = p.rowid)";
3252 $parameters = array(
3253 'filterkey' => &$filterkey,
3256 $reshook = $hookmanager->executeHooks(
'selectProductsListWhere', $parameters);
3257 $sql .= $hookmanager->resPrint;
3259 if ($filterkey !=
'') {
3260 $sqlSupplierSearch =
'';
3265 $search_crit = explode(
' ', $filterkey);
3267 if (count($search_crit) > 1) {
3270 foreach ($search_crit as $crit) {
3274 $sql .=
"(p.ref LIKE '" . $this->db->escape($prefix . $crit) .
"%' OR p.label LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3276 $sql .=
" OR pl.label LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3279 $sql .=
" OR pcp.ref_customer LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3282 $sql .=
" OR p.description LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3284 $sql .=
" OR pl.description LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3290 $sqlSupplierSearch .= !empty($sqlSupplierSearch) ?
' AND ':
'';
3291 $sqlSupplierSearch .=
" pfp.ref_fourn LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3296 if (count($search_crit) > 1) {
3299 if (isModEnabled(
'barcode')) {
3300 $sql .=
" OR p.barcode LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
3305 $sql .=
" OR EXISTS (SELECT pfp.fk_product FROM " . $this->db->prefix() .
"product_fournisseur_price as pfp WHERE p.rowid = pfp.fk_product";
3307 $sql .= $sqlSupplierSearch;
3313 if (count($warehouseStatusArray)) {
3314 $sql .=
" GROUP BY " . $selectFields;
3319 $sql .=
" ORDER BY categorie_product_id ";
3321 (
getDolGlobalInt(
'PRODUCT_SORT_BY_CATEGORY') == 1) ? $sql .=
"ASC" : $sql .=
"DESC";
3323 $sql .= $this->db->order(
"p.ref");
3327 $sql .= $this->db->plimit($limit, 0);
3330 dol_syslog(get_class($this) .
"::select_produits_list search products", LOG_DEBUG);
3331 $result = $this->db->query($sql);
3333 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
3334 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
3335 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
3337 $num = $this->db->num_rows($result);
3342 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
3346 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'" id="' . $htmlname .
'">';
3352 if ($showempty && !is_numeric($showempty)) {
3353 $textifempty = $langs->trans($showempty);
3355 $textifempty .= $langs->trans(
"All");
3358 if ($showempty && !is_numeric($showempty)) {
3359 $textifempty = $langs->trans($showempty);
3363 $out .=
'<option value="-1" selected>' . ($textifempty ? $textifempty :
' ') .
'</option>';
3367 while ($num && $i < $num) {
3370 $objp = $this->db->fetch_object($result);
3372 if ((
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY') ||
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES')) && !empty($objp->price_by_qty) && $objp->price_by_qty == 1) {
3373 $sql =
"SELECT rowid, quantity, price, unitprice, remise_percent, remise, price_base_type";
3374 $sql .=
" FROM " . $this->db->prefix() .
"product_price_by_qty";
3375 $sql .=
" WHERE fk_product_price = " . ((int) $objp->price_rowid);
3376 $sql .=
" ORDER BY quantity ASC";
3378 dol_syslog(get_class($this) .
"::select_produits_list search prices by qty", LOG_DEBUG);
3379 $result2 = $this->db->query($sql);
3381 $nb_prices = $this->db->num_rows($result2);
3383 while ($nb_prices && $j < $nb_prices) {
3384 $objp2 = $this->db->fetch_object($result2);
3386 $objp->price_by_qty_rowid = $objp2->rowid;
3387 $objp->price_by_qty_price_base_type = $objp2->price_base_type;
3388 $objp->price_by_qty_quantity = $objp2->quantity;
3389 $objp->price_by_qty_unitprice = $objp2->unitprice;
3390 $objp->price_by_qty_remise_percent = $objp2->remise_percent;
3392 $objp->quantity = $objp2->quantity;
3393 $objp->price = $objp2->price;
3394 $objp->unitprice = $objp2->unitprice;
3395 $objp->remise_percent = $objp2->remise_percent;
3401 '@phan-var-force array{key:string,value:string,label:string,label2:string,desc:string,type:string,price_ht:string,price_ttc:string,price_ht_locale:string,price_ttc_locale:string,pricebasetype:string,tva_tx:string,default_vat_code:string,qty:string,discount:string,duration_value:string,duration_unit:string,pbq:string,labeltrans:string,desctrans:string,ref_customer:string} $optJson';
3408 array_push($outarray, $optJson);
3412 if (isModEnabled(
'dynamicprices') && !empty($objp->fk_price_expression)) {
3413 $price_product =
new Product($this->db);
3414 $price_product->fetch($objp->rowid,
'',
'',
'1');
3416 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
3418 $price_result = $priceparser->parseProduct($price_product);
3419 if ($price_result >= 0) {
3420 $objp->price = $price_result;
3421 $objp->unitprice = $price_result;
3423 $objp->price_ttc = (float)
price2num($objp->price) * (1 + ($objp->tva_tx / 100));
3424 $objp->price_ttc =
price2num($objp->price_ttc,
'MU');
3427 if (
getDolGlobalInt(
'PRODUIT_CUSTOMER_PRICES_AND_MULTIPRICES') && !empty($objp->custprice)) {
3435 array_push($outarray, $optJson);
3441 $out .=
'</select>';
3443 $this->db->free($result);
3445 if (empty($outputmode)) {
3472 protected function constructProductListOption(&$objp, &$opt, &$optJson, $price_level, $selected, $hidepriceinlabel = 0, $filterkey =
'', $novirtualstock = 0)
3474 global $langs,
$conf, $user;
3475 global $hookmanager;
3481 $outlabel_translated =
'';
3483 $outdesc_translated =
'';
3489 $outpricebasetype =
'';
3491 $outdefault_vat_code =
'';
3495 $maxlengtharticle = (!
getDolGlobalString(
'PRODUCT_MAX_LENGTH_COMBO') ? 48 :
$conf->global->PRODUCT_MAX_LENGTH_COMBO);
3497 $label = $objp->label;
3498 if (!empty($objp->label_translated)) {
3499 $label = $objp->label_translated;
3501 if (!empty($filterkey) && $filterkey !=
'') {
3502 $label = preg_replace(
'/(' . preg_quote($filterkey,
'/') .
')/i',
'<strong>$1</strong>', $label, 1);
3505 $outkey = $objp->rowid;
3506 $outref = $objp->ref;
3507 $outrefcust = empty($objp->custref) ?
'' : $objp->custref;
3508 $outlabel = $objp->label;
3509 $outdesc = $objp->description;
3511 $outlabel_translated = $objp->label_translated;
3512 $outdesc_translated = $objp->description_translated;
3514 $outbarcode = $objp->barcode;
3515 $outorigin = $objp->fk_country;
3516 $outpbq = empty($objp->price_by_qty_rowid) ?
'' : $objp->price_by_qty_rowid;
3518 $outtype = $objp->fk_product_type;
3523 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
3529 if (!empty($objp->unit_short)) {
3530 $outvalUnits .=
' - ' . $objp->unit_short;
3534 if (!empty($objp->weight) && $objp->weight_units !==
null) {
3536 $outvalUnits .=
' - ' . $unitToShow;
3538 if ((!empty($objp->length) || !empty($objp->width) || !empty($objp->height)) && $objp->length_units !==
null) {
3539 $unitToShow = $objp->length .
' x ' . $objp->width .
' x ' . $objp->height .
' ' .
measuringUnitString(0,
'size', $objp->length_units);
3540 $outvalUnits .=
' - ' . $unitToShow;
3542 if (!empty($objp->surface) && $objp->surface_units !==
null) {
3544 $outvalUnits .=
' - ' . $unitToShow;
3546 if (!empty($objp->volume) && $objp->volume_units !==
null) {
3548 $outvalUnits .=
' - ' . $unitToShow;
3551 if ($outdurationvalue && $outdurationunit) {
3553 'h' => $langs->trans(
'Hour'),
3554 'd' => $langs->trans(
'Day'),
3555 'w' => $langs->trans(
'Week'),
3556 'm' => $langs->trans(
'Month'),
3557 'y' => $langs->trans(
'Year')
3559 if (isset($da[$outdurationunit])) {
3560 $outvalUnits .=
' - ' . $outdurationvalue .
' ' . $langs->transnoentities($da[$outdurationunit] . ($outdurationvalue > 1 ?
's' :
''));
3567 if ($user->hasRight(
'stock',
'lire')) {
3568 if ($objp->stock > 0) {
3570 } elseif ($objp->stock <= 0) {
3578 $labeltoshow .= $objp->ref;
3579 if (!empty($objp->custref)) {
3580 $labeltoshow .=
' (' . $objp->custref .
')';
3583 $labeltoshow .=
' (' . $outbarcode .
')';
3585 $labeltoshow .=
' - ' .
dol_trunc($label, $maxlengtharticle);
3587 $labeltoshow .=
' (' .
getCountry($outorigin,
'1') .
')';
3591 $labeltoshowhtml =
'';
3592 $labeltoshowhtml .= $objp->ref;
3593 if (!empty($objp->custref)) {
3594 $labeltoshowhtml .=
' (' . $objp->custref .
')';
3596 if (!empty($filterkey) && $filterkey !=
'') {
3597 $labeltoshowhtml = preg_replace(
'/(' . preg_quote($filterkey,
'/') .
')/i',
'<strong>$1</strong>', $labeltoshowhtml, 1);
3600 $labeltoshowhtml .=
' (' . $outbarcode .
')';
3602 $labeltoshowhtml .=
' - ' .
dol_trunc($label, $maxlengtharticle);
3604 $labeltoshowhtml .=
' (' .
getCountry($outorigin,
'1') .
')';
3608 $labeltoshowstock =
'';
3609 $labeltoshowhtmlstock =
'';
3611 if ($user->hasRight(
'stock',
'lire')) {
3612 $labeltoshowstock .=
' - ' . $langs->trans(
"Stock") .
': ' .
price(
price2num($objp->stock,
'MS'), 0, $langs, 0, 0);
3614 if ($objp->stock > 0) {
3615 $labeltoshowhtmlstock .=
' - <span class="product_line_stock_ok">';
3616 } elseif ($objp->stock <= 0) {
3617 $labeltoshowhtmlstock .=
' - <span class="product_line_stock_too_low">';
3619 $labeltoshowhtmlstock .= $langs->transnoentities(
"Stock") .
': ' .
price(
price2num($objp->stock,
'MS'), 0, $langs, 0, 0);
3620 $labeltoshowhtmlstock .=
'</span>';
3622 if (empty($novirtualstock) &&
getDolGlobalString(
'STOCK_SHOW_VIRTUAL_STOCK_IN_PRODUCTS_COMBO')) {
3623 $langs->load(
"stocks");
3625 $tmpproduct =
new Product($this->db);
3626 $tmpproduct->fetch($objp->rowid,
'',
'',
'', 1, 1, 1);
3627 $tmpproduct->load_virtual_stock();
3628 $virtualstock = $tmpproduct->stock_theorique;
3630 $labeltoshowstock .=
' - ' . $langs->trans(
"VirtualStock") .
':' . $virtualstock;
3632 $labeltoshowhtmlstock .=
' - ' . $langs->transnoentities(
"VirtualStock") .
':';
3633 if ($virtualstock > 0) {
3634 $labeltoshowhtmlstock .=
'<span class="product_line_stock_ok">';
3635 } elseif ($virtualstock <= 0) {
3636 $labeltoshowhtmlstock .=
'<span class="product_line_stock_too_low">';
3638 $labeltoshowhtmlstock .= $virtualstock;
3639 $labeltoshowhtmlstock .=
'</span>';
3648 $labeltoshowprice =
'';
3649 $labeltoshowhtmlprice =
'';
3652 $sql =
"SELECT price, price_ttc, price_base_type, tva_tx, default_vat_code";
3653 $sql .=
" FROM " . $this->db->prefix() .
"product_price";
3654 $sql .=
" WHERE fk_product = " . ((int) $objp->rowid);
3655 $sql .=
" AND entity IN (" .
getEntity(
'productprice') .
")";
3656 $sql .=
" AND price_level = " . ((int) $price_level);
3657 $sql .=
" ORDER BY date_price DESC, rowid DESC";
3660 dol_syslog(get_class($this) .
'::constructProductListOption search price for product ' . $objp->rowid .
' AND level ' . $price_level, LOG_DEBUG);
3661 $result2 = $this->db->query($sql);
3663 $objp2 = $this->db->fetch_object($result2);
3666 if ($objp2->price_base_type ==
'HT') {
3667 $labeltoshowprice .=
' - ' .
price($objp2->price, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"HT");
3668 $labeltoshowhtmlprice .=
' - ' .
price($objp2->price, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"HT");
3670 $labeltoshowprice .=
' - ' .
price($objp2->price_ttc, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"TTC");
3671 $labeltoshowhtmlprice .=
' - ' .
price($objp2->price_ttc, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"TTC");
3673 $outprice_ht =
price($objp2->price);
3674 $outprice_ttc =
price($objp2->price_ttc);
3675 $outpricebasetype = $objp2->price_base_type;
3677 $outtva_tx = $objp2->tva_tx;
3678 $outdefault_vat_code = $objp2->default_vat_code;
3680 $outtva_tx = $objp->tva_tx;
3681 $outdefault_vat_code = $objp->default_vat_code;
3690 if (empty($hidepriceinlabel) && !empty($objp->quantity) && $objp->quantity >= 1 && (
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY') ||
getDolGlobalString(
'PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES'))) {
3692 $outqty = $objp->quantity;
3693 $outdiscount = $objp->remise_percent;
3694 if ($objp->quantity == 1) {
3695 $labeltoshowprice .=
' - ' .
price($objp->unitprice, 1, $langs, 0, 0, -1,
$conf->currency) .
"/";
3696 $labeltoshowhtmlprice .=
' - ' .
price($objp->unitprice, 0, $langs, 0, 0, -1,
$conf->currency) .
"/";
3697 $labeltoshowprice .= $langs->trans(
"Unit");
3698 $labeltoshowhtmlprice .= $langs->transnoentities(
"Unit");
3700 $labeltoshowprice .=
' - ' .
price($objp->price, 1, $langs, 0, 0, -1,
$conf->currency) .
"/" . $objp->quantity;
3701 $labeltoshowhtmlprice .=
' - ' .
price($objp->price, 0, $langs, 0, 0, -1,
$conf->currency) .
"/" . $objp->quantity;
3702 $labeltoshowprice .= $langs->trans(
"Units");
3703 $labeltoshowhtmlprice .= $langs->transnoentities(
"Units");
3706 $outprice_ht =
price($objp->unitprice);
3707 $outprice_ttc =
price($objp->unitprice * (1 + ($objp->tva_tx / 100)));
3708 $outpricebasetype = $objp->price_base_type;
3709 $outtva_tx = $objp->tva_tx;
3710 $outdefault_vat_code = $objp->default_vat_code;
3712 if (empty($hidepriceinlabel) && !empty($objp->quantity) && $objp->quantity >= 1) {
3713 $labeltoshowprice .=
" (" .
price($objp->unitprice, 1, $langs, 0, 0, -1,
$conf->currency) .
"/" . $langs->trans(
"Unit") .
")";
3714 $labeltoshowhtmlprice .=
" (" .
price($objp->unitprice, 0, $langs, 0, 0, -1,
$conf->currency) .
"/" . $langs->transnoentities(
"Unit") .
")";
3716 if (empty($hidepriceinlabel) && !empty($objp->remise_percent) && $objp->remise_percent >= 1) {
3717 $labeltoshowprice .=
" - " . $langs->trans(
"Discount") .
" : " .
vatrate($objp->remise_percent) .
' %';
3718 $labeltoshowhtmlprice .=
" - " . $langs->transnoentities(
"Discount") .
" : " .
vatrate($objp->remise_percent) .
' %';
3723 if (!empty($objp->idprodcustprice)) {
3726 if ($objp->custprice_base_type ==
'HT') {
3727 $labeltoshowprice .=
' - ' .
price($objp->custprice, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"HT");
3728 $labeltoshowhtmlprice .=
' - ' .
price($objp->custprice, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"HT");
3730 $labeltoshowprice .=
' - ' .
price($objp->custprice_ttc, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"TTC");
3731 $labeltoshowhtmlprice .=
' - ' .
price($objp->custprice_ttc, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"TTC");
3734 $outprice_ht =
price($objp->custprice);
3735 $outprice_ttc =
price($objp->custprice_ttc);
3736 $outpricebasetype = $objp->custprice_base_type;
3737 $outtva_tx = $objp->custtva_tx;
3738 $outdefault_vat_code = $objp->custdefault_vat_code;
3739 $outdiscount = $objp->custdiscount_percent;
3744 if (empty($hidepriceinlabel) && !$found) {
3745 if ($objp->price_base_type ==
'HT') {
3746 $labeltoshowprice .=
' - ' .
price($objp->price, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"HT");
3747 $labeltoshowhtmlprice .=
' - ' .
price($objp->price, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"HT");
3749 $labeltoshowprice .=
' - ' .
price($objp->price_ttc, 1, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->trans(
"TTC");
3750 $labeltoshowhtmlprice .=
' - ' .
price($objp->price_ttc, 0, $langs, 0, 0, -1,
$conf->currency) .
' ' . $langs->transnoentities(
"TTC");
3752 $outprice_ht =
price($objp->price);
3753 $outprice_ttc =
price($objp->price_ttc);
3754 $outpricebasetype = $objp->price_base_type;
3755 $outtva_tx = $objp->tva_tx;
3756 $outdefault_vat_code = $objp->default_vat_code;
3760 $opt =
'<option value="' . $objp->rowid .
'"';
3761 $opt .= ($objp->rowid == $selected) ?
' selected' :
'';
3762 if (!empty($objp->price_by_qty_rowid) && $objp->price_by_qty_rowid > 0) {
3763 $opt .=
' pbq="' . $objp->price_by_qty_rowid .
'" data-pbq="' . $objp->price_by_qty_rowid .
'" data-pbqup="' . $objp->price_by_qty_unitprice .
'" data-pbqbase="' . $objp->price_by_qty_price_base_type .
'" data-pbqqty="' . $objp->price_by_qty_quantity .
'" data-pbqpercent="' . $objp->price_by_qty_remise_percent .
'"';
3766 $opt .=
' data-labeltrans="' . $outlabel_translated .
'"';
3770 if ($stocktag == 1) {
3771 $opt .=
' class="product_line_stock_ok" data-html="'.$labeltoshowhtml.$outvalUnits.$labeltoshowhtmlprice.dolPrintHTMLForAttribute($labeltoshowhtmlstock).
'"';
3774 if ($stocktag == -1) {
3775 $opt .=
' class="product_line_stock_too_low" data-html="'.$labeltoshowhtml.$outvalUnits.$labeltoshowhtmlprice.dolPrintHTMLForAttribute($labeltoshowhtmlstock).
'"';
3782 $opt .= $labeltoshow;
3783 $outval .= $labeltoshowhtml;
3786 $opt .= $outvalUnits;
3787 $outval .= $outvalUnits;
3790 $opt .= $labeltoshowprice;
3791 $outval .= $labeltoshowhtmlprice;
3794 $opt .= $labeltoshowstock;
3795 $outval .= $labeltoshowhtmlstock;
3798 $parameters = array(
'objp' => $objp);
3799 $reshook = $hookmanager->executeHooks(
'constructProductListOption', $parameters);
3800 if (empty($reshook)) {
3801 $opt .= $hookmanager->resPrint;
3803 $opt = $hookmanager->resPrint;
3806 $opt .=
"</option>\n";
3811 'label2' => $outlabel,
3815 'price_ttc' =>
price2num($outprice_ttc),
3818 'pricebasetype' => $outpricebasetype,
3819 'tva_tx' => $outtva_tx,
3820 'default_vat_code' => $outdefault_vat_code,
3822 'discount' => $outdiscount,
3823 'duration_value' => $outdurationvalue,
3824 'duration_unit' => $outdurationunit,
3826 'labeltrans' => $outlabel_translated,
3827 'desctrans' => $outdesc_translated,
3828 'ref_customer' => $outrefcust
3850 public function select_produits_fournisseurs($socid, $selected =
'', $htmlname =
'productid', $filtertype =
'', $filtre =
'', $ajaxoptions = array(), $hidelabel = 0, $alsoproductwithnosupplierprice = 0, $morecss =
'', $placeholder =
'', $nooutput = 0)
3853 global $langs,
$conf;
3854 global $price_level, $status, $finished;
3856 if (!isset($status)) {
3860 $selected_input_value =
'';
3862 if ((
int) $selected > 0) {
3863 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
3864 $producttmpselect =
new Product($this->db);
3865 $producttmpselect->fetch((
int) $selected);
3866 $selected_input_value = $producttmpselect->ref;
3867 unset($producttmpselect);
3871 $urloption = ($socid > 0 ?
'socid=' . $socid .
'&' :
'') .
'htmlname=' . $htmlname .
'&outjson=1&price_level=' . $price_level .
'&type=' . $filtertype .
'&mode=2&status=' . $status .
'&finished=' . $finished .
'&alsoproductwithnosupplierprice=' . $alsoproductwithnosupplierprice;
3873 $s =
ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT .
'/product/ajax/products.php', $urloption,
getDolGlobalInt(
'PRODUIT_USE_SEARCH_TO_SELECT'), 0, $ajaxoptions);
3875 $s .= ($hidelabel ?
'' : $langs->trans(
"RefOrLabel") .
' : ') .
'<input type="text" class="'.$morecss.
'" name="search_' . $htmlname .
'" id="search_' . $htmlname .
'" value="' . $selected_input_value .
'"' . ($placeholder ?
' placeholder="' . $placeholder .
'"' :
'') .
'>';
3877 $s = $this->
select_produits_fournisseurs_list($socid, $selected, $htmlname, $filtertype, $filtre,
'', $status, 0, 0, $alsoproductwithnosupplierprice, $morecss,
getDolGlobalInt(
'SUPPLIER_SHOW_STOCK_IN_PRODUCTS_COMBO'), $placeholder);
3907 public function select_produits_fournisseurs_list($socid, $selected =
'', $htmlname =
'productid', $filtertype =
'', $filtre =
'', $filterkey =
'', $statut = -1, $outputmode = 0, $limit = 100, $alsoproductwithnosupplierprice = 0, $morecss =
'', $showstockinlist = 0, $placeholder =
'')
3910 global $langs,
$conf, $user;
3911 global $hookmanager;
3914 $outarray = array();
3916 $maxlengtharticle = (!
getDolGlobalString(
'PRODUCT_MAX_LENGTH_COMBO') ? 48 :
$conf->global->PRODUCT_MAX_LENGTH_COMBO);
3918 $langs->load(
'stocks');
3921 $langs->load(
'other');
3924 $sql =
"SELECT p.rowid, p.ref, p.label, p.price, p.duration, p.fk_product_type, p.stock, p.tva_tx as tva_tx_sale, p.default_vat_code as default_vat_code_sale,";
3925 $sql .=
" pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.quantity, pfp.remise_percent, pfp.remise, pfp.unitprice, pfp.barcode";
3926 $sql .=
", pfp.multicurrency_code, pfp.multicurrency_unitprice";
3927 $sql .=
", pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, pfp.default_vat_code, pfp.fk_soc, s.nom as name";
3928 $sql .=
", pfp.supplier_reputation";
3931 $sql .=
", pfp.desc_fourn as description";
3933 $sql .=
", p.description";
3937 $sql .=
", u.label as unit_long, u.short_label as unit_short, p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units, p.surface, p.surface_units, p.volume, p.volume_units";
3942 $reshook = $hookmanager->executeHooks(
'selectSuppliersProductsListSelect', $parameters);
3943 $sql .= $hookmanager->resPrint;
3945 $sql .=
" FROM " . $this->db->prefix() .
"product as p";
3949 $reshook = $hookmanager->executeHooks(
'selectSuppliersProductsListFrom', $parameters);
3950 $sql .= $hookmanager->resPrint;
3952 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"product_fournisseur_price as pfp ON ( p.rowid = pfp.fk_product AND pfp.entity IN (" .
getEntity(
'product') .
") )";
3954 $sql .=
" AND pfp.fk_soc = " . ((int) $socid);
3956 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"societe as s ON pfp.fk_soc = s.rowid";
3959 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"c_units u ON u.rowid = p.fk_unit";
3961 $sql .=
" WHERE p.entity IN (" .
getEntity(
'product') .
")";
3962 if ($statut != -1) {
3963 $sql .=
" AND p.tobuy = " . ((int) $statut);
3965 if (strval($filtertype) !=
'') {
3966 $sql .=
" AND p.fk_product_type = " . ((int) $filtertype);
3968 if (!empty($filtre)) {
3969 $sql .=
" " . $filtre;
3972 $parameters = array();
3973 $reshook = $hookmanager->executeHooks(
'selectSuppliersProductsListWhere', $parameters);
3974 $sql .= $hookmanager->resPrint;
3976 if ($filterkey !=
'') {
3980 $search_crit = explode(
' ', $filterkey);
3982 if (count($search_crit) > 1) {
3985 foreach ($search_crit as $crit) {
3989 $sql .=
"(pfp.ref_fourn LIKE '" . $this->db->escape($prefix . $crit) .
"%' OR p.ref LIKE '" . $this->db->escape($prefix . $crit) .
"%' OR p.label LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3991 $sql .=
" OR pfp.desc_fourn LIKE '" . $this->db->escape($prefix . $crit) .
"%'";
3996 if (count($search_crit) > 1) {
3999 if (isModEnabled(
'barcode')) {
4000 $sql .=
" OR p.barcode LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
4001 $sql .=
" OR pfp.barcode LIKE '" . $this->db->escape($prefix . $filterkey) .
"%'";
4005 $sql .=
" ORDER BY pfp.ref_fourn DESC, pfp.quantity ASC";
4006 $sql .= $this->db->plimit($limit, 0);
4010 dol_syslog(get_class($this) .
"::select_produits_fournisseurs_list", LOG_DEBUG);
4011 $result = $this->db->query($sql);
4013 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
4014 require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
4016 $num = $this->db->num_rows($result);
4019 $out .=
'<select class="flat ' . ($morecss ?
' ' . $morecss :
'') .
'" id="' . $htmlname .
'" name="' . $htmlname .
'">';
4021 $out .=
'<option value="-1" selected>' . ($placeholder ? $placeholder :
' ') .
'</option>';
4023 $out .=
'<option value="-1">' . ($placeholder ? $placeholder :
' ') .
'</option>';
4028 $objp = $this->db->fetch_object($result);
4030 if (is_null($objp->idprodfournprice)) {
4032 $objp->tva_tx = $objp->tva_tx_sale;
4033 $objp->default_vat_code = $objp->default_vat_code_sale;
4036 $outkey = $objp->idprodfournprice;
4037 if (!$outkey && $alsoproductwithnosupplierprice) {
4038 $outkey =
'idprod_' . $objp->rowid;
4041 $outref = $objp->ref;
4042 $outbarcode = $objp->barcode;
4045 $outtype = $objp->fk_product_type;
4052 if (!empty($objp->unit_short)) {
4053 $outvalUnits .=
' - ' . $objp->unit_short;
4055 if (!empty($objp->weight) && $objp->weight_units !==
null) {
4057 $outvalUnits .=
' - ' . $unitToShow;
4059 if ((!empty($objp->length) || !empty($objp->width) || !empty($objp->height)) && $objp->length_units !==
null) {
4060 $unitToShow = $objp->length .
' x ' . $objp->width .
' x ' . $objp->height .
' ' .
measuringUnitString(0,
'size', $objp->length_units);
4061 $outvalUnits .=
' - ' . $unitToShow;
4063 if (!empty($objp->surface) && $objp->surface_units !==
null) {
4065 $outvalUnits .=
' - ' . $unitToShow;
4067 if (!empty($objp->volume) && $objp->volume_units !==
null) {
4069 $outvalUnits .=
' - ' . $unitToShow;
4071 if ($outdurationvalue && $outdurationunit) {
4073 'h' => $langs->trans(
'Hour'),
4074 'd' => $langs->trans(
'Day'),
4075 'w' => $langs->trans(
'Week'),
4076 'm' => $langs->trans(
'Month'),
4077 'y' => $langs->trans(
'Year')
4079 if (isset($da[$outdurationunit])) {
4080 $outvalUnits .=
' - ' . $outdurationvalue .
' ' . $langs->transnoentities($da[$outdurationunit] . ($outdurationvalue > 1 ?
's' :
''));
4085 $objRef = $objp->ref;
4086 if ($filterkey && $filterkey !=
'') {
4087 $objRef = preg_replace(
'/(' . preg_quote($filterkey,
'/') .
')/i',
'<strong>$1</strong>', $objRef, 1);
4089 $objRefFourn = $objp->ref_fourn;
4090 if ($filterkey && $filterkey !=
'') {
4091 $objRefFourn = preg_replace(
'/(' . preg_quote($filterkey,
'/') .
')/i',
'<strong>$1</strong>', $objRefFourn, 1);
4093 $label = $objp->label;
4094 if ($filterkey && $filterkey !=
'') {
4095 $label = preg_replace(
'/(' . preg_quote($filterkey,
'/') .
')/i',
'<strong>$1</strong>', $label, 1);
4098 switch ($objp->fk_product_type) {
4110 if (empty($picto)) {
4113 $optlabel =
img_object(
'', $picto,
'class="paddingright classfortooltip"', 0, 0, 1);
4116 $optlabel .= $objp->ref;
4117 if (!empty($objp->idprodfournprice) && ($objp->ref != $objp->ref_fourn)) {
4118 $optlabel .=
' <span class="opacitymedium">(' . $objp->ref_fourn .
')</span>';
4120 if (isModEnabled(
'barcode') && !empty($objp->barcode)) {
4121 $optlabel .=
' (' . $outbarcode .
')';
4123 $optlabel .=
' - ' .
dol_trunc($label, $maxlengtharticle);
4125 $outvallabel = $objRef;
4126 if (!empty($objp->idprodfournprice) && ($objp->ref != $objp->ref_fourn)) {
4127 $outvallabel .=
' (' . $objRefFourn .
')';
4129 if (isModEnabled(
'barcode') && !empty($objp->barcode)) {
4130 $outvallabel .=
' (' . $outbarcode .
')';
4132 $outvallabel .=
' - ' .
dol_trunc($label, $maxlengtharticle);
4135 $optlabel .= $outvalUnits;
4136 $outvallabel .= $outvalUnits;
4138 if (!empty($objp->idprodfournprice)) {
4139 $outqty = $objp->quantity;
4140 $outdiscount = $objp->remise_percent;
4141 if (isModEnabled(
'dynamicprices') && !empty($objp->fk_supplier_price_expression)) {
4143 $prod_supplier->product_fourn_price_id = $objp->idprodfournprice;
4144 $prod_supplier->id = $objp->fk_product;
4145 $prod_supplier->fourn_qty = $objp->quantity;
4146 $prod_supplier->fourn_tva_tx = $objp->tva_tx;
4147 $prod_supplier->fk_supplier_price_expression = $objp->fk_supplier_price_expression;
4149 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
4151 $price_result = $priceparser->parseProductSupplier($prod_supplier);
4152 if ($price_result >= 0) {
4153 $objp->fprice = $price_result;
4154 if ($objp->quantity >= 1) {
4155 $objp->unitprice = $objp->fprice / $objp->quantity;
4159 if ($objp->quantity == 1) {
4160 $optlabel .=
' - ' .
price($objp->fprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 1, $langs, 0, 0, -1,
$conf->currency) .
"/";
4161 $outvallabel .=
' - ' .
price($objp->fprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 0, $langs, 0, 0, -1,
$conf->currency) .
"/";
4162 $optlabel .= $langs->trans(
"Unit");
4163 $outvallabel .= $langs->transnoentities(
"Unit");
4165 $optlabel .=
' - ' .
price($objp->fprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 1, $langs, 0, 0, -1,
$conf->currency) .
"/" . $objp->quantity;
4166 $outvallabel .=
' - ' .
price($objp->fprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 0, $langs, 0, 0, -1,
$conf->currency) .
"/" . $objp->quantity;
4167 $optlabel .=
' ' . $langs->trans(
"Units");
4168 $outvallabel .=
' ' . $langs->transnoentities(
"Units");
4171 if ($objp->quantity != 1) {
4172 $optlabel .=
" (" .
price($objp->unitprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 1, $langs, 0, 0, -1,
$conf->currency) .
"/" . $langs->trans(
"Unit") .
")";
4173 $outvallabel .=
" (" .
price($objp->unitprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 0, $langs, 0, 0, -1,
$conf->currency) .
"/" . $langs->transnoentities(
"Unit") .
")";
4175 if ($objp->remise_percent >= 1) {
4176 $optlabel .=
" - " . $langs->trans(
"Discount") .
" : " .
vatrate($objp->remise_percent) .
' %';
4177 $outvallabel .=
" - " . $langs->transnoentities(
"Discount") .
" : " .
vatrate($objp->remise_percent) .
' %';
4179 if ($objp->duration) {
4180 $optlabel .=
" - " . $objp->duration;
4181 $outvallabel .=
" - " . $objp->duration;
4184 $optlabel .=
" - " .
dol_trunc($objp->name, 8);
4185 $outvallabel .=
" - " .
dol_trunc($objp->name, 8);
4187 if ($objp->supplier_reputation) {
4189 $reputations = array(
'' => $langs->trans(
'Standard'),
'FAVORITE' => $langs->trans(
'Favorite'),
'NOTTHGOOD' => $langs->trans(
'NotTheGoodQualitySupplier'),
'DONOTORDER' => $langs->trans(
'DoNotOrderThisProductToThisSupplier'));
4191 $optlabel .=
" - " . $reputations[$objp->supplier_reputation];
4192 $outvallabel .=
" - " . $reputations[$objp->supplier_reputation];
4195 $optlabel .=
" - <span class='opacitymedium'>" . $langs->trans(
"NoPriceDefinedForThisSupplier") .
'</span>';
4196 $outvallabel .=
' - ' . $langs->transnoentities(
"NoPriceDefinedForThisSupplier");
4200 $novirtualstock = ($showstockinlist == 2);
4202 if ($user->hasRight(
'stock',
'lire')) {
4203 $outvallabel .=
' - ' . $langs->trans(
"Stock") .
': ' .
price(
price2num($objp->stock,
'MS'), 0, $langs, 0, 0);
4205 if ($objp->stock > 0) {
4206 $optlabel .=
' - <span class="product_line_stock_ok">';
4207 } elseif ($objp->stock <= 0) {
4208 $optlabel .=
' - <span class="product_line_stock_too_low">';
4210 $optlabel .= $langs->transnoentities(
"Stock") .
':' .
price(
price2num($objp->stock,
'MS'));
4211 $optlabel .=
'</span>';
4212 if (empty($novirtualstock) &&
getDolGlobalString(
'STOCK_SHOW_VIRTUAL_STOCK_IN_PRODUCTS_COMBO')) {
4213 $langs->load(
"stocks");
4215 $tmpproduct =
new Product($this->db);
4216 $tmpproduct->fetch($objp->rowid,
'',
'',
'', 1, 1, 1);
4217 $tmpproduct->load_virtual_stock();
4218 $virtualstock = $tmpproduct->stock_theorique;
4220 $outvallabel .=
' - ' . $langs->trans(
"VirtualStock") .
':' . $virtualstock;
4222 $optlabel .=
' - ' . $langs->transnoentities(
"VirtualStock") .
':';
4223 if ($virtualstock > 0) {
4224 $optlabel .=
'<span class="product_line_stock_ok">';
4225 } elseif ($virtualstock <= 0) {
4226 $optlabel .=
'<span class="product_line_stock_too_low">';
4228 $optlabel .= $virtualstock;
4229 $optlabel .=
'</span>';
4236 $optstart =
'<option value="' . $outkey .
'"';
4237 if ($selected && preg_match(
'/^idprod_/', (
string) $selected) && (
string) $selected ==
'idprod_'.$objp->rowid) {
4238 $optstart .=
' selected';
4239 } elseif ($selected && (
string) $selected == (
string) $objp->idprodfournprice) {
4240 $optstart .=
' selected';
4243 if (empty($objp->idprodfournprice) && empty($alsoproductwithnosupplierprice)) {
4244 $optstart .=
' disabled';
4247 if (!empty($objp->idprodfournprice) && $objp->idprodfournprice > 0) {
4256 $optstart .=
' data-default-vat-code="' .
dol_escape_htmltag($objp->default_vat_code) .
'"';
4258 if (isModEnabled(
'multicurrency')) {
4259 $optstart .=
' data-multicurrency-code="' .
dol_escape_htmltag($objp->multicurrency_code) .
'"';
4263 $optstart .=
' data-description="' .
dol_escape_htmltag($objp->description, 0, 1) .
'"';
4266 $outarrayentry = array(
4269 'label' => $outvallabel,
4270 'labelhtml' => $optlabel,
4272 'price_qty_ht' =>
price2num($objp->fprice,
'MU'),
4273 'price_unit_ht' =>
price2num($objp->unitprice,
'MU'),
4274 'price_ht' =>
price2num($objp->unitprice,
'MU'),
4275 'tva_tx_formated' =>
price($objp->tva_tx, 0, $langs, 1, -1, 2),
4277 'default_vat_code' => $objp->default_vat_code,
4278 'supplier_ref' => $objp->ref_fourn,
4279 'discount' => $outdiscount,
4281 'duration_value' => $outdurationvalue,
4282 'duration_unit' => $outdurationunit,
4283 'disabled' => empty($objp->idprodfournprice),
4284 'description' => $objp->description
4286 if (isModEnabled(
'multicurrency')) {
4287 $outarrayentry[
'multicurrency_code'] = $objp->multicurrency_code;
4288 $outarrayentry[
'multicurrency_unitprice'] =
price2num($objp->multicurrency_unitprice,
'MU');
4290 $parameters = array(
4292 'optstart' => &$optstart,
4293 'optlabel' => &$optlabel,
4294 'outvallabel' => &$outvallabel,
4295 'outarrayentry' => &$outarrayentry,
4298 $reshook = $hookmanager->executeHooks(
'selectProduitsFournisseurListOption', $parameters, $this);
4304 $out .= $optstart .
' data-html="' .
dol_escape_htmltag($optlabel) .
'">' . $optlabel .
"</option>\n";
4305 $outarraypush = array(
4308 'label' => $outvallabel,
4309 'labelhtml' => $optlabel,
4311 'price_qty_ht' =>
price2num($objp->fprice,
'MU'),
4312 'price_qty_ht_locale' =>
price($objp->fprice),
4313 'price_unit_ht' =>
price2num($objp->unitprice,
'MU'),
4314 'price_unit_ht_locale' =>
price($objp->unitprice),
4315 'price_ht' =>
price2num($objp->unitprice,
'MU'),
4316 'tva_tx_formated' =>
price($objp->tva_tx),
4318 'default_vat_code' => $objp->default_vat_code,
4319 'supplier_ref' => $objp->ref_fourn,
4320 'discount' => $outdiscount,
4322 'duration_value' => $outdurationvalue,
4323 'duration_unit' => $outdurationunit,
4324 'disabled' => empty($objp->idprodfournprice),
4325 'description' => $objp->description
4327 if (isModEnabled(
'multicurrency')) {
4328 $outarraypush[
'multicurrency_code'] = $objp->multicurrency_code;
4329 $outarraypush[
'multicurrency_unitprice'] =
price2num($objp->multicurrency_unitprice,
'MU');
4331 array_push($outarray, $outarraypush);
4344 $out .=
'</select>';
4346 $this->db->free($result);
4348 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
4354 if (empty($outputmode)) {
4373 global $langs,
$conf;
4375 $langs->load(
'stocks');
4377 $sql =
"SELECT p.rowid, p.ref, p.label, p.price, p.duration, pfp.fk_soc,";
4378 $sql .=
" pfp.ref_fourn, pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.remise_percent, pfp.quantity, pfp.unitprice,";
4379 $sql .=
" pfp.fk_supplier_price_expression, pfp.fk_product, pfp.tva_tx, s.nom as name";
4380 $sql .=
" FROM " . $this->db->prefix() .
"product as p";
4381 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
4382 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"societe as s ON pfp.fk_soc = s.rowid";
4383 $sql .=
" WHERE pfp.entity IN (" .
getEntity(
'productsupplierprice') .
")";
4384 $sql .=
" AND p.tobuy = 1";
4385 $sql .=
" AND s.fournisseur = 1";
4386 $sql .=
" AND p.rowid = " . ((int) $productid);
4388 $sql .=
" ORDER BY s.nom, pfp.ref_fourn DESC";
4390 $sql .=
" ORDER BY pfp.unitprice ASC";
4393 dol_syslog(get_class($this) .
"::select_product_fourn_price", LOG_DEBUG);
4394 $result = $this->db->query($sql);
4397 $num = $this->db->num_rows($result);
4399 $form =
'<select class="flat" id="select_' . $htmlname .
'" name="' . $htmlname .
'">';
4402 $form .=
'<option value="0">-- ' . $langs->trans(
"NoSupplierPriceDefinedForThisProduct") .
' --</option>';
4404 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
4405 $form .=
'<option value="0"> </option>';
4409 $objp = $this->db->fetch_object($result);
4411 $opt =
'<option value="' . $objp->idprodfournprice .
'"';
4413 if ($num == 1 || ($selected_supplier > 0 && $objp->fk_soc == $selected_supplier) || ($i == 0 &&
getDolGlobalString(
'PRODUCT_BEST_SUPPLIER_PRICE_PRESELECTED'))) {
4414 $opt .=
' selected';
4416 $opt .=
'>' . $objp->name .
' - ' . $objp->ref_fourn .
' - ';
4418 if (isModEnabled(
'dynamicprices') && !empty($objp->fk_supplier_price_expression)) {
4420 $prod_supplier->product_fourn_price_id = $objp->idprodfournprice;
4421 $prod_supplier->id = $productid;
4422 $prod_supplier->fourn_qty = $objp->quantity;
4423 $prod_supplier->fourn_tva_tx = $objp->tva_tx;
4424 $prod_supplier->fk_supplier_price_expression = $objp->fk_supplier_price_expression;
4426 require_once DOL_DOCUMENT_ROOT .
'/product/dynamic_price/class/price_parser.class.php';
4428 $price_result = $priceparser->parseProductSupplier($prod_supplier);
4429 if ($price_result >= 0) {
4430 $objp->fprice = $price_result;
4431 if ($objp->quantity >= 1) {
4432 $objp->unitprice = $objp->fprice / $objp->quantity;
4436 if ($objp->quantity == 1) {
4437 $opt .=
price($objp->fprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 1, $langs, 0, 0, -1,
$conf->currency) .
"/";
4440 $opt .= $objp->quantity .
' ';
4442 if ($objp->quantity == 1) {
4443 $opt .= $langs->trans(
"Unit");
4445 $opt .= $langs->trans(
"Units");
4447 if ($objp->quantity > 1) {
4449 $opt .=
price($objp->unitprice * (
getDolGlobalString(
'DISPLAY_DISCOUNTED_SUPPLIER_PRICE') ? (1 - $objp->remise_percent / 100) : 1), 1, $langs, 0, 0, -1,
$conf->currency) .
"/" . $langs->trans(
"Unit");
4451 if ($objp->duration) {
4452 $opt .=
" - " . $objp->duration;
4454 $opt .=
"</option>\n";
4461 $form .=
'</select>';
4462 $this->db->free($result);
4480 global $langs, $hookmanager;
4482 $num = count($this->cache_conditions_paiements);
4489 $this->cache_conditions_paiements = array();
4491 $sql =
"SELECT rowid, code, libelle as label, deposit_percent, entity";
4492 $sql .=
" FROM " . $this->db->prefix() .
'c_payment_term';
4493 $sql .=
" WHERE entity IN (" .
getEntity(
'c_payment_term') .
")";
4494 $sql .=
" AND active > 0";
4495 $sql .=
" ORDER BY sortorder";
4497 $resql = $this->db->query($sql);
4499 $num = $this->db->num_rows($resql);
4502 $obj = $this->db->fetch_object($resql);
4505 $label = ($langs->trans(
"PaymentConditionShort" . $obj->code) !=
"PaymentConditionShort" . $obj->code ? $langs->trans(
"PaymentConditionShort" . $obj->code) : ($obj->label !=
'-' ? $obj->label :
''));
4506 $this->cache_conditions_paiements[$obj->rowid][
'code'] = (string) $obj->code;
4507 $this->cache_conditions_paiements[$obj->rowid][
'label'] = (string) $label;
4508 $this->cache_conditions_paiements[$obj->rowid][
'deposit_percent'] = (string) $obj->deposit_percent;
4509 $this->cache_conditions_paiements[$obj->rowid][
'entity'] = (int) $obj->entity;
4513 $parameters = array(
'context' =>
'paymentterm');
4514 $reshook = $hookmanager->executeHooks(
'loadDictionaryCache', $parameters, $this);
4515 if (empty($reshook)) {
4516 if (is_array($hookmanager->resArray) && count($hookmanager->resArray)) {
4517 $this->cache_conditions_paiements = array_merge($this->cache_conditions_paiements, $hookmanager->resArray);
4520 $this->cache_conditions_paiements = $hookmanager->resArray;
4544 $this->cache_rule_for_lines_dates = $factureRec->fields[
'rule_for_lines_dates'][
'arrayofkeyval'];
4546 if (empty($this->cache_rule_for_lines_dates)) {
4565 $num = count($this->cache_availability);
4572 $this->cache_availability = array();
4574 $langs->load(
'propal');
4576 $sql =
"SELECT rowid, code, label, position";
4577 $sql .=
" FROM " . $this->db->prefix() .
'c_availability';
4578 $sql .=
" WHERE active > 0";
4580 $resql = $this->db->query($sql);
4582 $num = $this->db->num_rows($resql);
4585 $obj = $this->db->fetch_object($resql);
4588 $label = ($langs->trans(
"AvailabilityType" . $obj->code) !=
"AvailabilityType" . $obj->code ? $langs->trans(
"AvailabilityType" . $obj->code) : ($obj->label !=
'-' ? $obj->label :
''));
4589 $this->cache_availability[$obj->rowid][
'code'] = (string) $obj->code;
4590 $this->cache_availability[$obj->rowid][
'label'] = (string) $label;
4591 $this->cache_availability[$obj->rowid][
'position'] = (int) $obj->position;
4595 $this->cache_availability =
dol_sort_array($this->cache_availability,
'position',
'asc', 0, 0, 1);
4616 global $langs, $user;
4620 dol_syslog(__METHOD__ .
" selected=" . $selected .
", htmlname=" . $htmlname, LOG_DEBUG);
4622 print
'<select id="' . $htmlname .
'" class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'">';
4624 print
'<option value="0"> </option>';
4626 foreach ($this->cache_availability as
$id => $arrayavailability) {
4627 if ($selected ==
$id) {
4628 print
'<option value="' .
$id .
'" selected>';
4630 print
'<option value="' .
$id .
'">';
4637 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
4651 $num = count($this->cache_demand_reason);
4656 $sql =
"SELECT rowid, code, label";
4657 $sql .=
" FROM " . $this->db->prefix() .
'c_input_reason';
4658 $sql .=
" WHERE active > 0";
4660 $resql = $this->db->query($sql);
4662 $num = $this->db->num_rows($resql);
4664 $tmparray = array();
4666 $obj = $this->db->fetch_object($resql);
4669 $label = ($obj->label !=
'-' ? $obj->label :
'');
4670 if ($langs->trans(
"DemandReasonType" . $obj->code) !=
"DemandReasonType" . $obj->code) {
4671 $label = $langs->trans(
"DemandReasonType" . $obj->code);
4673 if ($langs->trans($obj->code) != $obj->code) {
4674 $label = $langs->trans($obj->code);
4677 $tmparray[$obj->rowid][
'id'] = $obj->rowid;
4678 $tmparray[$obj->rowid][
'code'] = $obj->code;
4679 $tmparray[$obj->rowid][
'label'] = $label;
4683 $this->cache_demand_reason =
dol_sort_array($tmparray,
'label',
'asc', 0, 0, 1);
4705 public function selectInputReason($selected =
'', $htmlname =
'demandreasonid', $exclude =
'', $addempty = 0, $morecss =
'', $notooltip = 0)
4707 global $langs, $user;
4711 print
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" id="select_' . $htmlname .
'" name="' . $htmlname .
'">';
4713 print
'<option value="0"' . (empty($selected) ?
' selected' :
'') .
'> </option>';
4715 foreach ($this->cache_demand_reason as
$id => $arraydemandreason) {
4716 if ($arraydemandreason[
'code'] == $exclude) {
4720 if ($selected && ($selected == $arraydemandreason[
'id'] || $selected == $arraydemandreason[
'code'])) {
4721 print
'<option value="' . $arraydemandreason[
'id'] .
'" selected>';
4723 print
'<option value="' . $arraydemandreason[
'id'] .
'">';
4725 $label = $arraydemandreason[
'label'];
4726 print $langs->trans($label);
4730 if ($user->admin && empty($notooltip)) {
4731 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
4746 global $langs, $hookmanager;
4748 $num = count($this->cache_types_paiements);
4755 $this->cache_types_paiements = array();
4757 $sql =
"SELECT id, code, libelle as label, type, entity, active";
4758 $sql .=
" FROM " . $this->db->prefix() .
"c_paiement";
4759 $sql .=
" WHERE entity IN (" .
getEntity(
'c_paiement') .
")";
4761 $resql = $this->db->query($sql);
4763 $num = $this->db->num_rows($resql);
4766 $obj = $this->db->fetch_object($resql);
4769 $label = ($langs->transnoentitiesnoconv(
"PaymentTypeShort" . $obj->code) !=
"PaymentTypeShort" . $obj->code ? $langs->transnoentitiesnoconv(
"PaymentTypeShort" . $obj->code) : ($obj->label !=
'-' ? $obj->label :
''));
4770 $this->cache_types_paiements[$obj->id][
'id'] = (int) $obj->id;
4771 $this->cache_types_paiements[$obj->id][
'code'] = (string) $obj->code;
4772 $this->cache_types_paiements[$obj->id][
'label'] = (string) $label;
4773 $this->cache_types_paiements[$obj->id][
'type'] = (int) $obj->type;
4774 $this->cache_types_paiements[$obj->id][
'entity'] = (int) $obj->entity;
4775 $this->cache_types_paiements[$obj->id][
'active'] = (int) $obj->active;
4779 $parameters = array(
'context' =>
'paymenttype');
4780 $reshook = $hookmanager->executeHooks(
'loadDictionaryCache', $parameters, $this);
4781 if (empty($reshook)) {
4782 if (is_array($hookmanager->resArray) && count($hookmanager->resArray)) {
4783 $this->cache_types_paiements = array_merge($this->cache_types_paiements, $hookmanager->resArray);
4786 $this->cache_types_paiements = $hookmanager->resArray;
4789 $this->cache_types_paiements =
dol_sort_array($this->cache_types_paiements,
'label',
'asc', 0, 0, 1);
4819 public function select_conditions_paiements($selected = 0, $htmlname =
'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss =
'', $deposit_percent = -1, $noprint = 0)
4823 if (empty($noprint)) {
4847 public function getSelectConditionsPaiements($selected = 0, $htmlname =
'condid', $filtertype = -1, $addempty = 0, $noinfoadmin = 0, $morecss =
'', $deposit_percent = -1)
4849 global $langs, $user,
$conf;
4852 dol_syslog(__METHOD__ .
" selected=" . $selected .
", htmlname=" . $htmlname, LOG_DEBUG);
4857 if (empty($selected) && strpos($htmlname,
'search_') !== 0 &&
getDolGlobalString(
'MAIN_DEFAULT_PAYMENT_TERM_ID')) {
4858 dol_syslog(__METHOD__ .
"Using deprecated option MAIN_DEFAULT_PAYMENT_TERM_ID", LOG_NOTICE);
4862 $out .=
'<select id="' . $htmlname .
'" class="flat selectpaymentterms' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'">';
4864 $out .=
'<option value="0"> </option>';
4867 $selectedDepositPercent =
null;
4869 foreach ($this->cache_conditions_paiements as
$id => $arrayconditions) {
4870 if ($filtertype <= 0 && !empty($arrayconditions[
'deposit_percent'])) {
4874 if ($selected ==
$id) {
4875 $selectedDepositPercent = $deposit_percent > 0 ? $deposit_percent : $arrayconditions[
'deposit_percent'];
4876 $out .=
'<option value="' .
$id .
'" data-deposit_percent="' . $arrayconditions[
'deposit_percent'] .
'" selected>';
4878 $out .=
'<option value="' .
$id .
'" data-deposit_percent="' . $arrayconditions[
'deposit_percent'] .
'">';
4880 $label = $arrayconditions[
'label'];
4882 if (!empty($arrayconditions[
'deposit_percent'])) {
4883 $label = str_replace(
'__DEPOSIT_PERCENT__', $deposit_percent > 0 ? $deposit_percent : $arrayconditions[
'deposit_percent'], $label);
4887 $out .=
'</option>';
4889 $out .=
'</select>';
4890 if ($user->admin && empty($noinfoadmin)) {
4891 $out .=
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
4895 if ($deposit_percent >= 0) {
4896 $out .=
' <span id="' . $htmlname .
'_deposit_percent_container"' . (empty($selectedDepositPercent) ?
' style="display: none"' :
'') .
'>';
4897 $out .= $langs->trans(
'DepositPercent') .
' : ';
4898 $out .=
'<input id="' . $htmlname .
'_deposit_percent" name="' . $htmlname .
'_deposit_percent" class="maxwidth50" value="' . $deposit_percent .
'" />';
4901 <script nonce="' .
getNonce() .
'">
4902 $(document).ready(function () {
4903 $("#' . $htmlname .
'").change(function () {
4904 let $selected = $(this).find("option:selected");
4905 let depositPercent = $selected.attr("data-deposit_percent");
4907 if (depositPercent.length > 0) {
4908 $("#' . $htmlname .
'_deposit_percent_container").show().find("#' . $htmlname .
'_deposit_percent").val(depositPercent);
4910 $("#' . $htmlname .
'_deposit_percent_container").hide();
4939 $out .=
'<select id="' . $htmlname .
'" class="flat selectbillingterm" name="' . $htmlname .
'">';
4941 $out .=
'<option value="-1"> </option>';
4945 foreach ($this->cache_rule_for_lines_dates as $rule_for_lines_dates_key => $rule_for_lines_dates_name) {
4946 if ($selected == $rule_for_lines_dates_key) {
4947 $out .=
'<option value="' . $rule_for_lines_dates_key .
'" selected>';
4949 $out .=
'<option value="' . $rule_for_lines_dates_key .
'">';
4952 $out .= $langs->trans($rule_for_lines_dates_name);
4953 $out .=
'</option>';
4955 $out .=
'</select>';
4981 public function select_types_paiements($selected =
'', $htmlname =
'paiementtype', $filtertype =
'', $format = 0, $empty = 1, $noadmininfo = 0, $maxlength = 0, $active = 1, $morecss =
'', $nooutput = 0)
4984 global $langs, $user,
$conf;
4988 dol_syslog(__METHOD__ .
" " . $selected .
", " . $htmlname .
", " . $filtertype .
", " . $format, LOG_DEBUG);
4990 $filterarray = array();
4991 if ($filtertype ==
'CRDT') {
4992 $filterarray = array(0, 2, 3);
4993 } elseif ($filtertype ==
'DBIT') {
4994 $filterarray = array(1, 2, 3);
4995 } elseif ($filtertype !=
'' && $filtertype !=
'-1') {
4996 $filterarray = explode(
',', $filtertype);
5002 if (empty($selected) && strpos($htmlname,
'search_') !== 0 &&
getDolGlobalString(
'MAIN_DEFAULT_PAYMENT_TYPE_ID')) {
5003 dol_syslog(__METHOD__ .
"Using deprecated option MAIN_DEFAULT_PAYMENT_TYPE_ID", LOG_NOTICE);
5007 $out .=
'<select id="select' . $htmlname .
'" class="flat selectpaymenttypes' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'">';
5009 $out .=
'<option value=""> </option>';
5011 foreach ($this->cache_types_paiements as
$id => $arraytypes) {
5013 if ($active >= 0 && $arraytypes[
'active'] != $active) {
5018 if (count($filterarray) && !in_array($arraytypes[
'type'], $filterarray)) {
5023 if ($empty && empty($arraytypes[
'code'])) {
5028 $out .=
'<option value="' .
$id .
'" data-code="'.$arraytypes[
'code'].
'"';
5029 } elseif ($format == 1) {
5030 $out .=
'<option value="' . $arraytypes[
'code'] .
'"';
5031 } elseif ($format == 2) {
5032 $out .=
'<option value="' . $arraytypes[
'code'] .
'"';
5033 } elseif ($format == 3) {
5034 $out .=
'<option value="' .
$id .
'"';
5037 if ($format == 1 || $format == 2) {
5038 if ($selected == $arraytypes[
'code']) {
5039 $out .=
' selected';
5042 if ($selected ==
$id) {
5043 $out .=
' selected';
5049 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
5050 } elseif ($format == 1) {
5051 $value = $arraytypes[
'code'];
5052 } elseif ($format == 2) {
5053 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
5054 } elseif ($format == 3) {
5055 $value = $arraytypes[
'code'];
5057 $out .= $value ? $value :
' ';
5058 $out .=
'</option>';
5060 $out .=
'</select>';
5061 if ($user->admin && !$noadmininfo) {
5062 $out .=
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
5066 if (empty($nooutput)) {
5086 $return =
'<select class="flat maxwidth100" id="select_' . $htmlname .
'" name="' . $htmlname .
'">';
5088 'HT' => $langs->trans(
"HT"),
5089 'TTC' => $langs->trans(
"TTC")
5091 foreach ($options as
$id => $value) {
5092 if ($selected ==
$id) {
5093 $return .=
'<option value="' .
$id .
'" selected>' . $value;
5095 $return .=
'<option value="' .
$id .
'">' . $value;
5097 $return .=
'</option>';
5099 $return .=
'</select>';
5119 $num = count($this->cache_transport_mode);
5126 $this->cache_transport_mode = array();
5128 $sql =
"SELECT rowid, code, label, active";
5129 $sql .=
" FROM " . $this->db->prefix() .
"c_transport_mode";
5130 $sql .=
" WHERE entity IN (" .
getEntity(
'c_transport_mode') .
")";
5132 $resql = $this->db->query($sql);
5134 $num = $this->db->num_rows($resql);
5137 $obj = $this->db->fetch_object($resql);
5140 $label = ($langs->transnoentitiesnoconv(
"PaymentTypeShort" . $obj->code) !=
"PaymentTypeShort" . $obj->code ? $langs->transnoentitiesnoconv(
"PaymentTypeShort" . $obj->code) : ($obj->label !=
'-' ? $obj->label :
''));
5141 $this->cache_transport_mode[$obj->rowid][
'rowid'] = $obj->rowid;
5142 $this->cache_transport_mode[$obj->rowid][
'code'] = $obj->code;
5143 $this->cache_transport_mode[$obj->rowid][
'label'] = $label;
5144 $this->cache_transport_mode[$obj->rowid][
'active'] = $obj->active;
5148 $this->cache_transport_mode =
dol_sort_array($this->cache_transport_mode,
'label',
'asc', 0, 0, 1);
5170 public function selectTransportMode($selected =
'', $htmlname =
'transportmode', $format = 0, $empty = 1, $noadmininfo = 0, $maxlength = 0, $active = 1, $morecss =
'')
5172 global $langs, $user;
5174 dol_syslog(__METHOD__ .
" " . $selected .
", " . $htmlname .
", " . $format, LOG_DEBUG);
5178 print
'<select id="select' . $htmlname .
'" class="flat selectmodetransport' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'">';
5180 print
'<option value=""> </option>';
5182 foreach ($this->cache_transport_mode as
$id => $arraytypes) {
5184 if ($active >= 0 && $arraytypes[
'active'] != $active) {
5189 if ($empty && empty($arraytypes[
'code'])) {
5194 print
'<option value="' .
$id .
'"';
5195 } elseif ($format == 1) {
5196 print
'<option value="' . $arraytypes[
'code'] .
'"';
5197 } elseif ($format == 2) {
5198 print
'<option value="' . $arraytypes[
'code'] .
'"';
5199 } elseif ($format == 3) {
5200 print
'<option value="' .
$id .
'"';
5203 if (preg_match(
'/[a-z]/i', $selected) && $selected == $arraytypes[
'code']) {
5205 } elseif ($selected ==
$id) {
5211 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
5212 } elseif ($format == 1) {
5213 $value = $arraytypes[
'code'];
5214 } elseif ($format == 2) {
5215 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
5216 } elseif ($format == 3) {
5217 $value = $arraytypes[
'code'];
5219 print $value ? $value :
' ';
5226 if ($user->admin && !$noadmininfo) {
5227 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
5243 public function selectShippingMethod($selected =
'', $htmlname =
'shipping_method_id', $filtre =
'', $useempty = 0, $moreattrib =
'', $noinfoadmin = 0, $morecss =
'')
5245 global $langs, $user;
5247 $langs->load(
"admin");
5248 $langs->load(
"deliveries");
5250 $sql =
"SELECT rowid, code, libelle as label";
5251 $sql .=
" FROM " . $this->db->prefix() .
"c_shipment_mode";
5252 $sql .=
" WHERE active > 0";
5254 $sql .=
" AND " . $filtre;
5256 $sql .=
" ORDER BY libelle ASC";
5258 dol_syslog(get_class($this) .
"::selectShippingMode", LOG_DEBUG);
5259 $result = $this->db->query($sql);
5261 $num = $this->db->num_rows($result);
5264 print
'<select id="select' . $htmlname .
'" class="flat selectshippingmethod' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'"' . ($moreattrib ?
' ' . $moreattrib :
'') .
'>';
5265 if ($useempty == 1 || ($useempty == 2 && $num > 1)) {
5266 print
'<option value="-1"> </option>';
5269 $obj = $this->db->fetch_object($result);
5270 if ($selected == $obj->rowid) {
5271 print
'<option value="' . $obj->rowid .
'" selected>';
5273 print
'<option value="' . $obj->rowid .
'">';
5275 print ($langs->trans(
"SendingMethod" . strtoupper($obj->code)) !=
"SendingMethod" . strtoupper($obj->code)) ? $langs->trans(
"SendingMethod" . strtoupper($obj->code)) : $obj->label;
5280 if ($user->admin && empty($noinfoadmin)) {
5281 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
5286 print $langs->trans(
"NoShippingMethodDefined");
5306 $langs->load(
"deliveries");
5308 if ($htmlname !=
"none") {
5309 print
'<form method="POST" action="' . $page .
'">';
5310 print
'<input type="hidden" name="action" value="setshippingmethod">';
5311 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
5313 print
'<input type="submit" class="button valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
5317 $code = $langs->getLabelFromKey($this->db, $selected,
'c_shipment_mode',
'rowid',
'code');
5318 print $langs->trans(
"SendingMethod" . strtoupper($code));
5337 $langs->load(
'bills');
5341 $sql =
"SELECT rowid, ref, situation_cycle_ref, situation_counter, situation_final, fk_soc";
5342 $sql .=
' FROM ' . $this->db->prefix() .
'facture';
5343 $sql .=
' WHERE entity IN (' .
getEntity(
'invoice') .
')';
5344 $sql .=
' AND situation_counter >= 1';
5345 $sql .=
' AND fk_soc = ' . (int) $socid;
5346 $sql .=
' AND type <> 2';
5347 $sql .=
' ORDER by situation_cycle_ref, situation_counter desc';
5348 $resql = $this->db->query($sql);
5350 $nbSituationInvoiceForThirdparty = 0;
5352 if ($resql && $this->db->num_rows($resql) > 0) {
5355 while ($obj = $this->db->fetch_object($resql)) {
5357 if ($obj->situation_cycle_ref != $ref) {
5359 $ref = $obj->situation_cycle_ref;
5361 if ($obj->situation_final != 1) {
5363 if (substr($obj->ref, 1, 4) !=
'PROV') {
5364 $nbSituationInvoiceForThirdparty++;
5366 if ($selected == $obj->rowid) {
5367 $opt .=
'<option value="' . $obj->rowid .
'" selected>' . $obj->ref .
'</option>';
5369 $opt .=
'<option value="' . $obj->rowid .
'">' . $obj->ref .
'</option>';
5376 dol_syslog(
"Error sql=" . $sql .
", error=" . $this->error, LOG_ERR);
5379 if ($nbSituationInvoiceForThirdparty > 0) {
5380 $opt =
'<option class="minwidth100" value="" selected> </option>'.$opt;
5382 $opt =
'<option class="minwidth100" value="-1" selected>'.$langs->trans(
'NoSituations').
'</option>';
5397 public function selectUnits($selected =
'', $htmlname =
'units', $showempty = 0, $unit_type =
'')
5401 $langs->load(
'products');
5403 $return =
'<select class="flat" id="' . $htmlname .
'" name="' . $htmlname .
'">';
5405 $sql =
"SELECT rowid, label, code FROM " . $this->db->prefix() .
"c_units";
5406 $sql .=
' WHERE active > 0';
5407 if (!empty($unit_type)) {
5408 $sql .=
" AND unit_type = '" . $this->db->escape($unit_type) .
"'";
5410 $sql .=
" ORDER BY sortorder";
5412 $resql = $this->db->query($sql);
5413 if ($resql && $this->db->num_rows($resql) > 0) {
5415 $return .=
'<option value="-1"></option>';
5418 while ($res = $this->db->fetch_object($resql)) {
5419 $unitLabel = $res->label;
5420 if (!empty($langs->tab_translate[
'unit' . $res->code])) {
5421 $unitLabel = $langs->trans(
'unit' . $res->code) != $res->label ? $langs->trans(
'unit' . $res->code) : $res->label;
5424 if ($selected == $res->rowid) {
5425 $return .=
'<option value="' . $res->rowid .
'" selected>' . $unitLabel .
'</option>';
5427 $return .=
'<option value="' . $res->rowid .
'">' . $unitLabel .
'</option>';
5430 $return .=
'</select>';
5453 public function select_comptes($selected =
'', $htmlname =
'accountid', $status = 0, $filtre =
'', $useempty = 0, $moreattrib =
'', $showcurrency = 0, $morecss =
'', $nooutput = 0)
5460 $langs->loadLangs(array(
"admin",
"banks"));
5463 $sql =
"SELECT rowid, label, bank, clos as status, currency_code";
5464 $sql .=
" FROM " . $this->db->prefix() .
"bank_account";
5465 $sql .=
" WHERE entity IN (" .
getEntity(
'bank_account') .
")";
5467 $sql .=
" AND clos = " . (int) $status;
5470 $sql .=
" AND " . $filtre;
5472 $sql .=
" ORDER BY label";
5474 dol_syslog(get_class($this) .
"::select_comptes", LOG_DEBUG);
5475 $result = $this->db->query($sql);
5477 $num = $this->db->num_rows($result);
5480 $out .=
'<select id="select' . $htmlname .
'" class="flat selectbankaccount' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'"' . ($moreattrib ?
' ' . $moreattrib :
'') .
'>';
5484 $out .=
'<option class="opacitymedium" value="-1">' . $langs->trans(
"NoActiveBankAccountDefined") .
'</span>';
5486 $out .=
'<option class="opacitymedium" value="-1">' . $langs->trans(
"NoBankAccountDefined") .
'</span>';
5489 if (!empty($useempty) && !is_numeric($useempty)) {
5490 $out .=
'<option value="-1">'.$langs->trans($useempty).
'</option>';
5491 } elseif ($useempty == 1 || ($useempty == 2 && $num > 1)) {
5492 $out .=
'<option value="-1"> </option>';
5497 $obj = $this->db->fetch_object($result);
5499 $labeltoshow = trim($obj->label);
5500 $labeltoshowhtml = trim($obj->label);
5501 if ($showcurrency) {
5502 $labeltoshow .=
' (' . $obj->currency_code .
')';
5503 $labeltoshowhtml .=
' <span class="opacitymedium">(' . $obj->currency_code .
')</span>';
5505 if ($status == 2 && $obj->status == 1) {
5506 $labeltoshow .=
' (' . $langs->trans(
"Closed") .
')';
5507 $labeltoshowhtml .=
' <span class="opacitymedium">(' . $langs->trans(
"Closed") .
')</span>';
5510 if ($selected == $obj->rowid || ($useempty == 2 && $num == 1 && empty($selected))) {
5511 $out .=
'<option value="' . $obj->rowid .
'" data-currency-code="' . $obj->currency_code .
'" data-html="'.dolPrintHTMLForAttribute($labeltoshowhtml).
'" selected>';
5513 $out .=
'<option value="' . $obj->rowid .
'" data-currency-code="' . $obj->currency_code .
'" data-html="'.dolPrintHTMLForAttribute($labeltoshowhtml).
'">';
5515 $out .= $labeltoshow;
5516 $out .=
'</option>';
5519 $out .=
"</select>";
5526 if (empty($nooutput)) {
5548 public function selectRib($selected =
'', $htmlname =
'ribcompanyid', $filtre =
'', $useempty = 0, $moreattrib =
'', $showibanbic = 0, $morecss =
'', $nooutput = 0)
5555 $langs->loadLangs(array(
"admin",
"banks"));
5558 $sql =
"SELECT rowid, label, bank, status, iban_prefix, bic";
5559 $sql .=
" FROM " . $this->db->prefix() .
"societe_rib";
5560 $sql .=
" WHERE type = 'ban'";
5562 $sql .=
" AND " . $filtre;
5564 $sql .=
" ORDER BY label";
5565 dol_syslog(get_class($this) .
"::select_comptes", LOG_DEBUG);
5566 $result = $this->db->query($sql);
5568 $num = $this->db->num_rows($result);
5571 $out .=
'<select id="select' . $htmlname .
'" class="flat selectbankaccount' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'"' . ($moreattrib ?
' ' . $moreattrib :
'') .
'>';
5574 $out .=
'<option class="opacitymedium" value="-1">' . $langs->trans(
"NoBankAccountDefined") .
'</span>';
5576 if (!empty($useempty) && !is_numeric($useempty)) {
5577 $out .=
'<option value="-1">'.$langs->trans($useempty).
'</option>';
5578 } elseif ($useempty == 1 || ($useempty == 2 && $num > 1)) {
5579 $out .=
'<option value="-1"> </option>';
5584 $obj = $this->db->fetch_object($result);
5586 if ($selected == $obj->rowid || ($useempty == 2 && $num == 1 && empty($selected))) {
5587 $out .=
'<option value="' . $obj->rowid .
'" data-iban-prefix="' . $iban .
' data-bic="' . $obj->bic .
'" selected>';
5589 $out .=
'<option value="' . $obj->rowid .
'" data-iban-prefix="' . $iban .
' data-bic="' . $obj->bic .
'">';
5591 $out .= trim($obj->label);
5593 $out .=
' (' . $iban .
'/' .$obj->bic.
')';
5595 $out .=
'</option>';
5598 $out .=
"</select>";
5605 if (empty($nooutput)) {
5625 public function selectEstablishments($selected =
'', $htmlname =
'entity', $status = 0, $filtre =
'', $useempty = 0, $moreattrib =
'')
5629 $langs->load(
"admin");
5632 $sql =
"SELECT rowid, name, fk_country, status, entity";
5633 $sql .=
" FROM " . $this->db->prefix() .
"establishment";
5634 $sql .=
" WHERE 1=1";
5636 $sql .=
" AND status = " . (int) $status;
5639 $sql .=
" AND " . $filtre;
5641 $sql .=
" ORDER BY name";
5643 dol_syslog(get_class($this) .
"::select_establishment", LOG_DEBUG);
5644 $result = $this->db->query($sql);
5646 $num = $this->db->num_rows($result);
5649 print
'<select id="select' . $htmlname .
'" class="flat selectestablishment" name="' . $htmlname .
'"' . ($moreattrib ?
' ' . $moreattrib :
'') .
'>';
5650 if ($useempty == 1 || ($useempty == 2 && $num > 1)) {
5651 print
'<option value="-1"> </option>';
5655 $obj = $this->db->fetch_object($result);
5656 if ($selected == $obj->rowid) {
5657 print
'<option value="' . $obj->rowid .
'" selected>';
5659 print
'<option value="' . $obj->rowid .
'">';
5661 print trim($obj->name);
5662 if ($status == 2 && $obj->status == 1) {
5663 print
' (' . $langs->trans(
"Closed") .
')';
5671 print
'<span class="opacitymedium">' . $langs->trans(
"NoActiveEstablishmentDefined") .
'</span>';
5673 print
'<span class="opacitymedium">' . $langs->trans(
"NoEstablishmentFound") .
'</span>';
5696 if ($htmlname !=
"none") {
5697 print
'<form method="POST" action="' . $page .
'">';
5698 print
'<input type="hidden" name="action" value="setbankaccount">';
5699 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
5700 print
img_picto(
'',
'bank_account',
'class="pictofixedwidth"');
5701 $nbaccountfound = $this->
select_comptes($selected, $htmlname, 0,
'', $addempty);
5702 if ($nbaccountfound > 0) {
5703 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
5707 $langs->load(
'banks');
5710 require_once DOL_DOCUMENT_ROOT .
'/compta/bank/class/account.class.php';
5711 $bankstatic =
new Account($this->db);
5712 $result = $bankstatic->fetch((
int) $selected);
5714 print $bankstatic->getNomUrl(1);
5733 public function formRib($page, $selected =
'', $htmlname =
'ribcompanyid', $filtre =
'', $addempty = 0, $showibanbic = 0)
5736 if ($htmlname !=
"none") {
5737 print
'<form method="POST" action="' . $page .
'">';
5738 print
'<input type="hidden" name="action" value="setbankaccountcustomer">';
5739 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
5740 $nbaccountfound = $this->
selectRib($selected, $htmlname, $filtre, $addempty,
'', $showibanbic);
5741 if ($nbaccountfound > 0) {
5742 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
5746 $langs->load(
'banks');
5749 require_once DOL_DOCUMENT_ROOT .
'/societe/class/companybankaccount.class.php';
5751 $result = $bankstatic->fetch((
int) $selected);
5753 print $bankstatic->label;
5755 print
' (' . $bankstatic->iban .
'/' .$bankstatic->bic.
')';
5783 $arrayselected = array();
5785 $arrayselected =
GETPOST($htmlname,
'array:int');
5788 $cats =
$c->containing(
$object->id, $categtype);
5789 $arrayselected = array();
5790 foreach ($cats as $cat) {
5791 $arrayselected[] = $cat->id;
5795 $out .=
img_picto(
'',
'category',
'class="pictofixedwidth"');
5796 $out .= $this->
multiselectarray($htmlname, $cate_arbo, $arrayselected, 0, 0,
'minwidth100 widthcentpercentminusxx', 0, 0);
5800 $jsonclose =
'doJsCodeAfterPopupClose'.$htmlname.
'()';
5801 $urltoopen =
'/categories/categorie_list.php?type='.urlencode($categtype).
'&nosearch=1';
5806 $out .=
'<!-- Add js code to open the popup for category/edit/add -->'.
"\n";
5807 $out .=
'<script>function doJsCodeAfterPopupClose'.$htmlname.
'() {
5808 console.log("doJsCodeAfterPopupClose'.$htmlname.
' has been called, we refresh the combo content + refresh select2...");
5810 // Call an ajax to reload values and update the select
5811 // $("#'.
dol_escape_js($htmlname).
'").append(new Option("Option 4", "4"));
5813 // Refresh select2 to take account of new values (enough for small change)
5816 url: \''.DOL_URL_ROOT.
'/core/ajax/fetchCategories.php\',
5818 action: \'getCategories\',
5823 success: function (data) {
5824 var $select = $(\'#'.dol_escape_js($htmlname).
'\');
5825 var selectedValues = $select.val();
5826 console.log(selectedValues);
5828 $.each(data,
function (index, item) {
5829 $select.append(\
'<option value="\' + item.id + \'" data-html="\' + item.htmlforattribute + \'">\' + item.htmlforoption + \'</option>\');
5831 $select.val(selectedValues);
5833 error: function (xhr, status, error) {
5834 console.log("Error when loading ajax page : " + error);
5839 // Alternative if change in select is complex
5870 public function select_all_categories($type, $selected =
'', $htmlname =
"parent", $maxlength = 64, $fromid = 0, $outputmode = 0, $include = 0, $morecss =
'', $useempty = 1)
5875 include_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
5879 if (is_numeric($type)) {
5880 $type = array_search($type, $cat->MAP_ID);
5883 $cate_arbo = $cat->get_full_arbo($type, $fromid, $include);
5885 $outarray = array();
5886 $outarrayrichhtml = array();
5889 $output =
'<select class="flat minwidth100' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'" id="' . $htmlname .
'">';
5890 if (is_array($cate_arbo)) {
5891 $num = count($cate_arbo);
5894 $langs->load(
"categories");
5895 $output .=
'<option value="-1" disabled>' . $langs->trans(
"NoCategoriesDefined") .
'</option>';
5897 if ($useempty == 1 || ($useempty == 2 && $num > 1)) {
5898 $output .=
'<option value="-1"> </option>';
5900 foreach ($cate_arbo as $key => $value) {
5901 if ($cate_arbo[$key][
'id'] == $selected || ($selected ===
'auto' && count($cate_arbo) == 1)) {
5907 $labeltoshow =
img_picto(
'',
'category',
'class="pictofixedwidth"'.(empty($cate_arbo[$key][
'color']) ?
'' :
' style="color: #' . $cate_arbo[$key][
'color'] .
'"'));
5908 $labeltoshow .=
dol_trunc($cate_arbo[$key][
'fulllabel'], $maxlength,
'middle');
5910 $outarray[$cate_arbo[$key][
'id']] = $cate_arbo[$key][
'fulllabel'];
5912 $outarrayrichhtml[$cate_arbo[$key][
'id']] = $labeltoshow;
5914 $output .=
'<option ' . $add .
'value="' . $cate_arbo[$key][
'id'] .
'"';
5917 $output .=
dol_trunc($cate_arbo[$key][
'fulllabel'], $maxlength,
'middle');
5918 $output .=
'</option>';
5920 $cate_arbo[$key][
'data-html'] = $labeltoshow;
5924 $output .=
'</select>';
5927 $this->num = count($cate_arbo);
5929 if ($outputmode == 2) {
5932 } elseif ($outputmode == 1) {
5934 } elseif ($outputmode == 3) {
5935 return $outarrayrichhtml;
5960 public function form_confirm($page, $title, $question, $action, $formquestion = array(), $selectedchoice =
"", $useajax = 0, $height = 170, $width = 500)
5963 dol_syslog(__METHOD__ .
': using form_confirm is deprecated. Use formconfim instead.', LOG_WARNING);
5964 print $this->
formconfirm($page, $title, $question, $action, $formquestion, $selectedchoice, $useajax, $height, $width);
5993 public function formconfirm($page, $title, $question, $action, $formquestion =
'', $selectedchoice =
'', $useajax = 0, $height = 0, $width = 500, $disableformtag = 0, $labelbuttonyes =
'Yes', $labelbuttonno =
'No')
5995 global $langs,
$conf;
5998 $formconfirm =
'<!-- formconfirm - before call, page=' .
dol_escape_htmltag($page) .
' -->';
6004 $newselectedchoice = empty($selectedchoice) ?
"no" : $selectedchoice;
6005 if (
$conf->browser->layout ==
'phone') {
6010 if (empty($height)) {
6012 if (is_array($formquestion) && count($formquestion) > 2) {
6013 $height += ((count($formquestion) - 2) * 24);
6017 if (is_array($formquestion) && !empty($formquestion)) {
6019 foreach ($formquestion as $key => $input) {
6020 if (is_array($input) && !empty($input)) {
6021 if ($input[
'type'] ==
'hidden') {
6022 $moreattr = (!empty($input[
'moreattr']) ?
' ' . $input[
'moreattr'] :
'');
6023 $morecss = (!empty($input[
'morecss']) ?
' ' . $input[
'morecss'] :
'');
6031 $moreonecolumn =
'';
6032 $more .=
'<div class="tagtable paddingtopbottomonly centpercent noborderspacing">' .
"\n";
6033 foreach ($formquestion as $key => $input) {
6034 if (is_array($input) && !empty($input)) {
6035 $size = (!empty($input[
'size']) ?
' size="' . $input[
'size'] .
'"' :
'');
6036 $moreattr = (!empty($input[
'moreattr']) ?
' ' . $input[
'moreattr'] :
'');
6037 $morecss = (!empty($input[
'morecss']) ?
' ' . $input[
'morecss'] :
'');
6039 if ($input[
'type'] ==
'text' || $input[
'type'] ==
'input') {
6040 $more .=
'<div class="tagtr"><div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' ' . $input[
'tdclass'])) .
'">' . ($input[
'label'] ??
'') .
'</div><div class="tagtd"><input type="text" class="flat' . $morecss .
'" id="' .
dol_escape_htmltag($input[
'name']) .
'" name="' .
dol_escape_htmltag($input[
'name']) .
'"' . $size .
' value="' . (empty($input[
'value']) ?
'' : $input[
'value']) .
'"' . $moreattr .
' /></div></div>' .
"\n";
6041 } elseif ($input[
'type'] ==
'password') {
6042 $more .=
'<div class="tagtr"><div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' ' . $input[
'tdclass'])) .
'">' . ($input[
'label'] ??
'') .
'</div><div class="tagtd"><input type="password" class="flat' . $morecss .
'" id="' .
dol_escape_htmltag($input[
'name']) .
'" name="' .
dol_escape_htmltag($input[
'name']) .
'"' . $size .
' value="' . (empty($input[
'value']) ?
'' : $input[
'value']) .
'"' . $moreattr .
' /></div></div>' .
"\n";
6043 } elseif ($input[
'type'] ==
'textarea') {
6044 $moreonecolumn .=
'<div class="margintoponly">';
6045 $moreonecolumn .= $input[
'label'] .
'<br>';
6047 $moreonecolumn .= $input[
'value'];
6048 $moreonecolumn .=
'</textarea>';
6049 $moreonecolumn .=
'</div>';
6050 } elseif (in_array($input[
'type'], [
'select',
'multiselect'])) {
6051 if (empty($morecss)) {
6052 $morecss =
'minwidth100';
6055 $show_empty = isset($input[
'select_show_empty']) ? $input[
'select_show_empty'] : 1;
6056 $key_in_label = isset($input[
'select_key_in_label']) ? $input[
'select_key_in_label'] : 0;
6057 $value_as_key = isset($input[
'select_value_as_key']) ? $input[
'select_value_as_key'] : 0;
6058 $translate = isset($input[
'select_translate']) ? $input[
'select_translate'] : 0;
6059 $maxlen = isset($input[
'select_maxlen']) ? $input[
'select_maxlen'] : 0;
6060 $disabled = isset($input[
'select_disabled']) ? $input[
'select_disabled'] : 0;
6061 $sort = isset($input[
'select_sort']) ? $input[
'select_sort'] :
'';
6063 $more .=
'<div class="tagtr"><div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' ' . $input[
'tdclass'])) .
'">';
6064 if (!empty($input[
'label'])) {
6065 $more .= $input[
'label'] .
'</div><div class="tagtd left">';
6067 if ($input[
'type'] ==
'select') {
6068 $more .= $this->
selectarray($input[
'name'], $input[
'values'], isset($input[
'default']) ? $input[
'default'] :
'-1', $show_empty, $key_in_label, $value_as_key, $moreattr, $translate, $maxlen, $disabled, $sort, $morecss);
6070 $more .= $this->
multiselectarray($input[
'name'], $input[
'values'], is_array($input[
'default']) ? $input[
'default'] : [$input[
'default']], $key_in_label, $value_as_key, $morecss, $translate, $maxlen, $moreattr);
6072 $more .=
'</div></div>' .
"\n";
6073 } elseif ($input[
'type'] ==
'checkbox') {
6074 $more .=
'<div class="tagtr">';
6075 $more .=
'<div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' ' . $input[
'tdclass'])) .
'"><label for="' .
dol_escape_htmltag($input[
'name']) .
'">' . $input[
'label'] .
'</label></div><div class="tagtd">';
6076 $more .=
'<input type="checkbox" class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" id="' .
dol_escape_htmltag($input[
'name']) .
'" name="' .
dol_escape_htmltag($input[
'name']) .
'"' . $moreattr;
6077 if (!is_bool($input[
'value']) && $input[
'value'] !=
'false' && $input[
'value'] !=
'0' && $input[
'value'] !=
'') {
6078 $more .=
' checked';
6080 if (is_bool($input[
'value']) && $input[
'value']) {
6081 $more .=
' checked';
6083 if (isset($input[
'disabled'])) {
6084 $more .=
' disabled';
6086 $more .=
' /></div>';
6087 $more .=
'</div>' .
"\n";
6088 } elseif ($input[
'type'] ==
'radio') {
6090 foreach ($input[
'values'] as $selkey => $selval) {
6091 $more .=
'<div class="tagtr">';
6092 if (isset($input[
'label'])) {
6094 $more .=
'<div class="tagtd' . (empty($input[
'tdclass']) ?
' tdtop' : (
' tdtop ' . $input[
'tdclass'])) .
'">' . $input[
'label'] .
'</div>';
6096 $more .=
'<div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' "' . $input[
'tdclass'])) .
'"> </div>';
6099 $more .=
'<div class="tagtd' . ($i == 0 ?
' tdtop' :
'') .
'"><input type="radio" class="flat' . $morecss .
'" id="' .
dol_escape_htmltag($input[
'name'] . $selkey) .
'" name="' .
dol_escape_htmltag($input[
'name']) .
'" value="' . $selkey .
'"' . $moreattr;
6100 if (!empty($input[
'disabled'])) {
6101 $more .=
' disabled';
6103 if (isset($input[
'default']) && $input[
'default'] === $selkey) {
6104 $more .=
' checked="checked"';
6107 $more .=
'<label for="' .
dol_escape_htmltag($input[
'name'] . $selkey) .
'" class="valignmiddle">' . $selval .
'</label>';
6108 $more .=
'</div></div>' .
"\n";
6111 } elseif ($input[
'type'] ==
'date' || $input[
'type'] ==
'datetime') {
6112 $more .=
'<div class="tagtr"><div class="tagtd' . (empty($input[
'tdclass']) ?
'' : (
' ' . $input[
'tdclass'])) .
'">' . $input[
'label'] .
'</div>';
6113 $more .=
'<div class="tagtd">';
6114 $addnowlink = (empty($input[
'datenow']) ? 0 : 1);
6116 if ($input[
'type'] ==
'datetime') {
6117 $h = isset($input[
'hours']) ? $input[
'hours'] : 1;
6118 $m = isset($input[
'minutes']) ? $input[
'minutes'] : 1;
6120 $more .= $this->
selectDate(isset($input[
'value']) ? $input[
'value'] : -1, $input[
'name'], $h, $m, 0,
'', 1, $addnowlink);
6121 $more .=
'</div></div>'.
"\n";
6122 $formquestion[] = array(
'name' => $input[
'name'].
'day');
6123 $formquestion[] = array(
'name' => $input[
'name'].
'month');
6124 $formquestion[] = array(
'name' => $input[
'name'].
'year');
6125 $formquestion[] = array(
'name' => $input[
'name'].
'hour');
6126 $formquestion[] = array(
'name' => $input[
'name'].
'min');
6127 } elseif ($input[
'type'] ==
'other') {
6128 $more .=
'<div class="tagtr"><div class="tagtd'.(empty($input[
'tdclass']) ?
'' : (
' '.$input[
'tdclass'])).
'">';
6129 if (!empty($input[
'label'])) {
6130 $more .= $input[
'label'] .
'</div><div class="tagtd">';
6132 if (!empty($input[
'value'])) {
6133 $more .= $input[
'value'];
6135 $more .=
'</div></div>' .
"\n";
6136 } elseif ($input[
'type'] ==
'onecolumn') {
6137 $moreonecolumn .=
'<div class="margintoponly">';
6138 $moreonecolumn .= $input[
'value'];
6139 $moreonecolumn .=
'</div>' .
"\n";
6140 } elseif ($input[
'type'] ==
'hidden') {
6142 } elseif ($input[
'type'] ==
'separator') {
6145 $more .=
'Error type ' . $input[
'type'] .
' for the confirm box is not a supported type';
6149 $more .=
'</div>' .
"\n";
6150 $more .= $moreonecolumn;
6156 if (!empty(
$conf->dol_use_jmobile)) {
6159 if (empty(
$conf->use_javascript_ajax)) {
6165 $dialogconfirm =
'dialog-confirm';
6167 if (!is_numeric($useajax)) {
6171 $dialogconfirm .=
'-' . $button;
6173 $pageyes = $page . (preg_match(
'/\?/', $page) ?
'&' :
'?') .
'action=' . urlencode($action) .
'&confirm=yes';
6174 $pageno = ($useajax == 2 ? $page . (preg_match(
'/\?/', $page) ?
'&' :
'?') .
'action=' . urlencode($action) .
'&confirm=no' :
'');
6177 if (is_array($formquestion)) {
6178 foreach ($formquestion as $key => $input) {
6181 if (is_array($input) && isset($input[
'name'])) {
6182 if (strpos($input[
'name'],
',') > 0) {
6183 $inputok = array_merge($inputok, explode(
',', $input[
'name']));
6185 array_push($inputok, $input[
'name']);
6190 if (is_array($input) && isset($input[
'inputko']) && $input[
'inputko'] == 1 && isset($input[
'name'])) {
6191 array_push($inputko, $input[
'name']);
6197 $formconfirm .=
'<div id="' . $dialogconfirm .
'" title="' .
dol_escape_htmltag($title) .
'" style="display: none;">';
6198 if (is_array($formquestion) && array_key_exists(
'text', $formquestion) && !empty($formquestion[
'text'])) {
6199 $formconfirm .=
'<div class="confirmtext">' . $formquestion[
'text'] .
'</div>' .
"\n";
6201 if (!empty($more)) {
6202 $formconfirm .=
'<div class="confirmquestions">' . $more .
'</div>' .
"\n";
6204 $formconfirm .= ($question ?
'<div class="confirmmessage">' .
img_help(0,
'') .
' ' . $question .
'</div>' :
'');
6205 $formconfirm .=
'</div>' .
"\n";
6207 $formconfirm .=
"\n<!-- begin code of popup for formconfirm page=" . $page .
" -->\n";
6208 $formconfirm .=
'<script nonce="' .
getNonce() .
'" type="text/javascript">' .
"\n";
6209 $formconfirm .=
"/* Code for the jQuery('#dialogforpopup').dialog() */\n";
6210 $formconfirm .=
'jQuery(document).ready(function() {
6212 $( "#' . $dialogconfirm .
'" ).dialog(
6214 autoOpen: ' . ($autoOpen ?
"true" :
"false") .
',';
6215 if ($newselectedchoice ==
'no') {
6218 $(this).parent().find("button.ui-button:eq(2)").focus();
6223 if ($useajax == 1) {
6224 $jsforcursor =
'// The call to urljump can be slow, so we set the wait cursor' .
"\n";
6225 $jsforcursor .=
'jQuery("html,body,#id-container").addClass("cursorwait");' .
"\n";
6228 $postconfirmas =
'GET';
6235 closeOnEscape:
false,
6237 "' . dol_escape_js($langs->transnoentities($labelbuttonyes)) . '":
function() {
6238 var options =
"token=' . urlencode(newToken()) . '";
6239 var inputok =
' . json_encode($inputok) . ';
6240 var page = \
'' .
dol_escape_js(!empty($page) ? $page :
'') .
'\';
6241 var pageyes = \
'' .
dol_escape_js(!empty($pageyes) ? $pageyes :
'') .
'\';
6243 if (inputok.length > 0) {
6244 $.each(inputok,
function(i, inputname) {
6247 if ($(
"input[name=\'" + inputname +
"\']").attr(
"type") ==
"radio") {
6248 inputvalue = $(
"input[name=\'" + inputname +
"\']:checked").val();
6250 if ($(
"#" + inputname).attr(
"type") ==
"checkbox") { more =
":checked"; }
6251 inputvalue = $(
"#" + inputname + more).val();
6253 if (typeof inputvalue ==
"undefined") { inputvalue=
""; }
6254 console.log(
"formconfirm check inputname="+inputname+
" inputvalue="+inputvalue);
6255 options +=
"&" + inputname +
"=" + encodeURIComponent(inputvalue);
6258 var urljump = pageyes + (pageyes.indexOf(
"?") < 0 ?
"?" :
"&") + options;
6259 if (pageyes.length > 0) {
';
6260 if ($postconfirmas == 'GET
') {
6261 $formconfirm .= 'location.href = urljump;
';
6263 $formconfirm .= $jsforcursor;
6264 $formconfirm .= 'var post = $.post(
6267 function(data) { $(
"body").html(data); jQuery(
"html,body,#id-container").removeClass(
"cursorwait"); }
6271 console.log(
"after post ok");
6273 $(
this).dialog(
"close");
6275 "' . dol_escape_js($langs->transnoentities($labelbuttonno)) . '":
function() {
6276 var options =
"token=' . urlencode(newToken()) . '";
6277 var inputko =
' . json_encode($inputko) . ';
6278 var page =
"' . dol_escape_js(!empty($page) ? $page : '') . '";
6279 var pageno=
"' . dol_escape_js(!empty($pageno) ? $pageno : '') . '";
6280 if (inputko.length > 0) {
6281 $.each(inputko,
function(i, inputname) {
6283 if ($(
"#" + inputname).attr(
"type") ==
"checkbox") { more =
":checked"; }
6284 var inputvalue = $(
"#" + inputname + more).val();
6285 if (typeof inputvalue ==
"undefined") { inputvalue=
""; }
6286 options +=
"&" + inputname +
"=" + encodeURIComponent(inputvalue);
6289 var urljump=pageno + (pageno.indexOf(
"?") < 0 ?
"?" :
"&") + options;
6291 if (pageno.length > 0) {
';
6292 if ($postconfirmas == 'GET
') {
6293 $formconfirm .= 'location.href = urljump;
';
6295 $formconfirm .= $jsforcursor;
6296 $formconfirm .= 'var post = $.post(
6299 function(data) { $(
"body").html(data); jQuery(
"html,body,#id-container").removeClass(
"cursorwait"); }
6303 console.log(
"after post ko");
6305 $(
this).dialog(
"close");
6311 var
button =
"' . $button . '";
6313 $(
"#" +
button ).click(
function() {
6314 $(
"#' . $dialogconfirm . '").dialog(
"open");
6320 $formconfirm .= "<!-- end ajax formconfirm -->\n";
6322 $formconfirm .= "\n<!-- begin formconfirm page=" . dol_escape_htmltag($page) . " -->\n";
6324 if (empty($disableformtag)) {
6325 $formconfirm .= '<form method=
"POST" action=
"' . $page . '" class=
"notoptoleftnoright">
' . "\n";
6328 $formconfirm .= '<input
type=
"hidden" name=
"action" value=
"' . $action . '">
' . "\n";
6329 $formconfirm .= '<input
type=
"hidden" name=
"token" value=
"' . newToken() . '">
' . "\n";
6331 $formconfirm .= '<
table class=
"valid centpercent">
' . "\n";
6334 $formconfirm .= '<tr
class=
"validtitre"><td
class=
"validtitre" colspan=
"2">
';
6335 $formconfirm .= img_picto('', 'pictoconfirm
') . ' ' . $title;
6336 $formconfirm .= '</td></tr>
' . "\n";
6339 if (is_array($formquestion) && array_key_exists('text
', $formquestion) && !empty($formquestion['text
'])) {
6340 $formconfirm .= '<tr
class=
"valid"><td
class=
"valid" colspan=
"2">
' . $formquestion['text
'] . '</td></tr>
' . "\n";
6345 $formconfirm .= '<tr
class=
"valid"><td
class=
"valid" colspan=
"2">
' . "\n";
6346 $formconfirm .= $more;
6347 $formconfirm .= '</td></tr>
' . "\n";
6350 // Line with question
6351 $formconfirm .= '<tr
class=
"valid">
';
6352 $formconfirm .= '<td
class=
"valid">
' . $question . '</td>
';
6353 $formconfirm .= '<td
class=
"valid center">
';
6354 $formconfirm .= $this->selectyesno("confirm", $newselectedchoice, 0, false, 0, 0, 'marginleftonly marginrightonly
', $labelbuttonyes, $labelbuttonno);
6355 $formconfirm .= '<input
class=
"button valignmiddle confirmvalidatebutton small" type=
"submit" value=
"' . $langs->trans("Validate") . '">
';
6356 $formconfirm .= '</td>
';
6357 $formconfirm .= '</tr>
' . "\n";
6359 $formconfirm .= '</
table>
' . "\n";
6361 if (empty($disableformtag)) {
6362 $formconfirm .= "</form>\n";
6364 $formconfirm .= '<br>
';
6366 if (!empty($conf->use_javascript_ajax)) {
6367 $formconfirm .= '<!-- code to disable
button to avoid
double clic -->
';
6368 $formconfirm .= '<script nonce=
"' . getNonce() . '" type=
"text/javascript">
' . "\n";
6370 $(document).ready(
function () {
6371 $(
".confirmvalidatebutton").on(
"click",
function() {
6372 console.log(
"We click on button confirmvalidatebutton");
6373 $(
this).attr(
"disabled",
"disabled");
6374 setTimeout(\
'$(".confirmvalidatebutton").removeAttr("disabled")\', 3000);
6375 //console.log($(this).closest("form"));
6376 $(this).closest("form").submit();
6380 $formconfirm .=
'</script>' .
"\n";
6383 $formconfirm .=
"<!-- end formconfirm -->\n";
6386 return $formconfirm;
6407 public function form_project($page, $socid, $selected =
'', $htmlname =
'projectid', $discard_closed = 0, $maxlength = 20, $forcefocus = 0, $nooutput = 0, $textifnoproject =
'', $morecss =
'')
6412 require_once DOL_DOCUMENT_ROOT .
'/core/lib/project.lib.php';
6413 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
6419 $langs->load(
"project");
6420 if ($htmlname !=
"none") {
6421 $out .=
'<form method="post" action="' . $page .
'">';
6422 $out .=
'<input type="hidden" name="action" value="classin">';
6423 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6424 $out .= $formproject->select_projects($socid, $selected, $htmlname, $maxlength, 0, 1, $discard_closed, $forcefocus, 0, 0,
'', 1, 0, $morecss);
6425 $out .=
'<input type="submit" class="button smallpaddingimp" value="' . $langs->trans(
"Modify") .
'">';
6428 $out .=
'<span class="project_head_block">';
6430 $projet =
new Project($this->db);
6431 $projet->fetch((
int) $selected);
6432 $out .= $projet->getNomUrl(0,
'', 1);
6434 $out .=
'<span class="opacitymedium">' . $textifnoproject .
'</span>';
6439 if (empty($nooutput)) {
6463 public function form_conditions_reglement($page, $selected =
'', $htmlname =
'cond_reglement_id', $addempty = 0, $type =
'', $filtertype = -1, $deposit_percent = -1, $nooutput = 0)
6470 if ($htmlname !=
"none") {
6471 $out .=
'<form method="POST" action="' . $page .
'">';
6472 $out .=
'<input type="hidden" name="action" value="setconditions">';
6473 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6475 $out .=
'<input type="hidden" name="type" value="' .
dol_escape_htmltag($type) .
'">';
6477 $out .= $this->getSelectConditionsPaiements((
int) $selected, $htmlname, $filtertype, $addempty, 0,
'', $deposit_percent);
6478 $out .=
'<input type="submit" class="button valignmiddle smallpaddingimp" value="' . $langs->trans(
"Modify") .
'">';
6482 $this->load_cache_conditions_paiements();
6483 if (isset($this->cache_conditions_paiements[$selected])) {
6484 $label = $this->cache_conditions_paiements[$selected][
'label'];
6486 if (!empty($this->cache_conditions_paiements[$selected][
'deposit_percent'])) {
6487 $label = str_replace(
'__DEPOSIT_PERCENT__', $deposit_percent > 0 ? $deposit_percent : $this->cache_conditions_paiements[$selected][
'deposit_percent'], $label);
6492 $langs->load(
'errors');
6493 $out .= $langs->trans(
'ErrorNotInDictionaryPaymentConditions');
6500 if (empty($nooutput)) {
6525 if ($htmlname !=
'none') {
6526 $out .=
'<form method="POST" action="' . $page .
'">';
6527 $out .=
'<input type="hidden" name="action" value="setruleforlinesdates">';
6528 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6529 $out .= $this->getSelectRuleForLinesDates($selected, $htmlname, $addempty);
6530 $out .=
'<input type="submit" class="button valignmiddle smallpaddingimp" value="' . $langs->trans(
"Modify") .
'">';
6533 if (isset($selected)) {
6534 $this->load_cache_rule_for_lines_dates();
6535 if (isset($this->cache_rule_for_lines_dates[$selected])) {
6536 $label = $this->cache_rule_for_lines_dates[$selected];
6537 $out .= $langs->trans($label);
6544 if (empty($nooutput)) {
6567 if ($htmlname !=
"none") {
6568 print
'<form method="post" action="' . $page .
'">';
6569 print
'<input type="hidden" name="action" value="setavailability">';
6570 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6571 $this->selectAvailabilityDelay($selected, $htmlname,
'', $addempty);
6572 print
'<input type="submit" name="modify" class="button smallpaddingimp" value="' . $langs->trans(
"Modify") .
'">';
6573 print
'<input type="submit" name="cancel" class="button smallpaddingimp" value="' . $langs->trans(
"Cancel") .
'">';
6577 $this->load_cache_availability();
6578 print $this->cache_availability[$selected][
'label'];
6595 public function formInputReason($page, $selected =
'', $htmlname =
'demandreason', $addempty = 0)
6598 if ($htmlname !=
"none") {
6599 print
'<form method="post" action="' . $page .
'">';
6600 print
'<input type="hidden" name="action" value="setdemandreason">';
6601 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6602 $this->selectInputReason($selected, $htmlname,
'-1', $addempty);
6603 print
'<input type="submit" class="button smallpaddingimp" value="' . $langs->trans(
"Modify") .
'">';
6607 $this->loadCacheInputReason();
6608 foreach ($this->cache_demand_reason as $key => $val) {
6609 if ($val[
'id'] == $selected) {
6610 print $val[
'label'];
6635 public function form_date($page, $selected, $htmlname, $displayhour = 0, $displaymin = 0, $nooutput = 0, $type =
'')
6642 if ($htmlname !=
"none") {
6643 $ret .=
'<form method="POST" action="' . $page .
'" name="form' . $htmlname .
'">';
6644 $ret .=
'<input type="hidden" name="action" value="set' . $htmlname .
'">';
6645 $ret .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6647 $ret .=
'<input type="hidden" name="type" value="' .
dol_escape_htmltag($type) .
'">';
6649 $ret .=
'<table class="nobordernopadding">';
6651 $ret .= $this->selectDate($selected, $htmlname, $displayhour, $displaymin, 1,
'form' . $htmlname, 1, 0);
6653 $ret .=
'<td class="left"><input type="submit" class="button smallpaddingimp" value="' . $langs->trans(
"Modify") .
'"></td>';
6654 $ret .=
'</tr></table></form>';
6663 if (empty($nooutput)) {
6682 public function form_users($page, $selected =
'', $htmlname =
'userid', $exclude = array(), $include = array())
6687 if ($htmlname !=
"none") {
6688 print
'<form method="POST" action="' . $page .
'" name="form' . $htmlname .
'">';
6689 print
'<input type="hidden" name="action" value="set' . $htmlname .
'">';
6690 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6691 print $this->select_dolusers($selected, $htmlname, 1, $exclude, 0, $include);
6692 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
6696 require_once DOL_DOCUMENT_ROOT .
'/user/class/user.class.php';
6697 $theuser =
new User($this->db);
6698 $theuser->fetch((
int) $selected);
6699 print $theuser->getNomUrl(1);
6722 public function form_modes_reglement($page, $selected =
'', $htmlname =
'mode_reglement_id', $filtertype =
'', $active = 1, $addempty = 0, $type =
'', $nooutput = 0)
6728 if ($htmlname !=
"none") {
6729 $out .=
'<form method="POST" action="' . $page .
'">';
6730 $out .=
'<input type="hidden" name="action" value="setmode">';
6731 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6733 $out .=
'<input type="hidden" name="type" value="' .
dol_escape_htmltag($type) .
'">';
6735 $out .= $this->select_types_paiements($selected, $htmlname, $filtertype, 0, $addempty, 0, 0, $active,
'', 1);
6736 $out .=
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
6740 $this->load_cache_types_paiements();
6741 $out .= $this->cache_types_paiements[$selected][
'label'];
6768 if ($htmlname !=
"none") {
6769 print
'<form method="POST" action="' . $page .
'">';
6770 print
'<input type="hidden" name="action" value="settransportmode">';
6771 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6772 $this->selectTransportMode($selected, $htmlname, 0, $addempty, 0, 0, $active);
6773 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
6777 $this->load_cache_transport_mode();
6778 print $this->cache_transport_mode[$selected][
'label'];
6799 if ($htmlname !=
"none") {
6800 print
'<form method="POST" action="' . $page .
'">';
6801 print
'<input type="hidden" name="action" value="setmulticurrencycode">';
6802 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6803 print $this->selectMultiCurrency($selected, $htmlname, 0);
6804 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
6807 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
6808 print !empty($selected) ?
currency_name($selected, 1) :
' ';
6826 global $langs,
$conf;
6828 if ($htmlname !=
"none") {
6829 print
'<form method="POST" action="' . $page .
'">';
6830 print
'<input type="hidden" name="action" value="setmulticurrencyrate">';
6831 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6832 print
'<input type="text" class="maxwidth75" name="' . $htmlname .
'" value="' . (!empty($rate) ?
price(
price2num($rate,
'CU')) : 1) .
'" /> ';
6833 print
'<select name="calculation_mode" id="calculation_mode">';
6834 print
'<option value="1">Change ' . $langs->trans(
"PriceUHT") .
' of lines</option>';
6835 print
'<option value="2">Change ' . $langs->trans(
"PriceUHTCurrency") .
' of lines</option>';
6838 print
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
6841 if (!empty($rate)) {
6842 print
price($rate, 1, $langs, 0, 0);
6843 if ($currency && $rate != 1) {
6844 print
' <span class="opacitymedium">(' .
price($rate, 1, $langs, 0, 0) .
' ' . $currency .
' = 1 ' .
$conf->currency .
')</span>';
6869 public function form_remise_dispo($page, $selected, $htmlname, $socid, $amount, $filter =
'', $maxvalue = 0, $more =
'', $hidelist = 0, $discount_type = 0)
6872 global
$conf, $langs;
6874 if ($htmlname !=
"none") {
6875 print
'<form method="post" action="' . $page .
'">';
6876 print
'<input type="hidden" name="action" value="setabsolutediscount">';
6877 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6878 print
'<div class="inline-block">';
6879 if (!empty($discount_type)) {
6881 if (!$filter || $filter ==
"fk_invoice_supplier_source IS NULL") {
6882 $translationKey =
'HasAbsoluteDiscountFromSupplier';
6884 $translationKey =
'HasCreditNoteFromSupplier';
6887 if (!$filter || $filter ==
"fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')") {
6888 $translationKey =
'HasAbsoluteDiscountFromSupplier';
6890 $translationKey =
'HasCreditNoteFromSupplier';
6895 if (!$filter || $filter ==
"fk_facture_source IS NULL") {
6896 $translationKey =
'CompanyHasAbsoluteDiscount';
6898 $translationKey =
'CompanyHasCreditNote';
6901 if (!$filter || $filter ==
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')") {
6902 $translationKey =
'CompanyHasAbsoluteDiscount';
6904 $translationKey =
'CompanyHasCreditNote';
6908 print $langs->trans($translationKey,
price($amount, 0, $langs, 0, 0, -1,
$conf->currency));
6909 if (empty($hidelist)) {
6913 if (empty($hidelist)) {
6914 print
'<div class="inline-block" style="padding-right: 10px">';
6915 $newfilter =
'discount_type=' . intval($discount_type);
6916 if (!empty($discount_type)) {
6917 $newfilter .=
' AND fk_invoice_supplier IS NULL AND fk_invoice_supplier_line IS NULL';
6919 $newfilter .=
' AND fk_facture IS NULL AND fk_facture_line IS NULL';
6922 $newfilter .=
' AND (' . $filter .
')';
6925 $nbqualifiedlines = $this->select_remises((
string) $selected, $htmlname, $newfilter, $socid, $maxvalue);
6926 if ($nbqualifiedlines > 0) {
6927 print
' <input type="submit" class="button smallpaddingimp" value="' .
dol_escape_htmltag($langs->trans(
"UseLine")) .
'"';
6928 if (!empty($discount_type) && $filter && $filter !=
"fk_invoice_supplier_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS PAID)%')") {
6929 print
' title="' . $langs->trans(
"UseCreditNoteInInvoicePayment") .
'"';
6931 if (empty($discount_type) && $filter && $filter !=
"fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')") {
6932 print
' title="' . $langs->trans(
"UseCreditNoteInInvoicePayment") .
'"';
6940 print
'<div class="inline-block">';
6966 public function form_contacts($page, $societe, $selected =
'', $htmlname =
'contactid')
6971 if ($htmlname !=
"none") {
6972 print
'<form method="post" action="' . $page .
'">';
6973 print
'<input type="hidden" name="action" value="set_contact">';
6974 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
6975 print
'<table class="nobordernopadding">';
6977 print $this->selectcontacts($societe->id, $selected, $htmlname);
6980 $addcontact = (
getDolGlobalString(
'SOCIETE_ADDRESSES_MANAGEMENT') ? $langs->trans(
"AddContact") : $langs->trans(
"AddContactAddress"));
6981 print
'<a href="' . DOL_URL_ROOT .
'/contact/card.php?socid=' . $societe->id .
'&action=create&backtoreferer=1">' . $addcontact .
'</a>';
6984 print
'<td class="left"><input type="submit" class="button smallpaddingimp" value="' . $langs->trans(
"Modify") .
'"></td>';
6985 print
'</tr></table></form>';
6988 require_once DOL_DOCUMENT_ROOT .
'/contact/class/contact.class.php';
6989 $contact =
new Contact($this->db);
6990 $contact->fetch((
int) $selected);
6991 print $contact->getFullName($langs);
7016 public function form_thirdparty($page, $selected =
'', $htmlname =
'socid', $filter =
'', $showempty = 0, $showtype = 0, $forcecombo = 0, $events = array(), $nooutput = 0, $excludeids = array(), $textifnothirdparty =
'')
7022 if ($htmlname !=
"none") {
7023 $out .=
'<form method="post" action="' . $page .
'">';
7024 $out .=
'<input type="hidden" name="action" value="set_thirdparty">';
7025 $out .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
7026 $out .= $this->select_company($selected, $htmlname, $filter, $showempty, $showtype, $forcecombo, $events, 0,
'minwidth100',
'',
'', 1, array(),
false, $excludeids);
7027 $out .=
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
"Modify") .
'">';
7031 require_once DOL_DOCUMENT_ROOT .
'/societe/class/societe.class.php';
7032 $soc =
new Societe($this->db);
7033 $soc->fetch((
int) $selected);
7034 $out .= $soc->getNomUrl(0,
'');
7036 $out .=
'<span class="opacitymedium">' . $textifnothirdparty .
'</span>';
7062 print $this->selectCurrency($selected, $htmlname);
7074 public function selectCurrency($selected =
'', $htmlname =
'currency_id', $mode = 0, $useempty =
'')
7076 global $langs, $user;
7078 $langs->loadCacheCurrencies(
'');
7082 if ($selected ==
'euro' || $selected ==
'euros') {
7086 $out .=
'<select class="flat maxwidth200onsmartphone minwidth300" name="' . $htmlname .
'" id="' . $htmlname .
'">';
7088 $out .=
'<option value="-1" selected></option>';
7090 foreach ($langs->cache_currencies as $code_iso => $currency) {
7091 $labeltoshow = $currency[
'label'];
7093 $labeltoshow .=
' <span class="opacitymedium">(' . $code_iso .
')</span>';
7095 $labeltoshow .=
' <span class="opacitymedium">(' . $langs->getCurrencySymbol($code_iso) .
')</span>';
7098 if ($selected && $selected == $code_iso) {
7099 $out .=
'<option value="' . $code_iso .
'" selected data-html="' .
dol_escape_htmltag($labeltoshow) .
'">';
7101 $out .=
'<option value="' . $code_iso .
'" data-html="' .
dol_escape_htmltag($labeltoshow) .
'">';
7104 $out .=
'</option>';
7106 $out .=
'</select>';
7108 $out .=
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
7112 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
7130 public function selectMultiCurrency($selected =
'', $htmlname =
'multicurrency_code', $useempty = 0, $filter =
'', $excludeConfCurrency =
false, $morecss =
'maxwidth200 widthcentpercentminusx')
7132 global
$conf, $langs;
7134 $langs->loadCacheCurrencies(
'');
7136 $TCurrency = array();
7138 $sql =
"SELECT code FROM " . $this->db->prefix() .
"multicurrency";
7139 $sql .=
" WHERE entity IN ('" .
getEntity(
'multicurrency') .
"')";
7141 $sql .=
" AND " . $filter;
7143 $resql = $this->db->query($sql);
7145 while ($obj = $this->db->fetch_object($resql)) {
7146 $TCurrency[$obj->code] = $obj->code;
7151 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'" id="' . $htmlname .
'">';
7153 $out .=
'<option value=""> </option>';
7156 if (!in_array(
$conf->currency, $TCurrency) && !$excludeConfCurrency) {
7157 $TCurrency[
$conf->currency] =
$conf->currency;
7159 if (count($TCurrency) > 0) {
7160 foreach ($langs->cache_currencies as $code_iso => $currency) {
7161 if (isset($TCurrency[$code_iso])) {
7162 if (!empty($selected) && $selected == $code_iso) {
7163 $out .=
'<option value="' . $code_iso .
'" selected="selected">';
7165 $out .=
'<option value="' . $code_iso .
'">';
7168 $out .= $currency[
'label'];
7169 $out .=
' (' . $langs->getCurrencySymbol($code_iso) .
')';
7170 $out .=
'</option>';
7175 $out .=
'</select>';
7178 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
7195 global $langs, $user;
7197 $num = count($this->cache_vatrates);
7204 $sql =
"SELECT t.rowid, t.type_vat, t.code, t.taux, t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type, t.recuperableonly";
7205 $sql .=
" FROM ".$this->db->prefix().
"c_tva as t, ".$this->db->prefix().
"c_country as c";
7206 $sql .=
" WHERE t.fk_pays = c.rowid";
7207 $sql .=
" AND t.active > 0";
7208 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
7209 $sql .=
" AND c.code IN (" . $this->db->sanitize($country_code, 1) .
")";
7210 $sql .=
" ORDER BY t.code ASC, t.taux ASC, t.recuperableonly ASC";
7212 $resql = $this->db->query($sql);
7214 $num = $this->db->num_rows($resql);
7216 for ($i = 0; $i < $num; $i++) {
7217 $obj = $this->db->fetch_object($resql);
7219 $tmparray = array();
7220 $tmparray[
'rowid'] = $obj->rowid;
7221 $tmparray[
'type_vat'] = ($obj->type_vat <= 0 ? 0 : $obj->type_vat);
7222 $tmparray[
'code'] = $obj->code;
7223 $tmparray[
'txtva'] = $obj->taux;
7224 $tmparray[
'nprtva'] = $obj->recuperableonly;
7225 $tmparray[
'localtax1'] = $obj->localtax1;
7226 $tmparray[
'localtax1_type'] = $obj->localtax1_type;
7227 $tmparray[
'localtax2'] = $obj->localtax2;
7228 $tmparray[
'localtax2_type'] = $obj->localtax1_type;
7229 $tmparray[
'label'] = $obj->taux .
'%' . ($obj->code ?
' (' . $obj->code .
')' :
'');
7230 $tmparray[
'labelallrates'] = $obj->taux .
'/' . ($obj->localtax1 ? $obj->localtax1 :
'0') .
'/' . ($obj->localtax2 ? $obj->localtax2 :
'0') . ($obj->code ?
' (' . $obj->code .
')' :
'');
7231 $positiverates =
'';
7233 $positiverates .= ($positiverates ?
'/' :
'') . $obj->taux;
7235 if ($obj->localtax1) {
7236 $positiverates .= ($positiverates ?
'/' :
'') . $obj->localtax1;
7238 if ($obj->localtax2) {
7239 $positiverates .= ($positiverates ?
'/' :
'') . $obj->localtax2;
7241 if (empty($positiverates)) {
7242 $positiverates =
'0';
7244 $tmparray[
'labelpositiverates'] = $positiverates . ($obj->code ?
' (' . $obj->code .
')' :
'');
7246 $this->cache_vatrates[$obj->rowid] = $tmparray;
7251 $this->error =
'<span class="error">';
7252 $this->error .= $langs->trans(
"ErrorNoVATRateDefinedForSellerCountry", $country_code);
7254 if (!empty($user) && $user->admin && preg_match(
'/\'(..)\'/', $country_code, $reg)) {
7255 $langs->load(
"errors");
7256 $new_country_code = $reg[1];
7257 $country_id =
dol_getIdFromCode($this->db, $new_country_code,
'c_country',
'code',
'rowid');
7258 $this->error .=
'<br>'.$langs->trans(
"ErrorFixThisHere", DOL_URL_ROOT.
'/admin/dict.php?id=10'.($country_id > 0 ?
'&countryidforinsert='.$country_id :
''));
7260 $this->error .=
'</span>';
7264 $this->error =
'<span class="error">' . $this->db->error() .
'</span>';
7293 public function load_tva($htmlname =
'tauxtva', $selectedrate =
'', $societe_vendeuse =
null, $societe_acheteuse =
null, $idprod = 0, $info_bits = 0, $type =
'', $options_only =
false, $mode = 0, $type_vat = 0)
7296 global $langs, $mysoc, $hookmanager;
7298 $langs->load(
'errors');
7302 $hookmanager->initHooks(array(
'commonobject'));
7303 $info_bits == 1 ? $is_npr = 1 : $is_npr = 0;
7304 $parameters = array(
7305 'seller' => $societe_vendeuse,
7306 'buyer' => $societe_acheteuse,
7307 'idprod' => $idprod,
7308 'is_npr' => $is_npr,
7310 'options_only' => $options_only,
7312 'type_vat' => $type_vat
7314 $reshook = $hookmanager->executeHooks(
'load_tva', $parameters);
7316 return $hookmanager->resPrint;
7317 } elseif ($reshook === 0) {
7318 $return .= $hookmanager->resPrint;
7322 $defaultnpr = ($info_bits & 0x01);
7323 $defaultnpr = (preg_match(
'/\*/', $selectedrate) ? 1 : $defaultnpr);
7324 $defaulttx = str_replace(
'*',
'', $selectedrate);
7327 if (preg_match(
'/\((.*)\)/', $defaulttx, $reg)) {
7328 $defaultcode = $reg[1];
7329 $defaulttx = preg_replace(
'/\s*\(.*\)/',
'', $defaulttx);
7334 if (is_object($societe_vendeuse) && !$societe_vendeuse->country_code) {
7335 if ($societe_vendeuse->id == $mysoc->id) {
7336 $return .=
'<span class="error">' . $langs->trans(
"ErrorYourCountryIsNotDefined") .
'</span>';
7338 $return .=
'<span class="error">' . $langs->trans(
"ErrorSupplierCountryIsNotDefined") .
'</span>';
7349 if (is_object($societe_vendeuse)) {
7350 $code_country =
"'" . $societe_vendeuse->country_code .
"'";
7352 $code_country =
"'" . $mysoc->country_code .
"'";
7355 if ($societe_vendeuse == $mysoc &&
getDolGlobalString(
'SERVICE_ARE_ECOMMERCE_200238EC')) {
7356 require_once DOL_DOCUMENT_ROOT .
'/core/lib/company.lib.php';
7360 if (is_object($societe_vendeuse) && is_object($societe_acheteuse) &&
isInEEC($societe_vendeuse) &&
isInEEC($societe_acheteuse) && !$societe_acheteuse->isACompany()) {
7362 if (is_numeric($type)) {
7364 switch ($selectVatComboMode) {
7366 $code_country .=
",'" . $societe_acheteuse->country_code .
"'";
7369 $code_country =
"'" . $societe_acheteuse->country_code .
"'";
7373 } elseif (!$idprod) {
7374 switch ($selectVatComboMode) {
7376 $code_country .=
",'" . $societe_acheteuse->country_code .
"'";
7379 $code_country =
"'" . $societe_acheteuse->country_code .
"'";
7383 $prodstatic =
new Product($this->db);
7384 $prodstatic->fetch($idprod);
7386 $code_country .=
",'" . $societe_acheteuse->country_code .
"'";
7393 $this->load_cache_vatrates($code_country);
7396 $arrayofvatrates = array();
7397 foreach ($this->cache_vatrates as $cachevalue) {
7398 if (empty($cachevalue[
'type_vat']) || $cachevalue[
'type_vat'] == $type_vat) {
7399 $arrayofvatrates[] = $cachevalue;
7403 $num = count($arrayofvatrates);
7406 if ($defaulttx < 0 ||
dol_strlen($defaulttx) == 0) {
7408 $tmpthirdparty =
new Societe($this->db);
7409 $tmpthirdparty->country_code = $mysoc->country_code;
7411 $defaulttx =
get_default_tva(is_object($societe_vendeuse) ? $societe_vendeuse : $tmpthirdparty, (is_object($societe_acheteuse) ? $societe_acheteuse : $tmpthirdparty), $idprod);
7412 $defaultnpr =
get_default_npr(is_object($societe_vendeuse) ? $societe_vendeuse : $tmpthirdparty, (is_object($societe_acheteuse) ? $societe_acheteuse : $tmpthirdparty), $idprod);
7414 if (preg_match(
'/\((.*)\)/', $defaulttx, $reg)) {
7415 $defaultcode = $reg[1];
7416 $defaulttx = preg_replace(
'/\s*\(.*\)/',
'', $defaulttx);
7418 if (empty($defaulttx)) {
7425 if ($defaulttx < 0 ||
dol_strlen($defaulttx) == 0) {
7428 $defaulttx = $arrayofvatrates[$num - 1][
'txtva'];
7435 if (preg_match(
'/\((.*)\)/', $defaulttx, $reg)) {
7436 $defaultcode = $reg[1];
7437 $defaulttx = preg_replace(
'/\s*\(.*\)/',
'', $defaulttx);
7445 if (is_object($societe_vendeuse) && $societe_vendeuse->id == $mysoc->id && empty($societe_vendeuse->tva_assuj)) {
7455 if (!$options_only) {
7456 $return .=
'<select class="flat minwidth75imp maxwidth100 right" id="' . $htmlname .
'" name="' . $htmlname .
'"' . ($disabled ?
' disabled' :
'') . $title .
'>';
7459 $selectedfound =
false;
7460 foreach ($arrayofvatrates as $rate) {
7462 if ($disabled && $rate[
'txtva'] != 0) {
7467 $key = $rate[
'txtva'];
7468 $key .= $rate[
'nprtva'] ?
'*' :
'';
7469 if ($mode > 0 && $rate[
'code']) {
7470 $key .=
' (' . $rate[
'code'] .
')';
7473 $key = $rate[
'rowid'];
7476 $return .=
'<option value="' . $key .
'"';
7477 if (!$selectedfound) {
7479 if ($defaultcode == $rate[
'code']) {
7480 $return .=
' selected';
7481 $selectedfound =
true;
7483 } elseif ($rate[
'txtva'] == $defaulttx && $rate[
'nprtva'] == $defaultnpr) {
7484 $return .=
' selected';
7485 $selectedfound =
true;
7491 if ($mysoc->country_code ==
'IN' ||
getDolGlobalString(
'MAIN_VAT_LABEL_IS_POSITIVE_RATES')) {
7493 $return .= $rate[
'labelpositiverates'];
7496 $return .=
vatrate($rate[
'label']);
7500 $return .= (empty($rate[
'code']) && $rate[
'nprtva']) ?
' *' :
'';
7502 $return .=
'</option>';
7505 if (!$options_only) {
7506 $return .=
'</select>';
7510 $return .= $this->error;
7544 public function select_date($set_time =
'', $prefix =
're', $h = 0, $m = 0, $empty = 0, $form_name =
"", $d = 1, $addnowlink = 0, $nooutput = 0, $disabled = 0, $fullday = 0, $addplusone =
'', $adddateof =
'')
7547 dol_syslog(__METHOD__ .
': using select_date is deprecated. Use selectDate instead.', LOG_WARNING);
7548 $retstring = $this->selectDate($set_time, $prefix, $h, $m, $empty, $form_name, $d, $addnowlink, $disabled, $fullday, $addplusone, $adddateof);
7549 if (!empty($nooutput)) {
7572 public function selectDateToDate($set_time =
'', $set_time_end =
'', $prefix =
're', $empty = 0, $forcenewline = 0)
7576 $ret = $this->selectDate($set_time, $prefix .
'_start', 0, 0, $empty,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"),
'tzuserrel');
7577 if ($forcenewline) {
7580 $ret .= $this->selectDate($set_time_end, $prefix .
'_end', 0, 0, $empty,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"),
'tzuserrel');
7612 public function selectDate($set_time =
'', $prefix =
're', $h = 0, $m = 0, $empty = 0, $form_name =
"", $d = 1, $addnowlink = 0, $disabled = 0, $fullday =
'', $addplusone =
'', $adddateof =
'', $openinghours =
'', $stepminutes = 1, $labeladddateof =
'', $placeholder =
'', $gm =
'auto', $calendarpicto =
'')
7614 global
$conf, $langs;
7616 if ($gm ===
'auto') {
7617 $gm = (empty(
$conf) ?
'tzserver' :
$conf->tzuserinputkey);
7622 if ($prefix ==
'') {
7633 if ($stepminutes <= 0 || $stepminutes > 30) {
7644 $orig_set_time = $set_time;
7646 if ($set_time ===
'' && $emptydate == 0) {
7647 include_once DOL_DOCUMENT_ROOT .
'/core/lib/date.lib.php';
7648 if ($gm ==
'tzuser' || $gm ==
'tzuserrel') {
7660 if (!empty($set_time) && preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+)\s?([0-9]+)?:?([0-9]+)?/', (
string) $set_time, $reg)) {
7662 $syear = (!empty($reg[1]) ? $reg[1] :
'');
7663 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
7664 $sday = (!empty($reg[3]) ? $reg[3] :
'');
7665 $shour = (!empty($reg[4]) ? $reg[4] :
'');
7666 $smin = (!empty($reg[5]) ? $reg[5] :
'');
7667 } elseif (strval($set_time) !=
'' && $set_time != -1) {
7672 if ($orig_set_time !=
'') {
7686 if ($h == 3 || $h == 4) {
7697 $usecalendar =
'combo';
7703 $usecalendar =
'html';
7708 if ($usecalendar !=
'combo') {
7709 $formatted_date =
'';
7711 if (strval($set_time) !=
'' && $set_time != -1) {
7713 $formatted_date =
dol_print_date($set_time, $langs->trans(
"FormatDateShortInput"), $gm);
7717 if ($usecalendar ==
"eldy") {
7744 } elseif ($usecalendar ==
'jquery' || $usecalendar ==
'html') {
7745 if (!$disabled && $usecalendar !=
'html') {
7747 $minYear =
getDolGlobalInt(
'MIN_YEAR_SELECT_DATE', (idate(
'Y') - 100));
7748 $maxYear =
getDolGlobalInt(
'MAX_YEAR_SELECT_DATE', (idate(
'Y') + 100));
7750 $retstring .=
'<!-- datepicker usecalendar='.$usecalendar.
' --><script nonce="' .
getNonce() .
'" type="text/javascript">';
7751 $retstring .=
"$(function(){ $('#" . $prefix .
"').datepicker({
7752 dateFormat: '" . $langs->trans(
"FormatDateShortJQueryInput") .
"',
7754 todayHighlight: true,
7755 yearRange: '" . $minYear .
":" . $maxYear .
"',";
7756 if (!empty(
$conf->dol_use_jmobile)) {
7758 beforeShow: function (input, datePicker) {
7759 input.disabled = true;
7761 onClose: function (dateText, datePicker) {
7762 this.disabled = false;
7768 $buttonImage = $calendarpicto ?: DOL_URL_ROOT .
"/theme/" .
dol_escape_js(
$conf->theme) .
"/img/object_calendarday.png";
7770 showOn: 'button', /* both has problem with autocompletion */
7771 buttonImage: '" . $buttonImage .
"',
7772 buttonImageOnly: true";
7776 $retstring .=
"</script>";
7780 $retstring .=
'<div class="nowraponall inline-block divfordateinput">';
7781 $retstring .=
'<input id="'.$prefix.
'" name="'.$prefix.
'" type="'.($usecalendar ==
'html' ?
"date" :
"text").
'" class="maxwidthdate center" maxlength="11" value="'.$formatted_date.
'"';
7782 $retstring .= ($disabled ?
' disabled' :
'');
7783 $retstring .= ($placeholder ?
' placeholder="' .
dol_escape_htmltag($placeholder) .
'"' :
'');
7784 $retstring .=
' onChange="dpChangeDay(\'' .
dol_escape_js($prefix) .
'\',\
'' .
dol_escape_js($usecalendar ==
'html' ?
'yyyy-MM-dd' : $langs->trans(
"FormatDateShortJavaInput")) .
'\');
"'; // FormatDateShortInput for dol_print_date / FormatDateShortJavaInput that is same for javascript
7785 $retstring .= ' autocomplete="off
">';
7789 $retstringbutton = '<button id="' . $prefix . 'Button
" type="button" class="dpInvisibleButtons
">' . img_object($langs->trans("Disabled
"), 'calendarday', 'class="datecallink
"') . '</button>';
7790 $retstring = $retstringbutton . $retstring;
7793 $retstring .= '</div>';
7794 $retstring .= '<input type="hidden
" id="' . $prefix . 'day
" name="' . $prefix . 'day
" value="' . $sday . '">' . "\n
";
7795 $retstring .= '<input type="hidden
" id="' . $prefix . 'month
" name="' . $prefix . 'month
" value="' . $smonth . '">' . "\n
";
7796 $retstring .= '<input type="hidden
" id="' . $prefix . 'year
" name="' . $prefix . 'year
" value="' . $syear . '">' . "\n
";
7798 $retstring .= "Bad value of MAIN_POPUP_CALENDAR
";
7801 // Show date with combo selects
7803 $retstring .= '<select' . ($disabled ? ' disabled' : '') . ' class="flat valignmiddle maxwidth50imp
" id="' . $prefix . 'day
" name="' . $prefix . 'day
">';
7805 if ($emptydate || $set_time == -1) {
7806 $retstring .= '<option value="0
" selected> </option>';
7809 for ($day = 1; $day <= 31; $day++) {
7810 $retstring .= '<option value="' . $day . '"' . ($day == $sday ? ' selected' : '') . '>' . $day . '</option>';
7813 $retstring .= "</select>
";
7815 $retstring .= '<select' . ($disabled ? ' disabled' : '') . ' class="flat valignmiddle maxwidth75imp
" id="' . $prefix . 'month
" name="' . $prefix . 'month
">';
7816 if ($emptydate || $set_time == -1) {
7817 $retstring .= '<option value="0
" selected> </option>';
7821 for ($month = 1; $month <= 12; $month++) {
7822 $retstring .= '<option value="' . $month . '"' . ($month == $smonth ? ' selected' : '') . '>';
7823 $retstring .= dol_print_date(mktime(12, 0, 0, $month, 1, 2000), "%b
");
7824 $retstring .= "</option>
";
7826 $retstring .= "</select>
";
7829 if ($emptydate || $set_time == -1) {
7830 $retstring .= '<input' . ($disabled ? ' disabled' : '') . ' placeholder="' . dol_escape_htmltag($langs->trans("Year")) . '" class="flat maxwidth50imp valignmiddle
" type="number
" min="0
" max="3000
" maxlength="4
" id="' . $prefix . 'year
" name="' . $prefix . 'year
" value="' . $syear . '">';
7832 $retstring .= '<select' . ($disabled ? ' disabled' : '') . ' class="flat valignmiddle maxwidth75imp
" id="' . $prefix . 'year
" name="' . $prefix . 'year
">';
7834 $syear = (int) $syear;
7835 for ($year = $syear - 10; $year < (int) $syear + 10; $year++) {
7836 $retstring .= '<option value="' . $year . '"' . ($year == $syear ? ' selected' : '') . '>' . $year . '</option>';
7838 $retstring .= "</select>\n
";
7844 $retstring .= (($h == 2 || $h == 4) ? '<br>' : ' ');
7845 $retstring .= '<span class="nowraponall
">';
7851 if ($openinghours != '') {
7852 $openinghours = explode(',', $openinghours);
7853 $hourstart = $openinghours[0];
7854 $hourend = $openinghours[1];
7855 if ($hourend < $hourstart) {
7856 $hourend = $hourstart;
7861 $retstring .= '<select' . ($disabled ? ' disabled' : '') . ' class="flat valignmiddle maxwidth50
' . ($fullday ? $fullday . 'hour
' : '') . '" id="' . $prefix . 'hour
" name="' . $prefix . 'hour
">';
7863 $retstring .= '<option value="-1
"> </option>';
7865 for ($hour = $hourstart; $hour < $hourend; $hour++) {
7866 if (strlen($hour) < 2) {
7867 $hour = "0
" . $hour;
7869 $retstring .= '<option value="' . $hour . '"' . (($hour == $shour) ? ' selected' : '') . '>' . $hour;
7870 $retstring .= '</option>';
7872 $retstring .= '</select>';
7875 $retstring .= '<input type="hidden
" id="' . $prefix . 'hour
" name="' . $prefix . 'hour
" value="' . $shour . '">' . "\n
";
7884 $retstring .= '<select ' . ($disabled ? ' disabled' : '') . ' class="flat valignmiddle maxwidth50
' . ($fullday ? $fullday . 'min
' : '') . '" id="' . $prefix . 'min
" name="' . $prefix . 'min
">';
7886 $retstring .= '<option value="-1
"> </option>';
7888 for ($min = 0; $min < 60; $min += $stepminutes) {
7889 $min_str = sprintf("%02d
", $min);
7890 $retstring .= '<option value="' . $min_str . '"' . (($min_str == $smin) ? ' selected' : '') . '>' . $min_str . '</option>';
7892 $retstring .= '</select>';
7894 $retstring .= '<input type="hidden
" id="' . $prefix . 'min
" name="' . $prefix . 'min
" value="' . $smin . '">' . "\n
";
7897 $retstring .= '<input type="hidden
" name="' . $prefix . 'sec
" value="' . $ssec . '">';
7901 $retstring .= '</span>';
7905 if (!empty($conf->use_javascript_ajax) && $addnowlink && !$disabled) {
7906 // Script which will be inserted in the onClick of the "Now
" link
7907 $reset_scripts = "";
7908 if ($addnowlink == 2) { // local computer time
7909 // pad add leading 0 on numbers
7910 $reset_scripts .= "Number.prototype.pad =
function(size) {
7911 var s = String(
this);
7912 while (s.length < (size || 2)) {s =
'0' + s;}
7915 var d =
new Date();
";
7918 // Generate the date part, depending on the use or not of the javascript calendar
7919 if ($addnowlink == 1) { // server time expressed in user time setup
7920 $reset_scripts .= 'jQuery(\'#' . $prefix . '\').val(\'' . dol_print_date($nowgmt, 'day', 'tzuserrel') . '\');';
7921 $reset_scripts .= 'jQuery(\'#' . $prefix . 'day\').val(\'' . dol_print_date($nowgmt, '%d', 'tzuserrel') . '\');';
7922 $reset_scripts .= 'jQuery(\'#' . $prefix . 'month\').val(\'' . dol_print_date($nowgmt, '%m', 'tzuserrel') . '\');';
7923 $reset_scripts .= 'jQuery(\'#' . $prefix . 'year\').val(\'' . dol_print_date($nowgmt, '%Y', 'tzuserrel') . '\');';
7924 } elseif ($addnowlink == 2) {
7925 /* Disabled because the output does not use the string format defined by FormatDateShort key to forge the value into #prefix.
7926 * This break application for foreign languages.
7927 $reset_scripts .= 'jQuery(\'#'.$prefix.'\').val(d.toLocaleDateString(\''.str_replace('_', '-', $langs->defaultlang).'\'));';
7928 $reset_scripts .= 'jQuery(\'#'.$prefix.'day\').val(d.getDate().pad());';
7929 $reset_scripts .= 'jQuery(\'#'.$prefix.'month\').val(parseInt(d.getMonth().pad()) + 1);';
7930 $reset_scripts .= 'jQuery(\'#'.$prefix.'year\').val(d.getFullYear());';
7932 $reset_scripts .= 'jQuery(\'#' . $prefix . '\').val(\'' . dol_print_date($nowgmt, 'day', 'tzuserrel') . '\');';
7933 $reset_scripts .= 'jQuery(\'#' . $prefix . 'day\').val(\'' . dol_print_date($nowgmt, '%d', 'tzuserrel') . '\');';
7934 $reset_scripts .= 'jQuery(\'#' . $prefix . 'month\').val(\'' . dol_print_date($nowgmt, '%m', 'tzuserrel') . '\');';
7935 $reset_scripts .= 'jQuery(\'#' . $prefix . 'year\').val(\'' . dol_print_date($nowgmt, '%Y', 'tzuserrel') . '\');';
7937 /*if ($usecalendar == "eldy
")
7939 $base=DOL_URL_ROOT.'/core/';
7940 $reset_scripts .= 'resetDP(\''.$base.'\',\''.$prefix.'\',\''.$langs->trans("FormatDateShortJavaInput
").'\',\''.$langs->defaultlang.'\');';
7944 $reset_scripts .= 'this.form.elements[\''.$prefix.'day\'].value=formatDate(new Date(), \'d\'); ';
7945 $reset_scripts .= 'this.form.elements[\''.$prefix.'month\'].value=formatDate(new Date(), \'M\'); ';
7946 $reset_scripts .= 'this.form.elements[\''.$prefix.'year\'].value=formatDate(new Date(), \'yyyy\'); ';
7948 // Update the hour part
7951 $reset_scripts .= " if (jQuery(
'#fullday:checked').val() ==
null) {
";
7953 //$reset_scripts .= 'this.form.elements[\''.$prefix.'hour\'].value=formatDate(new Date(), \'HH\'); ';
7954 if ($addnowlink == 1) {
7955 $reset_scripts .= 'jQuery(\'#' . $prefix . 'hour\').val(\'' . dol_print_date($nowgmt, '%H', 'tzuserrel') . '\');';
7956 $reset_scripts .= 'jQuery(\'#' . $prefix . 'hour\').change();';
7957 } elseif ($addnowlink == 2) {
7958 $reset_scripts .= 'jQuery(\'#' . $prefix . 'hour\').val(d.getHours().pad());';
7959 $reset_scripts .= 'jQuery(\'#' . $prefix . 'hour\').change();';
7963 $reset_scripts .= ' } ';
7966 // Update the minute part
7969 $reset_scripts .= " if (jQuery(
'#fullday:checked').val() ==
null) {
";
7971 //$reset_scripts .= 'this.form.elements[\''.$prefix.'min\'].value=formatDate(new Date(), \'mm\'); ';
7972 if ($addnowlink == 1) {
7973 $reset_scripts .= 'jQuery(\'#' . $prefix . 'min\').val(\'' . dol_print_date($nowgmt, '%M', 'tzuserrel') . '\');';
7974 $reset_scripts .= 'jQuery(\'#' . $prefix . 'min\').change();';
7975 } elseif ($addnowlink == 2) {
7976 $reset_scripts .= 'jQuery(\'#' . $prefix . 'min\').val(d.getMinutes().pad());';
7977 $reset_scripts .= 'jQuery(\'#' . $prefix . 'min\').change();';
7980 $reset_scripts .= ' } ';
7983 // If reset_scripts is not empty, print the link with the reset_scripts in the onClick
7984 if ($reset_scripts && !getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
7985 $retstring .= ' <button class="dpInvisibleButtons datenowlink
" id="' . $prefix . 'ButtonNow
" type="button" name="_useless
" value="now
" onClick="' . $reset_scripts . '">';
7986 $retstring .= $langs->trans("Now
");
7987 $retstring .= '</button> ';
7991 // Add a "Plus one hour
" link
7992 if ($conf->use_javascript_ajax && $addplusone && !$disabled) {
7993 // Script which will be inserted in the onClick of the "Add plusone
" link
7994 $reset_scripts = "";
7996 // Generate the date part, depending on the use or not of the javascript calendar
7997 $reset_scripts .= 'jQuery(\'#' . $prefix . '\').val(\'' . dol_print_date($nowgmt, 'dayinputnoreduce', 'tzuserrel') . '\');';
7998 $reset_scripts .= 'jQuery(\'#' . $prefix . 'day\').val(\'' . dol_print_date($nowgmt, '%d', 'tzuserrel') . '\');';
7999 $reset_scripts .= 'jQuery(\'#' . $prefix . 'month\').val(\'' . dol_print_date($nowgmt, '%m', 'tzuserrel') . '\');';
8000 $reset_scripts .= 'jQuery(\'#' . $prefix . 'year\').val(\'' . dol_print_date($nowgmt, '%Y', 'tzuserrel') . '\');';
8001 // Update the hour part
8004 $reset_scripts .= " if (jQuery(
'#fullday:checked').val() ==
null) {
";
8006 $reset_scripts .= 'jQuery(\'#' . $prefix . 'hour\').val(\'' . dol_print_date($nowgmt, '%H', 'tzuserrel') . '\');';
8008 $reset_scripts .= ' } ';
8011 // Update the minute part
8014 $reset_scripts .= " if (jQuery(
'#fullday:checked').val() ==
null) {
";
8016 $reset_scripts .= 'jQuery(\'#' . $prefix . 'min\').val(\'' . dol_print_date($nowgmt, '%M', 'tzuserrel') . '\');';
8018 $reset_scripts .= ' } ';
8021 // If reset_scripts is not empty, print the link with the reset_scripts in the onClick
8022 if ($reset_scripts && empty($conf->dol_optimize_smallscreen)) {
8023 $retstring .= ' <button class="dpInvisibleButtons datenowlink
" id="' . $prefix . 'ButtonPlusOne
" type="button" name="_useless2
" value="plusone
" onClick="' . $reset_scripts . '">';
8024 $retstring .= $langs->trans("DateStartPlusOne
");
8025 $retstring .= '</button> ';
8029 // Add a link to set data
8030 if ($conf->use_javascript_ajax && !empty($adddateof) && !$disabled) {
8031 if (!is_array($adddateof)) {
8032 $arrayofdateof = array(array('adddateof' => $adddateof, 'labeladddateof' => $labeladddateof));
8034 $arrayofdateof = $adddateof;
8036 foreach ($arrayofdateof as $valuedateof) {
8037 $tmpadddateof = empty($valuedateof['adddateof']) ? 0 : $valuedateof['adddateof'];
8038 $tmplabeladddateof = empty($valuedateof['labeladddateof']) ? '' : $valuedateof['labeladddateof'];
8039 $tmparray = dol_getdate($tmpadddateof);
8040 if (empty($tmplabeladddateof)) {
8041 $tmplabeladddateof = $langs->trans("DateInvoice
");
8043 $reset_scripts = 'console.log(\'Click on now link\'); ';
8044 $reset_scripts .= 'jQuery(\'#'.$prefix.'\').val(\''.dol_print_date($tmpadddateof, 'dayinputnoreduce').'\');';
8045 $reset_scripts .= 'jQuery(\'#'.$prefix.'day\').val(\''.$tmparray['mday'].'\');';
8046 $reset_scripts .= 'jQuery(\'#'.$prefix.'month\').val(\''.$tmparray['mon'].'\');';
8047 $reset_scripts .= 'jQuery(\'#'.$prefix.'year\').val(\''.$tmparray['year'].'\');';
8048 $retstring .= ' - <button class="dpInvisibleButtons datenowlink
" id="dateofinvoice
" type="button" name="_dateofinvoice
" value="now
" onclick="'.$reset_scripts.'">'.$tmplabeladddateof.'</button>';
8063 public function selectTypeDuration($prefix, $selected = 'i', $excludetypes = array())
8067 $TDurationTypes = array(
8068 'y' => $langs->trans('Years'),
8069 'm' => $langs->trans('Month'),
8070 'w' => $langs->trans('Weeks'),
8071 'd' => $langs->trans('Days'),
8072 'h' => $langs->trans('Hours'),
8073 'i' => $langs->trans('Minutes')
8076 // Removed undesired duration types
8077 foreach ($excludetypes as $value) {
8078 unset($TDurationTypes[$value]);
8081 $retstring = '<select class="flat minwidth75 maxwidth100
" id="select_
' . $prefix . 'type_duration
" name="' . $prefix . 'type_duration
">';
8082 foreach ($TDurationTypes as $key => $typeduration) {
8083 $retstring .= '<option value="' . $key . '"';
8084 if ($key == $selected) {
8085 $retstring .= " selected
";
8087 $retstring .= ">
" . $typeduration . "</option>
";
8089 $retstring .= "</select>
";
8091 $retstring .= ajax_combobox('select_' . $prefix . 'type_duration');
8096 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
8111 public function select_duration($prefix, $iSecond = '', $disabled = 0, $typehour = 'select', $minunderhours = 0, $nooutput = 0)
8116 $retstring = '<span class="nowraponall
">';
8122 if ($iSecond != '') {
8123 require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
8125 $hourSelected = convertSecondToTime($iSecond, 'allhour');
8126 $minSelected = convertSecondToTime($iSecond, 'min');
8129 if ($typehour == 'select') {
8130 $retstring .= '<select class="flat
" id="select_
' . $prefix . 'hour
" name="' . $prefix . 'hour
"' . ($disabled ? ' disabled' : '') . '>';
8131 for ($hour = 0; $hour < 25; $hour++) { // For a duration, we allow 24 hours
8132 $retstring .= '<option value="' . $hour . '"';
8133 if (is_numeric($hourSelected) && $hourSelected == $hour) {
8134 $retstring .= " selected
";
8136 $retstring .= ">
" . $hour . "</option>
";
8138 $retstring .= "</select>
";
8139 } elseif ($typehour == 'text' || $typehour == 'textselect') {
8140 $retstring .= '<input placeholder="' . $langs->trans('HourShort
') . '" type="number
" min="0
" name="' . $prefix . 'hour
"' . ($disabled ? ' disabled' : '') . ' class="flat maxwidth50 inputhour right
" value="' . (($hourSelected != '') ? ((int) $hourSelected) : '') . '">';
8142 return 'BadValueForParameterTypeHour';
8145 if ($typehour != 'text') {
8146 $retstring .= ' ' . $langs->trans('HourShort');
8148 $retstring .= '<span class="">:</span>';
8152 if ($minunderhours) {
8153 $retstring .= '<br>';
8155 if ($typehour != 'text') {
8156 $retstring .= '<span class="hideonsmartphone
"> </span>';
8160 if ($typehour == 'select' || $typehour == 'textselect') {
8161 $retstring .= '<select class="flat
" id="select_
' . $prefix . 'min
" name="' . $prefix . 'min
"' . ($disabled ? ' disabled' : '') . '>';
8162 for ($min = 0; $min <= 55; $min += 5) {
8163 $retstring .= '<option value="' . $min . '"';
8164 if (is_numeric($minSelected) && $minSelected == $min) {
8165 $retstring .= ' selected';
8167 $retstring .= '>' . $min . '</option>';
8169 $retstring .= "</select>
";
8170 } elseif ($typehour == 'text') {
8171 $retstring .= '<input placeholder="' . $langs->trans('MinuteShort
') . '" type="number
" min="0
" name="' . $prefix . 'min
"' . ($disabled ? ' disabled' : '') . ' class="flat maxwidth50 inputminute right
" value="' . (($minSelected != '') ? ((int) $minSelected) : '') . '">';
8174 if ($typehour != 'text') {
8175 $retstring .= ' ' . $langs->trans('MinuteShort');
8178 $retstring .= "</span>
";
8180 if (!empty($nooutput)) {
8208 public function selectTickets($selected = '', $htmlname = 'ticketid', $filtertype = '', $limit = 0, $status = 1, $selected_input_value = '', $hidelabel = 0, $ajaxoptions = array(), $socid = 0, $showempty = '1', $forcecombo = 0, $morecss = '', $selected_combinations = null, $nooutput = 0)
8210 global $langs, $conf;
8215 if (is_null($ajaxoptions)) {
8216 $ajaxoptions = array();
8219 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('TICKET_USE_SEARCH_TO_SELECT')) {
8222 if ($selected && empty($selected_input_value)) {
8223 require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticket.class.php';
8224 $tickettmpselect = new Ticket($this->db);
8225 $tickettmpselect->fetch((int) $selected);
8226 $selected_input_value = $tickettmpselect->ref;
8227 unset($tickettmpselect);
8231 $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT . '/ticket/ajax/tickets.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 1, $ajaxoptions);
8233 if (empty($hidelabel)) {
8234 $out .= $langs->trans("RefOrLabel
") . ' : ';
8235 } elseif ($hidelabel > 1) {
8236 $placeholder = ' placeholder="' . $langs->trans("RefOrLabel") . '"';
8237 if ($hidelabel == 2) {
8238 $out .= img_picto($langs->trans("Search
"), 'search');
8241 $out .= '<input type="text
" class="minwidth100
" name="search_
' . $htmlname . '" id="search_
' . $htmlname . '" value="' . $selected_input_value . '"' . $placeholder . ' ' . (getDolGlobalString('PRODUCT_SEARCH_AUTOFOCUS') ? 'autofocus' : '') . ' />';
8242 if ($hidelabel == 3) {
8243 $out .= img_picto($langs->trans("Search
"), 'search');
8246 $out .= $this->selectTicketsList($selected, $htmlname, $filtertype, $limit, '', $status, 0, $showempty, $forcecombo, $morecss);
8249 if (empty($nooutput)) {
8274 public function selectTicketsList($selected = '', $htmlname = 'ticketid', $filtertype = '', $limit = 20, $filterkey = '', $status = 1, $outputmode = 0, $showempty = '1', $forcecombo = 0, $morecss = '')
8276 global $langs, $conf;
8279 $outarray = array();
8281 $selectFields = " p.rowid, p.ref, p.message
";
8284 $sql .= $selectFields;
8285 $sql .= " FROM
" . $this->db->prefix() . "ticket as p
";
8286 $sql .= ' WHERE p.entity IN (' . getEntity('ticket') . ')';
8288 // Add criteria on ref/label
8289 if ($filterkey != '') {
8291 $prefix = !getDolGlobalString('TICKET_DONOTSEARCH_ANYWHERE') ? '%' : ''; // Can use index if PRODUCT_DONOTSEARCH_ANYWHERE is on
8292 // For natural search
8293 $search_crit = explode(' ', $filterkey);
8295 if (count($search_crit) > 1) {
8298 foreach ($search_crit as $crit) {
8302 $sql .= "(p.ref LIKE
'" . $this->db->escape($prefix . $crit) . "%' OR p.subject LIKE
'" . $this->db->escape($prefix . $crit) . "%'";
8306 if (count($search_crit) > 1) {
8312 $sql .= $this->db->plimit($limit, 0);
8314 // Build output string
8315 dol_syslog(get_class($this) . "::selectTicketsList search tickets
", LOG_DEBUG);
8316 $result = $this->db->query($sql);
8318 require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticket.class.php';
8319 require_once DOL_DOCUMENT_ROOT . '/core/lib/ticket.lib.php';
8321 $num = $this->db->num_rows($result);
8326 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
8327 $out .= ajax_combobox($htmlname, $events, getDolGlobalInt('TICKET_USE_SEARCH_TO_SELECT'));
8330 $out .= '<select class="flat
' . ($morecss ? ' ' . $morecss : '') . '" name="' . $htmlname . '" id="' . $htmlname . '">';
8333 // Do not use textifempty = ' ' or ' ' here, or search on key will search on ' key'.
8334 //if (!empty($conf->use_javascript_ajax) || $forcecombo) $textifempty='';
8335 if (getDolGlobalString('TICKET_USE_SEARCH_TO_SELECT')) {
8336 if ($showempty && !is_numeric($showempty)) {
8337 $textifempty = $langs->trans($showempty);
8339 $textifempty .= $langs->trans("All
");
8342 if ($showempty && !is_numeric($showempty)) {
8343 $textifempty = $langs->trans($showempty);
8347 $out .= '<option value="0
" selected>' . $textifempty . '</option>';
8351 while ($num && $i < $num) {
8354 $objp = $this->db->fetch_object($result);
8356 $this->constructTicketListOption($objp, $opt, $optJson, $selected, $filterkey);
8357 '@phan-var-force array{key:string,value:mixed,type:int} $optJson';
8359 // "key
" value of json key array is used by jQuery automatically as selected value
8360 // "label
" value of json key array is used by jQuery automatically as text for combo box
8362 array_push($outarray, $optJson);
8367 $out .= '</select>';
8369 $this->db->free($result);
8371 if (empty($outputmode)) {
8376 dol_print_error($this->db);
8393 protected function constructTicketListOption(&$objp, &$opt, &$optJson, $selected, $filterkey = '')
8399 $outkey = $objp->rowid;
8400 $outref = $objp->ref;
8402 $opt = '<option value="
' . $objp->rowid . '"';
8403 $opt .= ($objp->rowid == $selected) ? ' selected' : '';
8406 $objRef = $objp->ref;
8407 if (!empty($filterkey) && $filterkey != '') {
8408 $objRef = preg_replace('/(' . preg_quote($filterkey, '/') . ')/i', '<strong>$1</strong>', $objRef, 1);
8411 $opt .= "</option>\n
";
8412 $optJson = array('key' => $outkey, 'value' => $outref, 'type' => $outtype);
8434 public function selectProjects($selected = '', $htmlname = 'projectid', $filtertype = '', $limit = 0, $status = 1, $selected_input_value = '', $hidelabel = 0, $ajaxoptions = array(), $socid = 0, $showempty = '1', $forcecombo = 0, $morecss = '', $selected_combinations = null, $nooutput = 0)
8436 global $langs, $conf;
8441 if (is_null($ajaxoptions)) {
8442 $ajaxoptions = array();
8445 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('TICKET_USE_SEARCH_TO_SELECT')) {
8448 if ($selected && empty($selected_input_value)) {
8449 require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php';
8450 $projecttmpselect = new Project($this->db);
8451 $projecttmpselect->fetch((int) $selected);
8452 $selected_input_value = $projecttmpselect->ref;
8453 unset($projecttmpselect);
8457 $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT . '/projet/ajax/projects.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 1, $ajaxoptions);
8459 if (empty($hidelabel)) {
8460 $out .= $langs->trans("RefOrLabel
") . ' : ';
8461 } elseif ($hidelabel > 1) {
8462 $placeholder = ' placeholder="' . $langs->trans("RefOrLabel") . '"';
8463 if ($hidelabel == 2) {
8464 $out .= img_picto($langs->trans("Search
"), 'search');
8467 $out .= '<input type="text
" class="minwidth100
" name="search_
' . $htmlname . '" id="search_
' . $htmlname . '" value="' . $selected_input_value . '"' . $placeholder . ' ' . (getDolGlobalString('PRODUCT_SEARCH_AUTOFOCUS') ? 'autofocus' : '') . ' />';
8468 if ($hidelabel == 3) {
8469 $out .= img_picto($langs->trans("Search
"), 'search');
8472 $out .= $this->selectProjectsList($selected, $htmlname, $filtertype, $limit, '', $status, 0, $showempty, $forcecombo, $morecss);
8475 if (empty($nooutput)) {
8499 public function selectProjectsList($selected = '', $htmlname = 'projectid', $filtertype = '', $limit = 20, $filterkey = '', $status = 1, $outputmode = 0, $showempty = '1', $forcecombo = 0, $morecss = '')
8501 global $langs, $conf;
8504 $outarray = array();
8506 $selectFields = " p.rowid, p.ref
";
8509 $sql .= $selectFields;
8510 $sql .= " FROM
" . $this->db->prefix() . "projet as p
";
8511 $sql .= ' WHERE p.entity IN (' . getEntity('project') . ')';
8513 // Add criteria on ref/label
8514 if ($filterkey != '') {
8516 $prefix = !getDolGlobalString('TICKET_DONOTSEARCH_ANYWHERE') ? '%' : ''; // Can use index if PRODUCT_DONOTSEARCH_ANYWHERE is on
8517 // For natural search
8518 $search_crit = explode(' ', $filterkey);
8520 if (count($search_crit) > 1) {
8523 foreach ($search_crit as $crit) {
8527 $sql .= "p.ref LIKE
'" . $this->db->escape($prefix . $crit) . "%'";
8531 if (count($search_crit) > 1) {
8537 $sql .= $this->db->plimit($limit, 0);
8539 // Build output string
8540 dol_syslog(get_class($this) . "::selectProjectsList search projects
", LOG_DEBUG);
8541 $result = $this->db->query($sql);
8543 require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php';
8544 require_once DOL_DOCUMENT_ROOT . '/core/lib/project.lib.php';
8546 $num = $this->db->num_rows($result);
8551 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
8552 $out .= ajax_combobox($htmlname, $events, getDolGlobalInt('PROJECT_USE_SEARCH_TO_SELECT'));
8555 $out .= '<select class="flat
' . ($morecss ? ' ' . $morecss : '') . '" name="' . $htmlname . '" id="' . $htmlname . '">';
8558 // Do not use textifempty = ' ' or ' ' here, or search on key will search on ' key'.
8559 //if (!empty($conf->use_javascript_ajax) || $forcecombo) $textifempty='';
8560 if (getDolGlobalString('PROJECT_USE_SEARCH_TO_SELECT')) {
8561 if ($showempty && !is_numeric($showempty)) {
8562 $textifempty = $langs->trans($showempty);
8564 $textifempty .= $langs->trans("All
");
8567 if ($showempty && !is_numeric($showempty)) {
8568 $textifempty = $langs->trans($showempty);
8572 $out .= '<option value="0
" selected>' . $textifempty . '</option>';
8576 while ($num && $i < $num) {
8579 $objp = $this->db->fetch_object($result);
8581 $this->constructProjectListOption($objp, $opt, $optJson, $selected, $filterkey);
8583 // "key
" value of json key array is used by jQuery automatically as selected value
8584 // "label
" value of json key array is used by jQuery automatically as text for combo box
8586 array_push($outarray, $optJson);
8591 $out .= '</select>';
8593 $this->db->free($result);
8595 if (empty($outputmode)) {
8600 dol_print_error($this->db);
8619 protected function constructProjectListOption(&$objp, &$opt, &$optJson, $selected, $filterkey = '')
8625 $label = $objp->label;
8627 $outkey = $objp->rowid;
8628 $outref = $objp->ref;
8629 $outlabel = $objp->label;
8630 $outtype = $objp->fk_product_type;
8632 $opt = '<option value="
' . $objp->rowid . '"';
8633 $opt .= ($objp->rowid == $selected) ? ' selected' : '';
8636 $objRef = $objp->ref;
8637 if (!empty($filterkey) && $filterkey != '') {
8638 $objRef = preg_replace('/(' . preg_quote($filterkey, '/') . ')/i', '<strong>$1</strong>', $objRef, 1);
8641 $opt .= "</option>\n
";
8642 $optJson = array('key' => $outkey, 'value' => $outref, 'type' => $outtype);
8665 public function selectMembers($selected = '', $htmlname = 'adherentid', $filtertype = '', $limit = 0, $status = 1, $selected_input_value = '', $hidelabel = 0, $ajaxoptions = array(), $socid = 0, $showempty = '1', $forcecombo = 0, $morecss = '', $selected_combinations = null, $nooutput = 0)
8667 global $langs, $conf;
8672 if (is_null($ajaxoptions)) {
8673 $ajaxoptions = array();
8676 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('TICKET_USE_SEARCH_TO_SELECT')) {
8679 if ($selected && empty($selected_input_value)) {
8680 require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
8681 $adherenttmpselect = new Adherent($this->db);
8682 $adherenttmpselect->fetch((int) $selected);
8683 $selected_input_value = $adherenttmpselect->ref;
8684 unset($adherenttmpselect);
8689 $out .= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT . '/adherents/ajax/adherents.php', $urloption, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT, 1, $ajaxoptions);
8691 if (empty($hidelabel)) {
8692 $out .= $langs->trans("RefOrLabel
") . ' : ';
8693 } elseif ($hidelabel > 1) {
8694 $placeholder = ' placeholder="' . $langs->trans("RefOrLabel") . '"';
8695 if ($hidelabel == 2) {
8696 $out .= img_picto($langs->trans("Search
"), 'search');
8699 $out .= '<input type="text
" class="minwidth100
" name="search_
' . $htmlname . '" id="search_
' . $htmlname . '" value="' . $selected_input_value . '"' . $placeholder . ' ' . (getDolGlobalString('PRODUCT_SEARCH_AUTOFOCUS') ? 'autofocus' : '') . ' />';
8700 if ($hidelabel == 3) {
8701 $out .= img_picto($langs->trans("Search
"), 'search');
8706 $out .= $this->selectMembersList($selected, $htmlname, $filtertype, $limit, $filterkey, $status, 0, $showempty, $forcecombo, $morecss);
8709 if (empty($nooutput)) {
8733 public function selectMembersList($selected = '', $htmlname = 'adherentid', $filtertype = '', $limit = 20, $filterkey = '', $status = 1, $outputmode = 0, $showempty = '1', $forcecombo = 0, $morecss = '')
8735 global $langs, $conf;
8738 $outarray = array();
8740 $selectFields = " p.rowid, p.ref, p.firstname, p.lastname, p.fk_adherent_type
";
8743 $sql .= $selectFields;
8744 $sql .= " FROM
" . $this->db->prefix() . "adherent as p
";
8745 $sql .= ' WHERE p.entity IN (' . getEntity('adherent') . ')';
8747 // Add criteria on ref/label
8748 if ($filterkey != '') {
8750 $prefix = !getDolGlobalString('MEMBER_DONOTSEARCH_ANYWHERE') ? '%' : ''; // Can use index if PRODUCT_DONOTSEARCH_ANYWHERE is on
8751 // For natural search
8752 $search_crit = explode(' ', $filterkey);
8754 if (count($search_crit) > 1) {
8757 foreach ($search_crit as $crit) {
8761 $sql .= "(p.firstname LIKE
'" . $this->db->escape($prefix . $crit) . "%'";
8762 $sql .= " OR p.lastname LIKE
'" . $this->db->escape($prefix . $crit) . "%')
";
8765 if (count($search_crit) > 1) {
8770 if ($status != -1) {
8771 $sql .= ' AND statut = ' . ((int) $status);
8773 $sql .= $this->db->plimit($limit, 0);
8775 // Build output string
8776 dol_syslog(get_class($this) . "::selectMembersList search adherents
", LOG_DEBUG);
8777 $result = $this->db->query($sql);
8779 require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
8780 require_once DOL_DOCUMENT_ROOT . '/core/lib/member.lib.php';
8782 $num = $this->db->num_rows($result);
8787 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
8788 $out .= ajax_combobox($htmlname, $events, getDolGlobalInt('PROJECT_USE_SEARCH_TO_SELECT'));
8791 $out .= '<select class="flat
' . ($morecss ? ' ' . $morecss : '') . '" name="' . $htmlname . '" id="' . $htmlname . '">';
8794 // Do not use textifempty = ' ' or ' ' here, or search on key will search on ' key'.
8795 //if (!empty($conf->use_javascript_ajax) || $forcecombo) $textifempty='';
8796 if (getDolGlobalString('PROJECT_USE_SEARCH_TO_SELECT')) {
8797 if ($showempty && !is_numeric($showempty)) {
8798 $textifempty = $langs->trans($showempty);
8800 $textifempty .= $langs->trans("All
");
8803 if ($showempty && !is_numeric($showempty)) {
8804 $textifempty = $langs->trans($showempty);
8808 $out .= '<option value="-1
" selected>' . $textifempty . '</option>';
8812 while ($num && $i < $num) {
8815 $objp = $this->db->fetch_object($result);
8817 $this->constructMemberListOption($objp, $opt, $optJson, $selected, $filterkey);
8820 // "key
" value of json key array is used by jQuery automatically as selected value
8821 // "label
" value of json key array is used by jQuery automatically as text for combo box
8823 array_push($outarray, $optJson);
8828 $out .= '</select>';
8830 $this->db->free($result);
8832 if (empty($outputmode)) {
8837 dol_print_error($this->db);
8854 protected function constructMemberListOption(&$objp, &$opt, &$optJson, $selected, $filterkey = '')
8860 $outkey = $objp->rowid;
8861 $outlabel = dolGetFirstLastname($objp->firstname, $objp->lastname);
8862 $outtype = $objp->fk_adherent_type;
8864 $opt = '<option value="
' . $objp->rowid . '"';
8865 $opt .= ($objp->rowid == $selected) ? ' selected' : '';
8867 if (!empty($filterkey) && $filterkey != '') {
8868 $outlabel = preg_replace('/(' . preg_quote($filterkey, '/') . ')/i', '<strong>$1</strong>', $outlabel, 1);
8871 $opt .= "</option>\n
";
8873 $optJson = array('key' => $outkey, 'value' => $outlabel, 'type' => $outtype);
8896 public function selectForForms($objectdesc, $htmlname, $preSelectedValue, $showempty = '', $searchkey = '', $placeholder = '', $morecss = '', $moreparams = '', $forcecombo = 0, $disabled = 0, $selected_input_value = '', $objectfield = '')
8898 global $conf, $extrafields, $user;
8900 // Example of common usage for a link to a thirdparty
8902 // We got this in a modulebuilder form of "
MyObject" of module "mymodule
".
8903 // When ->fields is array( ... "fk_soc
" => array("type"=>"integer:
Societe:societe/class/societe.class.php:1:((
status:=:1) AND (entity:IN:__SHARED_ENTITIES__))
" ...), we have
8904 // $objectdesc = 'Societe'
8905 // $objectfield = 'myobject@mymodule:fk_soc' ('fk_soc' is code to retrieve myobject->fields['fk_soc']) or it can be an array that is directly
8906 // array("type"=>"integer:
Societe:societe/class/societe.class.php:1:((
status:=:1) AND (entity:IN:__SHARED_ENTITIES__))
" ...)
8908 // We got this when showing an extrafields on resource that is a link to societe
8909 // When extrafields 'link_to_societe' of Resource is 'link' to 'Societe:societe/class/societe.class.php:1:((status:=:1) AND (entity:IN:__SHARED_ENTITIES__))" ...)
', we have
8911 // $objectfield = 'resource:options_link_to_societe
' or it can be an array that is directly
8912 // array("type"=>'Societe:societe/class/societe.class.php:1:((
status:=:1) AND (entity:IN:__SHARED_ENTITIES__))
" ...)
8915 // $objectdesc = 'Societe:societe/class/societe.class.php:1:((status:=:1) AND (entity:IN:__SHARED_ENTITIES__))'
8916 // $objectfield = ''
8918 //var_dump($objectdesc.' '.$objectfield);
8919 //debug_print_backtrace();
8921 $objectdescorig = $objectdesc;
8923 $InfoFieldList = array();
8925 $filter = ''; // Ensure filter has value (for static analysis)
8926 $sortfield = ''; // Ensure filter has value (for static analysis)
8928 if (is_array($objectfield)) { // objectfield is an array
8929 $objectdesc = $objectfield['type'];
8930 $objectdesc = preg_replace('/^integer[^:]*:/', '', $objectdesc);
8931 } elseif ($objectfield) { // objectfield is a string. We must retrieve the objectdesc from the field or extrafield. Deprecated, it is better to provide the array record directly.
8932 // Example: $objectfield = 'product:options_package' or 'myobject@mymodule:options_myfield'
8933 $tmparray = explode(':', $objectfield);
8935 // Get instance of object from $element
8936 $objectforfieldstmp = fetchObjectByElement(0, strtolower($tmparray[0]));
8938 if (is_object($objectforfieldstmp)) {
8942 if (preg_match('/^options_(.*)$/', $tmparray[1], $reg)) {
8943 // For a property in extrafields
8945 // fetch optionals attributes and labels
8946 $extrafields->fetch_name_optionals_label($objectforfieldstmp->table_element);
8948 if (!empty($extrafields->attributes[$objectforfieldstmp->table_element]['type'][$key]) && $extrafields->attributes[$objectforfieldstmp->table_element]['type'][$key] == 'link') {
8949 if (!empty($extrafields->attributes[$objectforfieldstmp->table_element]['param'][$key]['options'])) {
8950 $tmpextrafields = array_keys($extrafields->attributes[$objectforfieldstmp->table_element]['param'][$key]['options']);
8951 $objectdesc = $tmpextrafields[0];
8955 // For a property in ->fields
8956 if (array_key_exists($tmparray[1], $objectforfieldstmp->fields)) {
8957 $objectdesc = $objectforfieldstmp->fields[$tmparray[1]]['type'];
8958 $objectdesc = preg_replace('/^integer[^:]*:/', '', $objectdesc);
8965 // Example of value for $objectdesc:
8966 // Bom:bom/class/bom.class.php:0:t.status=1
8967 // Bom:bom/class/bom.class.php:0:t.status=1:ref
8968 // Bom:bom/class/bom.class.php:0:(t.status:=:1) OR (t.field2:=:2):ref
8969 $InfoFieldList = explode(":
", $objectdesc, 4);
8970 $vartmp = (empty($InfoFieldList[3]) ? '' : $InfoFieldList[3]);
8972 if (preg_match('/^.*:(\w*)$/', $vartmp, $reg)) {
8973 $InfoFieldList[4] = $reg[1]; // take the sort field
8975 $InfoFieldList[3] = preg_replace('/:\w*$/', '', $vartmp); // take the filter field
8977 $classname = $InfoFieldList[0];
8978 $classpath = empty($InfoFieldList[1]) ? '' : $InfoFieldList[1];
8979 //$addcreatebuttonornot = empty($InfoFieldList[2]) ? 0 : $InfoFieldList[2];
8980 $filter = empty($InfoFieldList[3]) ? '' : $InfoFieldList[3];
8981 $sortfield = empty($InfoFieldList[4]) ? '' : $InfoFieldList[4];
8983 // Load object according to $id and $element
8984 $objecttmp = fetchObjectByElement(0, strtolower($InfoFieldList[0]));
8986 // Fallback to another solution to get $objecttmp
8987 if (empty($objecttmp) && !empty($classpath)) {
8988 dol_include_once($classpath);
8990 if ($classname && class_exists($classname)) {
8991 $objecttmp = new $classname($this->db);
8996 // Make some replacement in $filter. May not be used if we used the ajax mode with $objectfield. In such a case
8997 // we propagate the $objectfield and not the filter and replacement is done by the ajax/selectobject.php component.
8998 $sharedentities = (is_object($objecttmp) && property_exists($objecttmp, 'element')) ? getEntity($objecttmp->element) : strtolower($classname);
8999 $filter = str_replace(
9000 array('__ENTITY__', '__SHARED_ENTITIES__', '__USER_ID__'),
9001 array($conf->entity, $sharedentities, $user->id),
9005 if (!is_object($objecttmp)) {
9006 dol_syslog('selectForForms: Error bad setup of field objectdescorig=' . $objectdescorig.', objectfield='.(is_array($objectfield) ? 'array' : $objectfield).', objectdesc='.$objectdesc, LOG_WARNING);
9007 return 'selectForForms: Error bad setup of field objectdescorig=' . $objectdescorig.', objectfield='.(is_array($objectfield) ? 'array' : $objectfield).', objectdesc='.$objectdesc;
9009 '@phan-var-force CommonObject $objecttmp';
9011 //var_dump($filter);
9012 $prefixforautocompletemode = $objecttmp->element;
9013 if ($prefixforautocompletemode == 'societe') {
9014 $prefixforautocompletemode = 'company';
9016 if ($prefixforautocompletemode == 'product') {
9017 $prefixforautocompletemode = 'produit';
9020 $confkeyforautocompletemode = strtoupper($prefixforautocompletemode) . '_USE_SEARCH_TO_SELECT'; // For example COMPANY_USE_SEARCH_TO_SELECT
9022 dol_syslog(get_class($this) . "::selectForForms filter=
" . $filter, LOG_DEBUG);
9024 // Generate the combo HTML component
9026 if (!empty($conf->use_javascript_ajax) && getDolGlobalString($confkeyforautocompletemode) && !$forcecombo) {
9027 // No immediate load of all database
9030 if ($preSelectedValue && empty($selected_input_value)) {
9031 $objecttmp->fetch($preSelectedValue);
9032 $selected_input_value = ($prefixforautocompletemode == 'company' ? $objecttmp->name : $objecttmp->ref);
9034 $oldValueForShowOnCombobox = 0;
9035 foreach ($objecttmp->fields as $fieldK => $fielV) {
9036 if (!array_key_exists('showoncombobox', $fielV) || !$fielV['showoncombobox'] || empty($objecttmp->$fieldK)) {
9040 if (!$oldValueForShowOnCombobox) {
9041 $selected_input_value = '';
9044 $selected_input_value .= $oldValueForShowOnCombobox ? ' - ' : '';
9045 $selected_input_value .= $objecttmp->$fieldK;
9046 $oldValueForShowOnCombobox = empty($fielV['showoncombobox']) ? 0 : $fielV['showoncombobox'];
9050 // Set url and param to call to get json of the search results
9051 $urlforajaxcall = DOL_URL_ROOT . '/core/ajax/selectobject.php';
9052 $urloption = 'htmlname=' . urlencode($htmlname) . '&outjson=1&objectdesc=' . urlencode($objectdescorig) . (is_scalar($objectfield) ? '&objectfield='.urlencode($objectfield) : '') . ($sortfield ? '&sortfield=' . urlencode($sortfield) : '');
9054 // Activate the auto complete using ajax call.
9055 $out .= ajax_autocompleter((string) $preSelectedValue, $htmlname, $urlforajaxcall, $urloption, getDolGlobalInt($confkeyforautocompletemode), 0);
9056 $out .= '<!-- force css to be higher than dialog popup --><style type="text/css
">.ui-autocomplete { z-index: 1010; }</style>';
9057 $out .= '<input type="text
" class="' . $morecss . '"' . ($disabled ? ' disabled="disabled"' : '') . ' name="search_
' . $htmlname . '" id="search_
' . $htmlname . '" value="' . $selected_input_value . '"' . ($placeholder ? ' placeholder="' . dol_escape_htmltag($placeholder) . '"' : '') . ' />';
9059 // Immediate load of table record.
9060 $out .= $this->selectForFormsList($objecttmp, $htmlname, $preSelectedValue, $showempty, $searchkey, $placeholder, $morecss, $moreparams, $forcecombo, 0, $disabled, $sortfield, $filter);
9087 public function selectForFormsList($objecttmp, $htmlname, $preselectedvalue, $showempty = '', $searchkey = '', $placeholder = '', $morecss = '', $moreparams = '', $forcecombo = 0, $outputmode = 0, $disabled = 0, $sortfield = '', $filter = '')
9089 global $langs, $user, $hookmanager;
9091 //print "$htmlname, $preselectedvalue, $showempty, $searchkey, $placeholder, $morecss, $moreparams, $forcecombo, $outputmode, $disabled
";
9093 $prefixforautocompletemode = $objecttmp->element;
9094 if ($prefixforautocompletemode == 'societe') {
9095 $prefixforautocompletemode = 'company';
9097 $confkeyforautocompletemode = strtoupper($prefixforautocompletemode) . '_USE_SEARCH_TO_SELECT'; // For example COMPANY_USE_SEARCH_TO_SELECT
9099 if (!empty($objecttmp->fields)) { // For object that declare it, it is better to use declared fields (like societe, contact, ...)
9100 $tmpfieldstoshow = '';
9101 foreach ($objecttmp->fields as $key => $val) {
9102 if (! (int) dol_eval((string) $val['enabled'], 1, 1, '1')) {
9105 if (!empty($val['showoncombobox'])) {
9106 $tmpfieldstoshow .= ($tmpfieldstoshow ? ',' : '') . 't.' . $key;
9109 if ($tmpfieldstoshow) {
9110 $fieldstoshow = $tmpfieldstoshow;
9112 } elseif ($objecttmp->element === 'category') {
9113 $fieldstoshow = 't.label';
9115 // For backward compatibility
9116 $objecttmp->fields['ref'] = array('type' => 'varchar(30)', 'label' => 'Ref', 'showoncombobox' => 1);
9119 if (empty($fieldstoshow)) {
9120 if (!empty($objecttmp->parent_element)) {
9121 $fieldstoshow = 'o.ref';
9122 if (empty($sortfield)) {
9123 $sortfield = 'o.ref';
9125 if (in_array($objecttmp->element, ['commandedet', 'propaldet', 'facturedet', 'expeditiondet'])) {
9126 $fieldstoshow .= ',p.ref AS p_ref,p.label,t.description';
9127 $sortfield .= ', p.ref';
9129 } elseif (isset($objecttmp->fields['ref'])) {
9130 $fieldstoshow = 't.ref';
9132 $langs->load("errors
");
9133 $this->error = $langs->trans("ErrorNoFieldWithAttributeShowoncombobox
");
9134 return $langs->trans('ErrorNoFieldWithAttributeShowoncombobox');
9139 $outarray = array();
9140 $tmparray = array();
9145 $sql = "SELECT t.rowid,
" . $fieldstoshow . " FROM
" . $this->db->prefix() . $this->db->sanitize($objecttmp->table_element) . " as t
";
9146 if (!empty($objecttmp->isextrafieldmanaged)) {
9147 $extrafieldTable = $objecttmp->table_element;
9148 if ($extrafieldTable == 'categorie') {
9149 $extrafieldTable = 'categories'; // For compatibility
9151 $sql .= " LEFT JOIN
" . $this->db->prefix() . $this->db->sanitize($extrafieldTable) . "_extrafields as e ON t.rowid = e.fk_object
";
9153 if (!empty($objecttmp->parent_element)) { // If parent_element is defined
9154 $parent_properties = getElementProperties($objecttmp->parent_element);
9155 $sql .= " INNER JOIN
" . $this->db->prefix() . $this->db->sanitize($parent_properties['table_element']) . " as o ON o.rowid = t.
".$objecttmp->fk_parent_attribute;
9157 if (isset($objecttmp->parent_element) && in_array($objecttmp->parent_element, ['commande', 'propal', 'facture', 'expedition'])) {
9158 $sql .= " LEFT JOIN
" . $this->db->prefix() . "product as p ON p.rowid = t.fk_product
";
9160 if (!empty($objecttmp->ismultientitymanaged)) {
9161 if ($objecttmp->ismultientitymanaged == 1) { // @phan-suppress-current-line PhanPluginEmptyStatementIf
9162 // No need to join/link another table
9164 if (!is_numeric($objecttmp->ismultientitymanaged)) {
9165 $tmparray = explode('@', $objecttmp->ismultientitymanaged);
9166 $sql .= " INNER JOIN
" . $this->db->prefix() . $this->db->sanitize($tmparray[1]) . " as parenttable ON parenttable.rowid = t.
" . $this->db->sanitize($tmparray[0]);
9170 // Add where from hooks
9171 $parameters = array(
9172 'object' => $objecttmp,
9173 'htmlname' => $htmlname,
9174 'filter' => $filter,
9175 'searchkey' => $searchkey
9178 $reshook = $hookmanager->executeHooks('selectForFormsListWhere', $parameters); // Note that $action and $object may have been modified by hook
9179 if (!empty($hookmanager->resPrint)) {
9180 $sql .= $hookmanager->resPrint;
9182 $sql .= " WHERE 1=1
";
9184 // If table need a multientity restriction
9185 if (!empty($objecttmp->ismultientitymanaged)) {
9186 if ($objecttmp->ismultientitymanaged == 1) {
9187 $sql .= " AND t.entity IN (
" . getEntity($objecttmp->element) . ")
";
9189 if (!is_numeric($objecttmp->ismultientitymanaged)) {
9190 $sql .= " AND parenttable.entity = t.
" . $this->db->sanitize($tmparray[0]);
9192 // If the parent table is llx_societe and user is not an external user (a more robust test done later for external users),
9193 // then we must also check that user has permissions
9194 if ($objecttmp->ismultientitymanaged === 'fk_soc@societe') {
9195 if (!$user->hasRight('societe', 'client', 'voir') && empty($user->socid)) {
9196 $sql .= " AND EXISTS (SELECT sc.rowid FROM
".$this->db->prefix() . "societe_commerciaux as sc
";
9197 $sql .= " WHERE sc.fk_soc = t.fk_soc AND sc.fk_user =
".((int) $user->id).")
";
9202 // If user is external user, we must also make a test on llx_societe_commerciaux
9203 if (!empty($user->socid)) {
9204 if ($objecttmp->element == 'societe') {
9205 $sql .= " AND t.rowid =
" . ((int) $user->socid);
9206 } elseif (!empty($objecttmp->fields['fk_soc']) || !empty($objecttmp->fields['t.fk_soc']) || property_exists($objecttmp, 'fk_soc') || property_exists($objecttmp, 'socid')) {
9207 $sql .= " AND t.fk_soc =
" . ((int) $user->socid);
9211 $splittedfieldstoshow = explode(',', $fieldstoshow);
9212 foreach ($splittedfieldstoshow as &$field2) {
9213 if (is_numeric($pos = strpos($field2, ' '))) {
9214 $field2 = substr($field2, 0, $pos);
9217 if ($searchkey != '') {
9218 $sql .= natural_search($splittedfieldstoshow, $searchkey);
9221 if ($filter) { // Syntax example "(t.
ref:like:
'SO-%') and (t.date_creation:<:
'20160101')
"
9223 $sql .= forgeSQLFromUniversalSearchCriteria($filter, $errormessage);
9224 if ($errormessage) {
9225 return 'Error forging a SQL request from an universal criteria: ' . $errormessage;
9229 $sql .= $this->db->order($sortfield ? $sortfield : $fieldstoshow, "ASC
");
9230 //$sql.=$this->db->plimit($limit, 0);
9233 // Build output string
9234 $resql = $this->db->query($sql);
9236 // Construct $out and $outarray
9237 $out .= '<select id="' . $htmlname . '" class="flat minwidth100
' . ($morecss ? ' ' . $morecss : '') . '"' . ($disabled ? ' disabled="disabled"' : '') . ($moreparams ? ' ' . $moreparams : '') . ' name="' . $htmlname . '">' . "\n
";
9239 // Warning: Do not use textifempty = ' ' or ' ' here, or search on key will search on ' key'. Seems it is no more true with selec2 v4
9240 $textifempty = ' ';
9242 //if (!empty($conf->use_javascript_ajax) || $forcecombo) $textifempty='';
9243 if (getDolGlobalInt($confkeyforautocompletemode)) {
9244 if ($showempty && !is_numeric($showempty)) {
9245 $textifempty = $langs->trans($showempty);
9247 $textifempty .= $langs->trans("All
");
9251 $out .= '<option value="-1
">' . $textifempty . '</option>' . "\n
";
9254 $num = $this->db->num_rows($resql);
9258 $obj = $this->db->fetch_object($resql);
9261 $tmparray = explode(',', $fieldstoshow);
9262 $oldvalueforshowoncombobox = 0;
9263 foreach ($tmparray as $key => $val) {
9264 $val = preg_replace('/(t|p|o)\./', '', $val);
9265 $label .= (($label && $obj->$val) ? ($oldvalueforshowoncombobox != $objecttmp->fields[$val]['showoncombobox'] ? ' - ' : ' ') : '');
9266 $labelhtml .= (($label && $obj->$val) ? ($oldvalueforshowoncombobox != $objecttmp->fields[$val]['showoncombobox'] ? ' - ' : ' ') : '');
9267 $label .= $obj->$val;
9268 $labelhtml .= $obj->$val;
9270 $oldvalueforshowoncombobox = empty($objecttmp->fields[$val]['showoncombobox']) ? 0 : $objecttmp->fields[$val]['showoncombobox'];
9272 if (empty($outputmode)) {
9273 if ($preselectedvalue > 0 && $preselectedvalue == $obj->rowid) {
9274 $out .= '<option value="' . $obj->rowid . '" selected data-html="' . dol_escape_htmltag($labelhtml, 0, 0, '', 0, 1) . '">' . dol_escape_htmltag($label, 0, 0, '', 0, 1) . '</option>';
9276 $out .= '<option value="' . $obj->rowid . '" data-html="' . dol_escape_htmltag($labelhtml, 0, 0, '', 0, 1) . '">' . dol_escape_htmltag($label, 0, 0, '', 0, 1) . '</option>';
9279 array_push($outarray, array('key' => $obj->rowid, 'value' => $label, 'label' => $label));
9283 if (($i % 10) == 0) {
9289 $out .= '</select>' . "\n
";
9292 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
9293 $out .= ajax_combobox($htmlname, array(), getDolGlobalInt($confkeyforautocompletemode, 0));
9296 dol_print_error($this->db);
9299 $this->result = array('nbofelement' => $num);
9331 public static function selectarray($htmlname, $array, $id = '', $show_empty = 0, $key_in_label = 0, $value_as_key = 0, $moreparam = '', $translate = 0, $maxlen = 0, $disabled = 0, $sort = '', $morecss = 'minwidth75', $addjscombo = 1, $moreparamonempty = '', $disablebademail = 0, $nohtmlescape = 0)
9333 global $conf, $langs;
9335 // Do we want a multiselect ?
9337 //if (preg_match('/^multi/',$htmlname)) $jsbeautify = 1;
9340 if ($value_as_key) {
9341 $array = array_combine($array, $array);
9344 '@phan-var-force array{label:string,data-html:string,disable?:int<0,1>,css?:string} $array'; // Array combine breaks information
9348 if ($addjscombo < 0) {
9349 if (!getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
9355 $idname = str_replace(array('[', ']'), array('', ''), $htmlname);
9356 $out .= '<select id="
' . preg_replace('/^\./
', '', $idname) . '" ' . ($disabled ? 'disabled="disabled" ' : '') . 'class="flat
' . (preg_replace('/^\./
', '', $htmlname)) . ($morecss ? ' ' . $morecss : '') . ' selectformat
"';
9357 $out .= ' name="' . preg_replace('/^\./
', '', $htmlname) . '" ' . ($moreparam ? $moreparam : '');
9361 $textforempty = ' ';
9362 if (!empty($conf->use_javascript_ajax)) {
9363 $textforempty = ' '; // If we use ajaxcombo, we need here to avoid to have an empty element that is too small.
9365 if (!is_numeric($show_empty)) {
9366 $textforempty = $show_empty;
9368 $out .= '<option class="optiongrey
" ' . ($moreparamonempty ? $moreparamonempty . ' ' : '') . 'value="' . (((int) $show_empty) < 0 ? $show_empty : -1) . '"' . ($id == $show_empty ? ' selected' : '') . '>' . $textforempty . '</option>' . "\n
";
9370 if (is_array($array)) {
9373 foreach ($array as $key => $value) {
9374 if (!is_array($value)) {
9375 $array[$key] = $langs->trans($value);
9377 $array[$key]['label'] = $langs->trans($value['label']);
9382 if ($sort == 'ASC') {
9384 } elseif ($sort == 'DESC') {
9388 foreach ($array as $key => $tmpvalue) {
9389 if (is_array($tmpvalue)) {
9390 $value = $tmpvalue['label'];
9391 //$valuehtml = empty($tmpvalue['data-html']) ? $value : $tmpvalue['data-html'];
9392 $disabled = empty($tmpvalue['disabled']) ? '' : ' disabled';
9393 $style = empty($tmpvalue['css']) ? '' : ' class="' . $tmpvalue['css
'] . '"';
9396 //$valuehtml = $tmpvalue;
9400 if (!empty($disablebademail)) {
9401 if (($disablebademail == 1 && !preg_match('/<.+@.+>/', $value))
9402 || ($disablebademail == 2 && preg_match('/---/', $value))) {
9403 $disabled = ' disabled';
9404 $style = ' class="warning
"';
9407 if ($key_in_label) {
9408 if (empty($nohtmlescape)) {
9409 $selectOptionValue = dol_escape_htmltag($key . ' - ' . ($maxlen ? dol_trunc($value, $maxlen) : $value));
9411 $selectOptionValue = $key . ' - ' . ($maxlen ? dol_trunc($value, $maxlen) : $value);
9414 if (empty($nohtmlescape)) {
9415 $selectOptionValue = dol_escape_htmltag($maxlen ? dol_trunc($value, $maxlen) : $value);
9417 $selectOptionValue = $maxlen ? dol_trunc($value, $maxlen) : $value;
9419 if ($value == '' || $value == '-') {
9420 $selectOptionValue = ' ';
9423 $out .= '<option value="' . $key . '"';
9424 $out .= $style . $disabled;
9425 if (is_array($id)) {
9426 if (in_array($key, $id) && !$disabled) {
9427 $out .= ' selected'; // To preselect a value
9430 $id = (string) $id; // if $id = 0, then $id = '0'
9431 if ($id != '' && (($id == (string) $key) || ($id == 'ifone' && count($array) == 1)) && !$disabled) {
9432 $out .= ' selected'; // To preselect a value
9435 if (!empty($nohtmlescape)) { // deprecated. Use instead the key 'data-html' into input $array, managed at next step to use HTML content.
9436 $out .= ' data-html="' . dol_escape_htmltag($selectOptionValue) . '"';
9439 if (is_array($tmpvalue)) {
9440 foreach ($tmpvalue as $keyforvalue => $valueforvalue) {
9441 if ($keyforvalue == 'labelhtml') {
9442 $keyforvalue = 'data-html';
9444 if (preg_match('/^data-/', $keyforvalue)) { // The best solution if you want to use HTML values into the list is to use data-html.
9445 $out .= ' '.dol_escape_htmltag($keyforvalue).'="'.dol_escape_htmltag($valueforvalue).'"';
9450 $out .= $selectOptionValue;
9451 $out .= "</option>\n
";
9454 $out .= "</select>
";
9456 // Add code for jquery to use multiselect
9457 if ($addjscombo && $jsbeautify) {
9458 // Enhance with select2
9459 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
9460 $out .= ajax_combobox($idname, array(), 0, 0, 'resolve', (((int) $show_empty) < 0 ? (string) $show_empty : '-1'), $morecss);
9484 public static function selectArrayAjax($htmlname, $url, $id = '', $moreparam = '', $moreparamtourl = '', $disabled = 0, $minimumInputLength = 1, $morecss = '', $callurlonselect = 0, $placeholder = '', $acceptdelayedhtml = 0)
9487 global $delayedhtmlcontent; // Will be used later outside of this function
9489 // TODO Use an internal dolibarr component instead of select2
9490 if (!getDolGlobalString('MAIN_USE_JQUERY_MULTISELECT') && !defined('REQUIRE_JQUERY_MULTISELECT')) {
9494 $out = '<select type="text
" class="' . $htmlname . ($morecss ? ' ' . $morecss : '') . '" ' . ($moreparam ? $moreparam . ' ' : '') . 'name="' . $htmlname . '"></select>';
9497 if (!empty($conf->use_javascript_ajax)) {
9498 $tmpplugin = 'select2';
9499 $outdelayed = "\n
" . '<!-- JS CODE TO ENABLE ' . $tmpplugin . ' for id ' . $htmlname . ' -->
9500 <script nonce="' . getNonce() . '">
9501 $(document).ready(function () {
9503 ' . ($callurlonselect ? 'var saveRemoteData = [];' : '') . '
9505 $(".
' . $htmlname . '").select2({
9508 url: "' . $url . '",
9511 data: function (params) {
9513 q: params.term, // search term
9517 processResults: function (data) {
9518 // parse the results into the format expected by Select2.
9519 // since we are using custom formatting functions we do not need to alter the remote JSON data
9520 //console.log(data);
9521 saveRemoteData = data;
9522 /* format json result for select2 */
9524 $.each( data, function( key, value ) {
9525 result.push({id: key, text: value.text});
9527 //return {results:[{id:\'none\', text:\'aa\'}, {id:\'rrr\', text:\'Red\'},{id:\'bbb\', text:\'Search a into projects\'}], more:false}
9528 //console.log(result);
9529 return {results: result, more: false}
9533 language: (typeof select2arrayoflanguage === \'undefined\') ? \'en\' : select2arrayoflanguage,
9534 containerCssClass: \':all:\', /* Line to add class from the original SELECT propagated to the new <span class="select2-selection...> tag */
9536 escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
9537 minimumInputLength: ' . ((int) $minimumInputLength) .
',
9538 formatResult: function (result, container, query, escapeMarkup) {
9539 return escapeMarkup(result.text);
9543 ' . ($callurlonselect ?
'
9544 /* Code to execute a GET when we select a value */
9545 $(".' . $htmlname .
'").change(function() {
9546 var selected = $(\'.' .
dol_escape_js($htmlname) .
'\').val();
9547 console.log("We select in selectArrayAjax the entry "+selected)
9548 $(\'.' .
dol_escape_js($htmlname) .
'\').val(""); /* reset visible combo value */
9549 $.each( saveRemoteData, function( key, value ) {
9550 if (key == selected)
9552 console.log("selectArrayAjax - Do a redirect to "+value.url)
9553 location.assign(value.url);
9562 if ($acceptdelayedhtml) {
9563 $delayedhtmlcontent .= $outdelayed;
9565 $out .= $outdelayed;
9589 public static function selectArrayFilter($htmlname, $array,
$id =
'', $moreparam =
'', $disableFiltering = 0, $disabled = 0, $minimumInputLength = 1, $morecss =
'', $callurlonselect = 0, $placeholder =
'', $acceptdelayedhtml = 0, $textfortitle =
'')
9592 global $delayedhtmlcontent;
9595 if (!
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') && !defined(
'REQUIRE_JQUERY_MULTISELECT')) {
9599 $out =
'<select type="text"'.($textfortitle ?
' title="'.dol_escape_htmltag($textfortitle).
'"' :
'').
' id="'.$htmlname.
'" class="'.$htmlname.($morecss ?
' ' . $morecss :
'').
'"'.($moreparam ?
' '.$moreparam :
'').
' name="'.$htmlname.
'"><option></option></select>';
9601 $formattedarrayresult = array();
9603 foreach ($array as $key => $value) {
9606 $o->text = $value[
'text'];
9607 $o->url = $value[
'url'];
9608 $formattedarrayresult[] = $o;
9612 if (!empty(
$conf->use_javascript_ajax)) {
9613 $tmpplugin =
'select2';
9614 $outdelayed =
"\n" .
'<!-- JS CODE TO ENABLE ' . $tmpplugin .
' for id ' . $htmlname .
' -->
9615 <script nonce="' .
getNonce() .
'">
9616 $(document).ready(function () {
9617 var data = ' . json_encode($formattedarrayresult) .
';
9619 ' . ($callurlonselect ?
'var saveRemoteData = ' . json_encode($array) .
';' :
'') .
'
9623 language: (typeof select2arrayoflanguage === \
'undefined\') ? \'en\' : select2arrayoflanguage,
9624 containerCssClass: \':all:\', /* Line to add class from the original SELECT propagated to the new <span class="select2-selection...> tag */
9626 escapeMarkup:
function (markup) {
return markup; },
9627 minimumInputLength:
' . ((int) $minimumInputLength) . ',
9628 formatResult:
function (result, container, query, escapeMarkup) {
9629 return escapeMarkup(result.text);
9631 matcher:
function (params, data) {
9633 if(! data.id)
return null;
';
9635 if ($callurlonselect) {
9636 // We forge the url with 'sall=
'
9639 var urlBase = data.url;
9640 var separ = urlBase.indexOf(
"?") >= 0 ?
"&" :
"?";
9643 saveRemoteData[data.id].url = urlBase + separ +
"search_all=" + encodeURIComponent(params.term.replace(/\
"/g, ""));';
9646 if (!$disableFiltering) {
9649 if(data.text.match(new RegExp(params.term))) {
9664 ' . ($callurlonselect ? '
9665 /* Code to execute a GET when we select a value */
9666 $(\'.' . dol_escape_js($htmlname) . '\').change(function() {
9667 var selected = $(\'.' . dol_escape_js($htmlname) . '\').val();
9668 console.log("We select
"+selected)
9670 $(\'.' . dol_escape_js($htmlname) . '\').val(""); /* reset visible combo value */
9671 $.each( saveRemoteData, function( key, value ) {
9672 if (key == selected)
9674 console.log("selectArrayFilter - Do a redirect to
"+value.url)
9675 location.assign(value.url);
9684 if ($acceptdelayedhtml) {
9685 $delayedhtmlcontent .= $outdelayed;
9687 $out .= $outdelayed;
9710 public static function multiselectarray($htmlname, $array, $selected = array(), $key_in_label = 0, $value_as_key = 0, $morecss = '', $translate = 0, $width = 0, $moreattrib = '', $nu = '', $placeholder = '', $addjscombo = -1)
9712 global $conf, $langs;
9715 if ($addjscombo < 0) {
9716 if (!getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER')) {
9723 $useenhancedmultiselect = 0;
9724 if (!empty($conf->use_javascript_ajax) && !defined('MAIN_DO_NOT_USE_JQUERY_MULTISELECT') && (getDolGlobalString('MAIN_USE_JQUERY_MULTISELECT') || defined('REQUIRE_JQUERY_MULTISELECT'))) {
9726 $useenhancedmultiselect = 1; // Use the js multiselect in one line. Possible only if $addjscombo not 0.
9730 $out .= '<span class="multiselectarray
'.$htmlname.'">';
9732 // We need a hidden field because when using the multiselect, if we unselect all, there is no
9733 // variable submitted at all, so no way to make a difference between variable not submitted and variable
9734 // submitted to nothing.
9735 $out .= '<input type="hidden
" name="'.$htmlname.'_multiselect
" value="1
">';
9736 // Output select component
9737 $out .= '<select id="' . $htmlname . '" class="multiselect
' . ($useenhancedmultiselect ? ' multiselectononeline
' : '') . ($morecss ? ' ' . $morecss : '') . '" multiple name="' . $htmlname . '[]
"' . ($moreattrib ? ' ' . $moreattrib : '') . ($width ? ' style="width:
' . (preg_match('/%/
', (string) $width) ? $width : $width . 'px
') . '"' : '') . '>' . "\n
";
9738 if (is_array($array) && !empty($array)) {
9739 if ($value_as_key) {
9740 $array = array_combine($array, $array);
9743 if (!empty($array)) {
9744 foreach ($array as $key => $value) {
9750 if (is_array($value) && array_key_exists('id', $value) && array_key_exists('label', $value)) {
9751 $tmpkey = $value['id'];
9752 $tmpvalue = empty($value['label']) ? '' : $value['label'];
9753 $tmpcolor = empty($value['color']) ? '' : $value['color'];
9754 $tmppicto = empty($value['picto']) ? '' : $value['picto'];
9755 $tmplabelhtml = empty($value['labelhtml']) ? (empty($value['data-html']) ? '' : $value['data-html']) : $value['labelhtml'];
9757 $newval = ($translate ? $langs->trans($tmpvalue) : $tmpvalue);
9758 $newval = ($key_in_label ? $tmpkey . ' - ' . $newval : $newval);
9760 $out .= '<option value="' . $tmpkey . '"';
9761 if (is_array($selected) && !empty($selected) && in_array((string) $tmpkey, $selected) && ((string) $tmpkey != '')) {
9762 $out .= ' selected';
9764 if (!empty($tmplabelhtml)) {
9765 $out .= ' data-html="' . dol_escape_htmltag($tmplabelhtml, 0, 0, '', 0, 1) . '"';
9767 $tmplabelhtml = ($tmppicto ? img_picto('', $tmppicto, 'class="pictofixedwidth
" style="color: #
' . $tmpcolor . '"') : '') . $newval;
9768 $out .= ' data-html="' . dol_escape_htmltag($tmplabelhtml, 0, 0, '', 0, 1) . '"';
9771 $out .= dol_htmlentitiesbr($newval);
9772 $out .= '</option>' . "\n
";
9776 $out .= '</select>' . "\n
";
9780 // Add code for jquery to use multiselect
9781 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('MAIN_USE_JQUERY_MULTISELECT') || defined('REQUIRE_JQUERY_MULTISELECT')) {
9782 $out .= "\n
" . '<!-- JS CODE TO ENABLE select for id ' . $htmlname . ', addjscombo=' . $addjscombo . ' -->';
9783 $out .= "\n
" . '<script nonce="' . getNonce() . '">' . "\n
";
9784 if ($addjscombo == 1) {
9785 $tmpplugin = getDolGlobalString('MAIN_USE_JQUERY_MULTISELECT', (defined('REQUIRE_JQUERY_MULTISELECT') ? constant('REQUIRE_JQUERY_MULTISELECT') : 'select2'));
9787 // If property data-html set, we decode html entities and use this.
9788 // Note that HTML content must have been sanitized from js with dol_escape_htmltag(xxx, 0, 0, '', 0, 1) when building the select option.
9789 // TODO Move this into common js ?
9790 $out .= 'function formatResult(record, container) {' . "\n
";
9791 $out .= ' if ($(record.element).attr("data-html
") != undefined && typeof htmlEntityDecodeJs === "function
") {';
9792 $out .= ' return htmlEntityDecodeJs($(record.element).attr("data-html
"));';
9794 $out .= ' return record.text;';
9797 $out .= 'function formatSelection(record) {' . "\n
";
9798 $out .= ' return record.text;';
9801 // Load the select2 enhancer
9802 //$out .= 'console.log(\'addjscombo=1 for htmlname=' . dol_escape_js($htmlname) . '\');';
9803 $out .= '$(document).ready(function () {
9804 $(\'#' . dol_escape_js($htmlname) . '\').' . $tmpplugin . '({';
9809 text: \''.dol_escape_js($placeholder).'\'
9812 $out .= ' dir: \'ltr\',
9813 containerCssClass: \':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag (ko with multiselect) */
9814 dropdownCssClass: \
'' .
dol_escape_js($morecss) .
'\', /* Line to add class on the new <span class="select2-selection...> tag (ok with multiselect). Need full version of select2. */
9815 // Specify format function for dropdown item
9816 formatResult: formatResult,
9817 templateResult: formatResult, /* For 4.0 */
9818 escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
9819 // Specify format function for selected item
9820 formatSelection: formatSelection,
9821 templateSelection: formatSelection, /* For 4.0 */
9822 language: (typeof select2arrayoflanguage === \'undefined\') ? \'en\' : select2arrayoflanguage
9825 /* Add also morecss to the css .select2 that is after the #htmlname, for component that are shown dynamically after load, because select2 set
9826 the size only if component is not hidden by default on load */
9829 } elseif ($addjscombo == 2 && !defined(
'DISABLE_MULTISELECT')) {
9833 $out .=
'console.log(\'addjscombo=2 for htmlname=' .
dol_escape_js($htmlname) .
'\');
';
9834 $out .= '$(document).ready(
function () {
9836 containerHTML: \
'<div class="multi-select-container">\',
9837 menuHTML: \'<div class="multi-select-menu">\',
9838 buttonHTML: \'<span class="multi-select-button ' .
dol_escape_js($morecss) .
'">\',
9839 menuItemHTML: \'<label class="multi-select-menuitem">\',
9840 activeClass: \'multi-select-container--open\',
9845 $out .= '</script>
';
9863 public static function multiSelectArrayWithCheckbox($htmlname, &$array, $varpage, $pos = '
')
9865 global $conf, $langs, $user;
9867 if (getDolGlobalString('MAIN_OPTIMIZEFORTEXTBROWSER
')) {
9870 if (empty($array)) {
9874 $tmpvar = "MAIN_SELECTEDFIELDS_" . $varpage; // To get list of saved selected fields to show
9876 if (!empty($user->conf->$tmpvar)) { // A list of fields was already customized for user
9877 $tmparray = explode(',
', $user->conf->$tmpvar);
9878 foreach ($array as $key => $val) {
9880 //var_dump($tmparray);
9881 if (in_array($key, $tmparray)) {
9882 $array[$key]['checked
'] = 1;
9884 $array[$key]['checked
'] = 0;
9887 } else { // There is no list of fields already customized for user
9888 foreach ($array as $key => $val) {
9889 if (!empty($array[$key]['checked
']) && $array[$key]['checked
'] < 0) {
9890 $array[$key]['checked
'] = 0;
9895 $listoffieldsforselection = '';
9896 $listcheckedstring = '';
9898 foreach ($array as $key => $val) {
9900 // var_dump(array_key_exists('enabled
', $val));
9901 // var_dump(!$val['enabled
']);
9902 if (array_key_exists('enabled
', $val) && isset($val['enabled
']) && !$val['enabled
']) {
9903 unset($array[$key]); // We don't want
this field
9906 if (!empty($val[
'type']) && $val[
'type'] ==
'separate') {
9911 if (!empty($val[
'label']) && $val[
'label']) {
9912 if (!empty($val[
'langfile']) && is_object($langs)) {
9913 $langs->load($val[
'langfile']);
9917 $listoffieldsforselection .=
'<li><input type="checkbox" id="checkbox' . $key .
'" value="' . $key .
'"' . ((!array_key_exists(
'checked', $val) || empty($val[
'checked']) || $val[
'checked'] ==
'-1') ?
'' :
' checked="checked"') .
' data-position="'.(empty($val[
'position']) ?
'' : $val[
'position']).
'" />';
9918 $listoffieldsforselection .=
'<label for="checkbox' . $key .
'" class="paddingleft">';
9920 $listoffieldsforselection .=
'</label></li>';
9921 $listcheckedstring .= (empty($val[
'checked']) ?
'' : $key .
',');
9925 $out =
'<!-- Component multiSelectArrayWithCheckbox ' . $htmlname .
' -->
9927 <dl class="dropdown">
9929 <a href="#' . $htmlname .
'">
9932 <input type="hidden" class="' . $htmlname .
'" name="' . $htmlname .
'" value="' . $listcheckedstring .
'">
9934 <dd class="dropdowndd">
9935 <div class="multiselectcheckbox'.$htmlname.
'">
9936 <ul class="'.$htmlname.(((string) $pos ==
'1' || (
string) $pos ==
'left') ?
'left' :
'').
'">
9937 <li class="liinputsearch">
9938 <input class="inputsearch_dropdownselectedfields width90p minwidth200imp" style="width:90%;" type="text" placeholder="'.$langs->trans(
'Search').
'">
9940 '.$listoffieldsforselection.
'
9946 <script nonce="' .
getNonce() .
'" type="text/javascript">
9947 jQuery(document).ready(function () {
9948 $(\'.multiselectcheckbox' . $htmlname .
' input[type="checkbox"]\').on("click", function () {
9949 console.log("A new field was added/removed, we edit field input[name=formfilteraction]");
9951 $("input:hidden[name=formfilteraction]").val(\'listafterchangingselectedfields\'); // Update field so we know we changed something on selected fields after POST
9953 var title = $(this).val() + ",";
9954 if ($(this).is(\':checked\')) {
9955 $(\'.' . $htmlname .
'\').val(title + $(\'.' . $htmlname .
'\').val());
9958 $(\'.' . $htmlname .
'\').val( $(\'.' . $htmlname .
'\').val().replace(title, \'\') )
9960 // Now, we submit page
9961 //$(this).parents(\'form:first\').submit();
9964 $("input.inputsearch_dropdownselectedfields").on("keyup", function() {
9965 console.log("keyup on inputsearch_dropdownselectedfields");
9966 var value = $(this).val().toLowerCase();
9967 $(\'.multiselectcheckbox'.$htmlname.
' li > label\').filter(function() {
9968 $(this).parent().toggle($(this).text().toLowerCase().indexOf(value) > -1)
9972 if (empty(
$conf->browser->layout) ||
$conf->browser->layout !=
'phone') {
9974 $(".dropdown dt a").on("click", function () {
9975 console.log("Click on dropdown, we set focus to search field");
9976 setTimeout(() => { $(\'.inputsearch_dropdownselectedfields\').focus(); }, 200);
9998 include_once DOL_DOCUMENT_ROOT .
'/categories/class/categorie.class.php';
10001 $categories = $cat->containing(
$id, $type);
10003 if ($rendermode == 1) {
10004 $toprint = array();
10005 foreach ($categories as
$c) {
10006 $ways =
$c->print_all_ways(
' >> ', ($nolink ?
'none' :
''), 0, 1);
10007 foreach ($ways as $way) {
10008 $color =
$c->color;
10009 $sfortag =
'<li class="select2-search-choice-dolibarr noborderoncategories"' . ($color ?
' style="background: #' . $color .
';"' :
' style="background: #bbb"') .
'>';
10011 $sfortag .=
'</li>';
10012 $toprint[] = $sfortag;
10015 if (empty($toprint)) {
10018 return '<div class="select2-container-multi-dolibarr"><ul class="select2-choices-dolibarr">' . implode(
' ', $toprint) .
'</ul></div>';
10022 if ($rendermode == 0) {
10023 $arrayselected = array();
10024 $cate_arbo = $this->select_all_categories($type,
'',
'parent', 64, 0, 3);
10025 foreach ($categories as
$c) {
10026 $arrayselected[(string)
$c->id] = (
string)
$c->id;
10029 return $this->multiselectarray(
'categories', $cate_arbo, $arrayselected, 0, 0,
'', 0,
'100%',
'disabled',
'category');
10032 return 'ErrorBadValueForParameterRenderMode';
10046 global
$conf, $langs, $hookmanager;
10049 $object->fetchObjectLinked();
10052 $hookmanager->initHooks(array(
'commonobject'));
10053 $parameters = array(
10054 'morehtmlright' => $morehtmlright,
10055 'compatibleImportElementsList' => &$compatibleImportElementsList,
10057 $reshook = $hookmanager->executeHooks(
'showLinkedObjectBlock', $parameters,
$object, $action);
10059 $nbofdifferenttypes = count(
$object->linkedObjects);
10061 if (empty($reshook)) {
10062 print
'<!-- showLinkedObjectBlock -->';
10063 print
load_fiche_titre($langs->trans($title), $morehtmlright,
'', 0,
'',
'showlinkedobjectblock');
10066 print
'<div class="div-table-responsive-no-min">';
10067 print
'<table class="noborder allwidth" data-block="showLinkedObject" data-element="' .
$object->element .
'" data-elementid="' .
$object->id .
'" >';
10069 print
'<tr class="liste_titre">';
10070 print
'<td>' . $langs->trans(
"Type") .
'</td>';
10071 print
'<td>' . $langs->trans(
"Ref") .
'</td>';
10072 print
'<td class="center"></td>';
10073 print
'<td class="center">' . $langs->trans(
"Date") .
'</td>';
10074 print
'<td class="right">' . $langs->trans(
"AmountHTShort") .
'</td>';
10075 print
'<td class="right">' . $langs->trans(
"Status") .
'</td>';
10079 $nboftypesoutput = 0;
10081 foreach (
$object->linkedObjects as $objecttype => $objects) {
10082 $tplpath = $element = $subelement = $objecttype;
10085 $showImportButton =
false;
10086 if (!empty($compatibleImportElementsList) && in_array($element, $compatibleImportElementsList)) {
10087 $showImportButton =
true;
10092 if ($objecttype !=
'supplier_proposal' && preg_match(
'/^([^_]+)_([^_]+)/i', $objecttype, $regs)) {
10093 $element = $regs[1];
10094 $subelement = $regs[2];
10095 $tplpath = $element .
'/' . $subelement;
10097 $tplname =
'linkedobjectblock';
10100 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $objecttype, $regs)) {
10101 $element = $regs[1];
10102 $module = $regs[2];
10103 $tplpath = $module.
'/' . $element;
10104 $tplname = $tplname.
'_'.$element;
10108 if ($objecttype ==
'facture') {
10109 $tplpath =
'compta/' . $element;
10110 if (!isModEnabled(
'invoice')) {
10113 } elseif ($objecttype ==
'facturerec') {
10114 $tplpath =
'compta/facture';
10115 $tplname =
'linkedobjectblockForRec';
10116 if (!isModEnabled(
'invoice')) {
10119 } elseif ($objecttype ==
'propal') {
10120 $tplpath =
'comm/' . $element;
10121 if (!isModEnabled(
'propal')) {
10124 } elseif ($objecttype ==
'supplier_proposal') {
10125 if (!isModEnabled(
'supplier_proposal')) {
10128 } elseif ($objecttype ==
'shipping' || $objecttype ==
'shipment' || $objecttype ==
'expedition') {
10129 $tplpath =
'expedition';
10130 if (!isModEnabled(
'shipping')) {
10133 } elseif ($objecttype ==
'reception') {
10134 $tplpath =
'reception';
10135 if (!isModEnabled(
'reception')) {
10138 } elseif ($objecttype ==
'delivery') {
10139 $tplpath =
'delivery';
10143 } elseif ($objecttype ==
'ficheinter') {
10144 $tplpath =
'fichinter';
10145 if (!isModEnabled(
'intervention')) {
10148 } elseif ($objecttype ==
'invoice_supplier') {
10149 $tplpath =
'fourn/facture';
10150 } elseif ($objecttype ==
'order_supplier') {
10151 $tplpath =
'fourn/commande';
10152 } elseif ($objecttype ==
'expensereport') {
10153 $tplpath =
'expensereport';
10154 } elseif ($objecttype ==
'subscription') {
10155 $tplpath =
'adherents';
10156 } elseif ($objecttype ==
'conferenceorbooth') {
10157 $tplpath =
'eventorganization';
10158 } elseif ($objecttype ==
'conferenceorboothattendee') {
10159 $tplpath =
'eventorganization';
10160 } elseif ($objecttype ==
'mo') {
10162 if (!isModEnabled(
'mrp')) {
10165 } elseif ($objecttype ==
'project_task') {
10166 $tplpath =
'projet/tasks';
10169 global $linkedObjectBlock;
10170 $linkedObjectBlock = $objects;
10173 $dirtpls = array_merge(
$conf->modules_parts[
'tpl'], array(
'/' . $tplpath .
'/tpl'));
10175 foreach ($dirtpls as $reldir) {
10176 $reldir = rtrim($reldir,
'/');
10177 if ($nboftypesoutput == ($nbofdifferenttypes - 1)) {
10178 global $noMoreLinkedObjectBlockAfter;
10179 $noMoreLinkedObjectBlockAfter = 1;
10182 $res = @include
dol_buildpath($reldir .
'/' . $tplname .
'.tpl.php');
10184 $nboftypesoutput++;
10190 if (!$nboftypesoutput) {
10191 print
'<tr><td colspan="7"><span class="opacitymedium">' . $langs->trans(
"None") .
'</span></td></tr>';
10196 if (!empty($compatibleImportElementsList)) {
10197 $res = @include
dol_buildpath(
'core/tpl/objectlinked_lineimport.tpl.php');
10203 return $nbofdifferenttypes;
10217 global
$conf, $langs, $hookmanager, $form;
10220 if (empty($form)) {
10221 $form =
new Form($this->db);
10225 $linktoelemlist =
'';
10226 $listofidcompanytoscan =
'';
10228 if (!is_object(
$object->thirdparty)) {
10232 $possiblelinks = array();
10234 $dontIncludeCompletedItems =
getDolGlobalString(
'DONT_INCLUDE_COMPLETED_ELEMENTS_LINKS');
10236 if (is_object(
$object->thirdparty) && !empty(
$object->thirdparty->id) &&
$object->thirdparty->id > 0) {
10237 $listofidcompanytoscan = (int)
$object->thirdparty->id;
10239 $listofidcompanytoscan .=
',' . (int)
$object->thirdparty->parent;
10242 include_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
10243 $tmpproject =
new Project($this->db);
10244 $tmpproject->fetch(
$object->fk_project);
10245 if ($tmpproject->socid > 0 && ($tmpproject->socid !=
$object->thirdparty->id)) {
10246 $listofidcompanytoscan .=
',' . (int) $tmpproject->socid;
10248 unset($tmpproject);
10251 $possiblelinks = array(
10253 'enabled' => isModEnabled(
'propal'),
10255 'label' =>
'LinkToProposal',
10256 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_client, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"propal as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'propal') .
')'.($dontIncludeCompletedItems ?
' AND t.fk_statut < 4' :
''),
10258 'shipping' => array(
10259 'enabled' => isModEnabled(
'shipping'),
10261 'label' =>
'LinkToExpedition',
10262 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"expedition as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'shipping') .
')'.($dontIncludeCompletedItems ?
' AND t.fk_statut < 2' :
''),
10265 'enabled' => isModEnabled(
'order'),
10267 'label' =>
'LinkToOrder',
10268 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_client, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"commande as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'commande') .
')'.($dontIncludeCompletedItems ?
' AND t.facture < 1' :
''),
10269 'linkname' =>
'commande',
10270 'subscription' => array(
10271 'enabled' => isModEnabled(
'member'),
10273 'label' =>
'LinkToMemberSubscription',
10274 'sql' =>
"SELECT a.fk_soc as socid, CONCAT(a.firstname, ' ', a.lastname) as name, a.entity as client, sub.rowid, sub.note as ref, '' as ref_client, sub.subscription as total_ht FROM " . $this->db->prefix() .
"adherent as a, " . $this->db->prefix() .
"subscription as sub WHERE sub.fk_adherent = a.rowid AND a.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND a.entity IN (' .
getEntity(
'subscription') .
')',
10275 'linkname' =>
'subscription'),
10277 'invoice' => array(
10278 'enabled' => isModEnabled(
'invoice'),
10280 'label' =>
'LinkToInvoice',
10281 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_client, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"facture as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'invoice') .
')'.($dontIncludeCompletedItems ?
' AND t.paye < 1' :
''),
10282 'linkname' =>
'facture',
10284 'invoice_template' => array(
10285 'enabled' => isModEnabled(
'invoice'),
10287 'label' =>
'LinkToTemplateInvoice',
10288 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.titre as ref, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"facture_rec as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'invoice') .
')',
10290 'contrat' => array(
10291 'enabled' => isModEnabled(
'contract'),
10293 'label' =>
'LinkToContract',
10294 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_customer as ref_client, t.ref_supplier, SUM(td.total_ht) as total_ht
10295 FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"contrat as t, " . $this->db->prefix() .
"contratdet as td WHERE t.fk_soc = s.rowid AND td.fk_contrat = t.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'contract') .
') GROUP BY s.rowid, s.nom, s.client, t.rowid, t.ref, t.ref_customer, t.ref_supplier',
10297 'fichinter' => array(
10298 'enabled' => isModEnabled(
'intervention'),
10300 'label' =>
'LinkToIntervention',
10301 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"fichinter as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'intervention') .
')',
10303 'supplier_proposal' => array(
10304 'enabled' => isModEnabled(
'supplier_proposal'),
10306 'label' =>
'LinkToSupplierProposal',
10307 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, '' as ref_supplier, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"supplier_proposal as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'supplier_proposal') .
')'.($dontIncludeCompletedItems ?
' AND t.fk_statut < 4' :
''),
10309 'order_supplier' => array(
10310 'enabled' => isModEnabled(
"supplier_order"),
10312 'label' =>
'LinkToSupplierOrder',
10313 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_supplier, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"commande_fournisseur as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'commande_fournisseur') .
')'.($dontIncludeCompletedItems ?
' AND t.billed < 1' :
''),
10315 'invoice_supplier' => array(
10316 'enabled' => isModEnabled(
"supplier_invoice"),
10317 'perms' => 1,
'label' =>
'LinkToSupplierInvoice',
10318 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_supplier, t.total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"facture_fourn as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'facture_fourn') .
')'.($dontIncludeCompletedItems ?
' AND t.paye < 1' :
''),
10321 'enabled' => isModEnabled(
'ticket'),
10323 'label' =>
'LinkToTicket',
10324 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.track_id, '0' as total_ht FROM " . $this->db->prefix() .
"societe as s, " . $this->db->prefix() .
"ticket as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'ticket') .
')'.($dontIncludeCompletedItems ?
' AND t.fk_statut < 8' :
''),
10327 'enabled' => isModEnabled(
'mrp'),
10329 'label' =>
'LinkToMo',
10330 'sql' =>
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.rowid, '0' as total_ht FROM " . $this->db->prefix() .
"societe as s INNER JOIN " . $this->db->prefix() .
"mrp_mo as t ON t.fk_soc = s.rowid WHERE t.fk_soc IN (" . $this->db->sanitize($listofidcompanytoscan) .
') AND t.entity IN (' .
getEntity(
'mo') .
')'.($dontIncludeCompletedItems ?
' AND t.status < 3' :
''),
10335 if (
$object->table_element ==
'commande_fournisseur') {
10336 $possiblelinks[
'mo'][
'sql'] =
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.rowid, '0' as total_ht FROM ".$this->db->prefix().
"societe as s INNER JOIN ".$this->db->prefix().
'mrp_mo as t ON t.fk_soc = s.rowid WHERE t.entity IN ('.
getEntity(
'mo').
')'.($dontIncludeCompletedItems ?
' AND t.status < 3' :
'');
10337 } elseif (
$object->table_element ==
'mrp_mo') {
10338 $possiblelinks[
'order_supplier'][
'sql'] =
"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_supplier, t.total_ht FROM ".$this->db->prefix().
"societe as s, ".$this->db->prefix().
'commande_fournisseur as t WHERE t.fk_soc = s.rowid AND t.entity IN ('.
getEntity(
'commande_fournisseur').
')'.($dontIncludeCompletedItems ?
' AND t.billed < 1' :
'');
10342 if (!empty($listofidcompanytoscan)) {
10344 $hookmanager->initHooks(array(
'commonobject'));
10345 $parameters = array(
'listofidcompanytoscan' => $listofidcompanytoscan,
'possiblelinks' => $possiblelinks);
10346 $reshook = $hookmanager->executeHooks(
'showLinkToObjectBlock', $parameters,
$object, $action);
10349 if (empty($reshook)) {
10350 if (is_array($hookmanager->resArray) && count($hookmanager->resArray)) {
10351 $possiblelinks = array_merge($possiblelinks, $hookmanager->resArray);
10353 } elseif ($reshook > 0) {
10354 if (is_array($hookmanager->resArray) && count($hookmanager->resArray)) {
10355 $possiblelinks = $hookmanager->resArray;
10359 if (!empty($possiblelinks)) {
10360 $object->fetchObjectLinked();
10364 $htmltoenteralink =
'';
10365 foreach ($possiblelinks as $key => $possiblelink) {
10367 if (empty($possiblelink[
'enabled'])) {
10374 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $key, $regs)) {
10379 if (!empty($possiblelink[
'perms']) && (empty($restrictlinksto) || in_array($key, $restrictlinksto)) && (empty($excludelinksto) || !in_array($key, $excludelinksto))) {
10380 $htmltoenteralink .=
'<div id="' . $key .
'list"' . (empty(
$conf->use_javascript_ajax) ?
'' :
' style="display:none"') .
'>';
10384 $htmltoenteralink .=
'<br>'.
"\n";
10385 $htmltoenteralink .=
'<!-- form to add a link from anywhere -->'.
"\n";
10386 $htmltoenteralink .=
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST" name="formlinkedbyref' . $key .
'">';
10387 $htmltoenteralink .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
10388 $htmltoenteralink .=
'<input type="hidden" name="action" value="addlinkbyref">';
10389 $htmltoenteralink .=
'<input type="hidden" name="id" value="' .
$object->id .
'">';
10390 $htmltoenteralink .=
'<input type="hidden" name="addlink" value="' . $key .(!empty($module)?
'@'.$module:
'').
'">';
10391 $htmltoenteralink .=
'<table class="noborder">';
10392 $htmltoenteralink .=
'<tr class="liste_titre">';
10394 $htmltoenteralink .=
'<td class="center"><input type="text" placeholder="'.dol_escape_htmltag($langs->trans(
"Ref")).
'" name="reftolinkto" value="' .
dol_escape_htmltag(
GETPOST(
'reftolinkto',
'alpha')) .
'"> ';
10395 $htmltoenteralink .=
'<input type="submit" class="button smallpaddingimp valignmiddle" value="' . $langs->trans(
'ToLink') .
'"> ';
10396 $htmltoenteralink .=
'<input type="submit" class="button smallpaddingimp" name="cancel" value="' . $langs->trans(
'Cancel') .
'"></td>';
10397 $htmltoenteralink .=
'</tr>';
10398 $htmltoenteralink .=
'</table>';
10399 $htmltoenteralink .=
'</form>';
10402 $sql = $possiblelink[
'sql'];
10404 $resqllist = $this->db->query($sql);
10406 $num = $this->db->num_rows($resqllist);
10412 $htmltoenteralink .=
'<br>';
10414 $htmltoenteralink .=
'<!-- form to add a link from object to same thirdparty -->'.
"\n";
10415 $htmltoenteralink .=
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST" name="formlinked' . $key .
'">';
10416 $htmltoenteralink .=
'<input type="hidden" name="token" value="' .
newToken() .
'">';
10417 $htmltoenteralink .=
'<input type="hidden" name="action" value="addlink">';
10418 $htmltoenteralink .=
'<input type="hidden" name="id" value="' .
$object->id .
'">';
10419 $htmltoenteralink .=
'<input type="hidden" name="addlink" value="' . $key . (!empty($module)?
'@'.$module:
'').
'">';
10420 $htmltoenteralink .=
'<table class="noborder">';
10421 $htmltoenteralink .=
'<tr class="liste_titre">';
10422 $htmltoenteralink .=
'<td class="nowrap"></td>';
10423 $htmltoenteralink .=
'<td>' . $langs->trans(
"Ref") .
'</td>';
10424 $htmltoenteralink .=
'<td>' . $langs->trans(
"RefCustomer") .
'</td>';
10425 $htmltoenteralink .=
'<td class="right">' . $langs->trans(
"AmountHTShort") .
'</td>';
10426 $htmltoenteralink .=
'<td>' . $langs->trans(
"Company") .
'</td>';
10427 $htmltoenteralink .=
'</tr>';
10428 while ($i < $num) {
10429 $objp = $this->db->fetch_object($resqllist);
10430 $alreadylinked =
false;
10431 if (!empty(
$object->linkedObjectsIds[$possiblelink[
'linkname'] ?? $key])) {
10432 if (in_array($objp->rowid, array_values(
$object->linkedObjectsIds[$possiblelink[
'linkname'] ?? $key]))) {
10433 $alreadylinked =
true;
10436 $htmltoenteralink .=
'<tr class="oddeven">';
10437 $htmltoenteralink .=
'<td>';
10438 if ($alreadylinked) {
10439 $htmltoenteralink .=
img_picto(
'',
'link');
10441 $htmltoenteralink .=
'<input type="checkbox" name="idtolinkto[' . $key .
'_' . $objp->rowid .
']" id="' . $key .
'_' . $objp->rowid .
'" value="' . $objp->rowid .
'">';
10443 $htmltoenteralink .=
'</td>';
10444 $htmltoenteralink .=
'<td><label for="' . $key .
'_' . $objp->rowid .
'">' . $objp->ref .
'</label></td>';
10445 $htmltoenteralink .=
'<td>' . (!empty($objp->ref_client) ? $objp->ref_client : (!empty($objp->ref_supplier) ? $objp->ref_supplier :
'')) .
'</td>';
10446 $htmltoenteralink .=
'<td class="right">';
10447 if ($possiblelink[
'label'] ==
'LinkToContract') {
10448 $htmltoenteralink .= $form->textwithpicto(
'', $langs->trans(
"InformationOnLinkToContract")) .
' ';
10450 $htmltoenteralink .=
'<span class="amount">' . (isset($objp->total_ht) ?
price($objp->total_ht) :
'') .
'</span>';
10451 $htmltoenteralink .=
'</td>';
10452 $htmltoenteralink .=
'<td>' . $objp->name .
'</td>';
10453 $htmltoenteralink .=
'</tr>';
10456 $htmltoenteralink .=
'</table>';
10457 $htmltoenteralink .=
'<div class="center">';
10459 $htmltoenteralink .=
'<input type="submit" class="button valignmiddle marginleftonly marginrightonly smallpaddingimp" value="' . $langs->trans(
'ToLink') .
'">';
10461 if (empty(
$conf->use_javascript_ajax)) {
10462 $htmltoenteralink .=
'<input type="submit" class="button button-cancel marginleftonly marginrightonly smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'"></div>';
10464 $htmltoenteralink .=
'<input type="submit" onclick="jQuery(\'#' . $key .
'list\').toggle(); return false;" class="button button-cancel marginleftonly marginrightonly smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'"></div>';
10466 $htmltoenteralink .=
'</form>';
10469 $this->db->free($resqllist);
10473 $htmltoenteralink .=
'</div>';
10478 $linktoelemlist .=
'<li><a href="#linkto' . $key .
'" class="linkto dropdowncloseonclick" rel="' . $key .
'">' . $langs->trans($possiblelink[
'label']) .
' (' . $num .
')</a></li>';
10481 $linktoelemlist .=
'<li><span class="linktodisabled">' . $langs->trans($possiblelink[
'label']) .
' (0)</span></li>';
10486 if ($linktoelemlist) {
10488 <dl class="dropdown" id="linktoobjectname">
10490 if (!empty(
$conf->use_javascript_ajax)) {
10491 $linktoelem .=
'<dt><a href="#linktoobjectname"><span class="fas fa-link paddingrightonly"></span>' . $langs->trans(
"LinkTo") .
'...</a></dt>';
10493 $linktoelem .=
'<dd>
10494 <div class="multiselectlinkto">
10495 <ul class="ulselectedfields">' . $linktoelemlist .
'
10504 if (!empty(
$conf->use_javascript_ajax)) {
10505 print
'<!-- Add js to show linkto box -->
10506 <script nonce="' .
getNonce() .
'">
10507 jQuery(document).ready(function() {
10508 jQuery(".linkto").click(function() {
10509 console.log("We choose to show/hide links for rel="+jQuery(this).attr(\'rel\')+" so #"+jQuery(this).attr(\'rel\')+"list");
10510 jQuery("#"+jQuery(this).attr(\'rel\')+"list").toggle();
10518 return array(
'linktoelem' => $linktoelem,
'htmltoenteralink' => $htmltoenteralink);
10520 print $htmltoenteralink;
10523 return $linktoelem;
10540 public function selectyesno($htmlname, $value =
'', $option = 0, $disabled =
false, $useempty = 0, $addjscombo = 0, $morecss =
'width75', $labelyes =
'Yes', $labelno =
'No')
10551 $disabled = ($disabled ?
' disabled' :
'');
10553 $resultyesno =
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" id="' . $htmlname .
'" name="' . $htmlname .
'"' . $disabled .
'>' .
"\n";
10555 $resultyesno .=
'<option value="-1"' . (($value < 0) ?
' selected' :
'') .
'> </option>' .
"\n";
10557 if ((
"$value" ==
'yes') || ($value == 1)) {
10558 $resultyesno .=
'<option value="' . $yes .
'" selected>' . $langs->trans($labelyes) .
'</option>' .
"\n";
10559 $resultyesno .=
'<option value="' . $no .
'">' . $langs->trans($labelno) .
'</option>' .
"\n";
10561 $selected = (($useempty && $value !=
'0' && $value !=
'no') ?
'' :
' selected');
10562 $resultyesno .=
'<option value="' . $yes .
'">' . $langs->trans($labelyes) .
'</option>' .
"\n";
10563 $resultyesno .=
'<option value="' . $no .
'"' . $selected .
'>' . $langs->trans($labelno) .
'</option>' .
"\n";
10565 $resultyesno .=
'</select>' .
"\n";
10568 $resultyesno .=
ajax_combobox($htmlname, array(), 0, 0,
'resolve', ($useempty < 0 ? (
string) $useempty :
'-1'), $morecss);
10571 return $resultyesno;
10588 $sql =
"SELECT rowid, label";
10589 $sql .=
" FROM " . $this->db->prefix() .
"export_model";
10590 $sql .=
" WHERE type = '" . $this->db->escape($type) .
"'";
10591 $sql .=
" ORDER BY rowid";
10592 $result = $this->db->query($sql);
10594 print
'<select class="flat" id="select_' . $htmlname .
'" name="' . $htmlname .
'">';
10596 print
'<option value="-1"> </option>';
10599 $num = $this->db->num_rows($result);
10601 while ($i < $num) {
10602 $obj = $this->db->fetch_object($result);
10603 if ($selected == $obj->rowid) {
10604 print
'<option value="' . $obj->rowid .
'" selected>';
10606 print
'<option value="' . $obj->rowid .
'">';
10636 public function showrefnav(
$object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $morehtmlright =
'')
10638 global
$conf, $langs, $hookmanager, $extralanguages;
10641 if (empty($fieldid)) {
10642 $fieldid =
'rowid';
10644 if (empty($fieldref)) {
10649 $addgendertxt =
'';
10650 if (property_exists(
$object,
'gender') && !empty(
$object->gender)) {
10651 $addgendertxt =
' ';
10654 $addgendertxt .=
'<i class="fas fa-mars valignmiddle"></i>';
10657 $addgendertxt .=
'<i class="fas fa-venus valignmiddle"></i>';
10660 $addgendertxt .=
'<i class="fas fa-transgender valignmiddle"></i>';
10666 if (is_object($hookmanager)) {
10667 $parameters = array(
'showrefnav' =>
true);
10668 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters,
$object);
10669 if (!empty($hookmanager->resPrint)) {
10670 if (empty(
$object->next_prev_filter) && preg_match(
'/^\s*AND/i', $hookmanager->resPrint)) {
10671 $object->next_prev_filter = preg_replace(
'/^\s*AND\s*/i',
'', $hookmanager->resPrint);
10672 } elseif (!empty(
$object->next_prev_filter) && !preg_match(
'/^\s*AND/i', $hookmanager->resPrint)) {
10673 $object->next_prev_filter .=
' AND '.$hookmanager->resPrint;
10675 $object->next_prev_filter .= $hookmanager->resPrint;
10680 $previous_ref = $next_ref =
'';
10683 $object->load_previous_next_ref((isset(
$object->next_prev_filter) ?
$object->next_prev_filter :
''), $fieldid, $nodbprefix);
10685 $navurl = $_SERVER[
"PHP_SELF"];
10687 if ($paramid ==
'project_ref') {
10688 if (preg_match(
'/\/tasks\/(task|contact|note|document)\.php/', $navurl)) {
10689 $navurl = preg_replace(
'/\/tasks\/(task|contact|time|note|document)\.php/',
'/tasks.php', $navurl);
10696 $stringforfirstkey = $langs->trans(
"KeyboardShortcut");
10697 if (
$conf->browser->name ==
'chrome') {
10698 $stringforfirstkey .=
' ALT +';
10699 } elseif (
$conf->browser->name ==
'firefox') {
10700 $stringforfirstkey .=
' ALT + SHIFT +';
10702 $stringforfirstkey .=
' CTL +';
10705 $previous_ref =
$object->ref_previous ?
'<a accesskey="p" alt="'.dol_escape_htmltag($langs->trans(
"Previous")).
'" title="' . $stringforfirstkey .
' p" class="classfortooltip" href="' . $navurl .
'?' . $paramid .
'=' . urlencode(
$object->ref_previous) . $moreparam .
'"><i class="fa fa-chevron-left"></i></a>' :
'<span class="inactive"><i class="fa fa-chevron-left opacitymedium"></i></span>';
10706 $next_ref =
$object->ref_next ?
'<a accesskey="n" alt="'.dol_escape_htmltag($langs->trans(
"Next")).
'" title="' . $stringforfirstkey .
' n" class="classfortooltip" href="' . $navurl .
'?' . $paramid .
'=' . urlencode(
$object->ref_next) . $moreparam .
'"><i class="fa fa-chevron-right"></i></a>' :
'<span class="inactive"><i class="fa fa-chevron-right opacitymedium"></i></span>';
10710 $ret .=
'<!-- Start banner content --><div style="vertical-align: middle">';
10713 if ($morehtmlright) {
10714 $ret .=
'<div class="inline-block floatleft">' . $morehtmlright .
'</div>';
10717 if ($previous_ref || $next_ref || $morehtml) {
10718 $ret .=
'<div class="pagination paginationref"><ul class="right">';
10720 if ($morehtml &&
getDolGlobalInt(
'MAIN_OPTIMIZEFORTEXTBROWSER') < 2) {
10721 $ret .=
'<!-- morehtml --><li class="noborder litext' . (($shownav && $previous_ref && $next_ref) ?
' clearbothonsmartphone' :
'') .
'">' . $morehtml .
'</li>';
10723 if ($shownav && ($previous_ref || $next_ref)) {
10724 $ret .=
'<li class="pagination">' . $previous_ref .
'</li>';
10725 $ret .=
'<li class="pagination">' . $next_ref .
'</li>';
10727 if ($previous_ref || $next_ref || $morehtml) {
10728 $ret .=
'</ul></div>';
10732 $parameters = array(
'morehtmlstatus' => $morehtmlstatus);
10733 $reshook = $hookmanager->executeHooks(
'moreHtmlStatus', $parameters,
$object);
10734 if (empty($reshook)) {
10735 $morehtmlstatus .= $hookmanager->resPrint;
10737 $morehtmlstatus = $hookmanager->resPrint;
10739 if ($morehtmlstatus) {
10740 $ret .=
'<!-- status --><div class="statusref">' . $morehtmlstatus .
'</div>';
10743 $parameters = array();
10744 $reshook = $hookmanager->executeHooks(
'moreHtmlRef', $parameters,
$object);
10745 if (empty($reshook)) {
10746 $morehtmlref .= $hookmanager->resPrint;
10747 } elseif ($reshook > 0) {
10748 $morehtmlref = $hookmanager->resPrint;
10752 if ($morehtmlleft) {
10753 if (
$conf->browser->layout ==
'phone') {
10754 $ret .=
'<!-- morehtmlleft --><div class="floatleft">' . $morehtmlleft .
'</div>';
10756 $ret .=
'<!-- morehtmlleft --><div class="inline-block floatleft">' . $morehtmlleft .
'</div>';
10761 $ret .=
'<!-- Ref or ID --><div class="inline-block floatleft valignmiddle maxwidth750 marginbottomonly refid' . (($shownav && ($previous_ref || $next_ref)) ?
' refidpadding' :
'') .
'">';
10764 if (
$object->element ==
'societe') {
10768 $arrayoflangcode = array();
10773 if (is_array($arrayoflangcode) && count($arrayoflangcode)) {
10774 if (!is_object($extralanguages)) {
10775 include_once DOL_DOCUMENT_ROOT .
'/core/class/extralanguages.class.php';
10778 $extralanguages->fetch_name_extralanguages(
'societe');
10780 if (!empty($extralanguages->attributes[
'societe'][
'name'])) {
10781 $object->fetchValuesForExtraLanguages();
10785 foreach ($arrayoflangcode as $extralangcode) {
10787 if (
$object->array_languages[
'name'][$extralangcode]) {
10788 $htmltext .=
$object->array_languages[
'name'][$extralangcode];
10790 $htmltext .=
'<span class="opacitymedium">' . $langs->trans(
"SwitchInEditModeToAddTranslation") .
'</span>';
10793 $ret .=
'<!-- Show translations of name -->' .
"\n";
10794 $ret .= $this->textwithpicto(
'', $htmltext, -1,
'language',
'opacitymedium paddingleft');
10797 } elseif (
$object->element ==
'member') {
10798 '@phan-var-force Adherent $object';
10799 $ret .=
$object->ref .
'<br>';
10800 $fullname =
$object->getFullName($langs);
10806 } elseif (in_array(
$object->element, array(
'contact',
'user'))) {
10807 $ret .=
'<span class="valignmiddle">'.dol_htmlentities(
$object->getFullName($langs)).
'</span>'.$addgendertxt;
10808 } elseif (
$object->element ==
'usergroup') {
10810 } elseif (in_array(
$object->element, array(
'action',
'agenda'))) {
10811 '@phan-var-force ActionComm $object';
10813 } elseif (in_array(
$object->element, array(
'adherent_type'))) {
10815 } elseif (
$object->element ==
'ecm_directories') {
10817 } elseif (
$object->element ==
'accountingbookkeeping' && !empty(
$object->context[
'mode']) &&
$object->context[
'mode'] ==
'_tmp') {
10818 $ret .= $langs->trans(
"Draft");
10819 } elseif ($fieldref !=
'none') {
10822 if ($morehtmlref) {
10824 if (substr($morehtmlref, 0, 4) !=
'<div') {
10828 $ret .=
'<!-- morehtmlref -->'.$morehtmlref;
10833 $ret .=
'</div><!-- End banner content -->';
10852 if (empty(
$object->barcode)) {
10857 if (empty(
$object->barcode_type_code) || empty(
$object->barcode_type_coder)) {
10859 $result =
$object->fetchBarCode();
10862 return '<!-- ErrorFetchBarcode -->';
10867 $url = DOL_URL_ROOT .
'/viewimage.php?modulepart=barcode&generator=' . urlencode(
$object->barcode_type_coder) .
'&code=' . urlencode(
$object->barcode) .
'&encoding=' . urlencode(
$object->barcode_type_code);
10868 $out =
'<!-- url barcode = ' . $url .
' -->';
10869 $out .=
'<img src="' . $url .
'"' . ($morecss ?
' class="' . $morecss .
'"' :
'') .
'>';
10891 public static function showphoto($modulepart,
$object, $width = 100, $height = 0, $caneditfield = 0, $cssclass =
'photowithmargin', $imagesize =
'', $addlinktofullsize = 1, $cache = 0, $forcecapture =
'', $noexternsourceoverwrite = 0)
10893 global
$conf, $langs;
10900 $originalfile =
'';
10904 if ($modulepart ==
'societe') {
10905 $dir =
$conf->societe->multidir_output[$entity];
10908 if ((
string) $imagesize ==
'mini') {
10910 } elseif ((
string) $imagesize ==
'small') {
10919 } elseif ($modulepart ==
'contact') {
10920 $dir =
$conf->societe->multidir_output[$entity] .
'/contact';
10921 if (!empty(
$object->photo)) {
10923 if ((
string) $imagesize ==
'mini') {
10925 } elseif ((
string) $imagesize ==
'small') {
10935 } elseif ($modulepart ==
'userphoto') {
10936 $dir =
$conf->user->dir_output;
10937 if (!empty(
$object->photo)) {
10939 if ((
string) $imagesize ==
'mini') {
10941 } elseif ((
string) $imagesize ==
'small') {
10950 $altfile =
$object->id .
".jpg";
10954 } elseif ($modulepart ==
'memberphoto') {
10955 $dir =
$conf->adherent->dir_output;
10956 if (!empty(
$object->photo)) {
10958 if ((
string) $imagesize ==
'mini') {
10960 } elseif ((
string) $imagesize ==
'small') {
10969 $altfile =
$object->id .
".jpg";
10976 if ($modulepart !=
"unknown" && method_exists(
$object,
'getDataToShowPhoto')) {
10977 $tmpdata =
$object->getDataToShowPhoto($modulepart, $imagesize);
10979 $dir = $tmpdata[
'dir'];
10980 $file = $tmpdata[
'file'];
10981 $originalfile = $tmpdata[
'originalfile'];
10982 $altfile = $tmpdata[
'altfile'];
10983 $email = $tmpdata[
'email'];
10984 $capture = $tmpdata[
'capture'];
10988 if ($forcecapture) {
10989 $capture = $forcecapture;
10995 if ($file && file_exists($dir .
"/" . $file)) {
10996 if ($addlinktofullsize) {
10998 if ($urladvanced) {
10999 $ret .=
'<a href="' . $urladvanced .
'">';
11001 $ret .=
'<a href="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=' . $modulepart .
'&entity=' . $entity .
'&file=' . urlencode($originalfile) .
'&cache=' . $cache .
'">';
11004 $ret .=
'<img alt="" class="photo' . $modulepart . ($cssclass ?
' ' . $cssclass :
'') .
' photologo' . (preg_replace(
'/[^a-z]/i',
'_', $file)) .
'" ' . ($width ?
' width="' . $width .
'"' :
'') . ($height ?
' height="' . $height .
'"' :
'') .
' src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=' . $modulepart .
'&entity=' . $entity .
'&file=' . urlencode($file) .
'&cache=' . $cache .
'">';
11005 if ($addlinktofullsize) {
11008 } elseif ($altfile && file_exists($dir .
"/" . $altfile)) {
11009 if ($addlinktofullsize) {
11011 if ($urladvanced) {
11012 $ret .=
'<a href="' . $urladvanced .
'">';
11014 $ret .=
'<a href="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=' . $modulepart .
'&entity=' . $entity .
'&file=' . urlencode($originalfile) .
'&cache=' . $cache .
'">';
11017 $ret .=
'<img class="photo' . $modulepart . ($cssclass ?
' ' . $cssclass :
'') .
'" alt="Photo alt" id="photologo' . (preg_replace(
'/[^a-z]/i',
'_', $file)) .
'" class="' . $cssclass .
'" ' . ($width ?
' width="' . $width .
'"' :
'') . ($height ?
' height="' . $height .
'"' :
'') .
' src="' . DOL_URL_ROOT .
'/viewimage.php?modulepart=' . $modulepart .
'&entity=' . $entity .
'&file=' . urlencode($altfile) .
'&cache=' . $cache .
'">';
11018 if ($addlinktofullsize) {
11022 $nophoto =
'/public/theme/common/nophoto.png';
11023 $defaultimg =
'identicon';
11024 if (in_array($modulepart, array(
'societe',
'userphoto',
'contact',
'memberphoto'))) {
11025 if ($modulepart ==
'societe' || ($modulepart ==
'memberphoto' && !empty(
$object->morphy) && strpos(
$object->morphy,
'mor') !==
false)) {
11026 $nophoto =
'company';
11028 $nophoto =
'/public/theme/common/user_anonymous.png';
11030 $nophoto =
'/public/theme/common/user_man.png';
11033 $nophoto =
'/public/theme/common/user_woman.png';
11038 if (isModEnabled(
'gravatar') && $email && empty($noexternsourceoverwrite)) {
11040 $ret .=
'<!-- Put link to gravatar -->';
11041 $ret .=
'<img class="photo' . $modulepart . ($cssclass ?
' ' . $cssclass :
'') .
'" alt="" title="' . $email .
' Gravatar avatar" ' . ($width ?
' width="' . $width .
'"' :
'') . ($height ?
' height="' . $height .
'"' :
'') .
' src="https://www.gravatar.com/avatar/' .
dol_hash(strtolower(trim($email)),
'sha256', 1) .
'?s=' . $width .
'&d=' . $defaultimg .
'">';
11043 if ($nophoto ==
'company') {
11044 $ret .=
'<div class="divforspanimg valignmiddle center photo' . $modulepart . ($cssclass ?
' ' . $cssclass :
'') .
'" alt="" ' . ($width ?
' width="' . $width .
'"' :
'') . ($height ?
' height="' . $height .
'"' :
'') .
'>' .
img_picto(
'',
'company') .
'</div>';
11047 $ret .=
'<img class="photo' . $modulepart . ($cssclass ?
' ' . $cssclass :
'') .
'" alt="" ' . ($width ?
' width="' . $width .
'"' :
'') . ($height ?
' height="' . $height .
'"' :
'') .
' src="' . DOL_URL_ROOT . $nophoto .
'">';
11052 if ($caneditfield) {
11056 $ret .=
'<table class="nobordernopadding centpercent">';
11058 $ret .=
'<tr><td><input type="checkbox" class="flat photodelete" name="deletephoto" id="photodelete"> <label for="photodelete">' . $langs->trans(
"Delete") .
'</label><br><br></td></tr>';
11060 $ret .=
'<tr><td class="tdoverflow">';
11062 $maxmin = $maxfilesizearray[
'maxmin'];
11064 $ret .=
'<input type="hidden" name="MAX_FILE_SIZE" value="' . ($maxmin * 1024) .
'">';
11066 $ret .=
'<input type="file" class="flat maxwidth200onsmartphone" name="photo" id="photoinput" accept="image/*"' . ($capture ?
' capture="' .
dolPrintHTMLForAttribute($capture) .
'"' :
'') .
'>';
11067 $ret .=
'</td></tr>';
11068 $ret .=
'</table>';
11093 public function select_dolgroups($selected = 0, $htmlname =
'groupid', $show_empty = 0, $exclude =
'', $disabled = 0, $include =
'', $enableonly = array(), $force_entity =
'0', $multiple =
false, $morecss =
'minwidth200')
11096 global
$conf, $user, $langs;
11099 $excludeGroups =
null;
11100 if (is_array($exclude)) {
11101 $excludeGroups = implode(
",", $exclude);
11104 $includeGroups =
null;
11105 if (is_array($include)) {
11106 $includeGroups = implode(
",", $include);
11109 if (!is_array($selected)) {
11110 $selected = array($selected);
11116 $sql =
"SELECT ug.rowid, ug.nom as name";
11117 if (isModEnabled(
'multicompany') &&
$conf->entity == 1 && $user->admin && !$user->entity) {
11118 $sql .=
", e.label";
11120 $sql .=
" FROM " . $this->db->prefix() .
"usergroup as ug ";
11121 if (isModEnabled(
'multicompany') &&
$conf->entity == 1 && $user->admin && !$user->entity) {
11122 $sql .=
" LEFT JOIN " . $this->db->prefix() .
"entity as e ON e.rowid=ug.entity";
11123 if ($force_entity) {
11124 $sql .=
" WHERE ug.entity IN (0, " . $force_entity .
")";
11126 $sql .=
" WHERE ug.entity IS NOT NULL";
11129 $sql .=
" WHERE ug.entity IN (0, " .
$conf->entity .
")";
11131 if (is_array($exclude) && $excludeGroups) {
11132 $sql .=
" AND ug.rowid NOT IN (" . $this->db->sanitize($excludeGroups) .
")";
11134 if (is_array($include) && $includeGroups) {
11135 $sql .=
" AND ug.rowid IN (" . $this->db->sanitize($includeGroups) .
")";
11137 $sql .=
" ORDER BY ug.nom ASC";
11139 dol_syslog(get_class($this) .
"::select_dolgroups", LOG_DEBUG);
11140 $resql = $this->db->query($sql);
11143 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
11145 $out .=
'<select class="flat' . ($morecss ?
' ' . $morecss :
'') .
'" id="' . $htmlname .
'" name="' . $htmlname . ($multiple ?
'[]' :
'') .
'" ' . ($multiple ?
'multiple' :
'') .
' ' . ($disabled ?
' disabled' :
'') .
'>';
11147 $num = $this->db->num_rows($resql);
11150 if ($show_empty && !$multiple) {
11151 $out .=
'<option value="-1"' . (in_array(-1, $selected) ?
' selected' :
'') .
'> </option>' .
"\n";
11154 while ($i < $num) {
11155 $obj = $this->db->fetch_object($resql);
11157 if (is_array($enableonly) && count($enableonly) && !in_array($obj->rowid, $enableonly)) {
11161 $label = $obj->name;
11162 $labelhtml = $obj->name;
11163 if (isModEnabled(
'multicompany') && !
getDolGlobalInt(
'MULTICOMPANY_TRANSVERSE_MODE') &&
$conf->entity == 1) {
11164 $label .=
" (" . $obj->label .
")";
11165 $labelhtml .=
' <span class="opacitymedium">(' . $obj->label .
')</span>';
11168 $out .=
'<option value="' . $obj->rowid .
'"';
11169 if ($disableline) {
11170 $out .=
' disabled';
11172 if ((isset($selected[0]) && is_object($selected[0]) && $selected[0]->
id == $obj->rowid)
11173 || ((!isset($selected[0]) || !is_object($selected[0])) && !empty($selected) && in_array($obj->rowid, $selected))) {
11174 $out .=
' selected';
11176 $out .=
' data-html="'.dol_escape_htmltag($labelhtml).
'"';
11179 $out .=
'</option>';
11184 $out .=
'<option value="-1"' . (in_array(-1, $selected) ?
' selected' :
'') .
'></option>' .
"\n";
11186 $out .=
'<option value="" disabled>' . $langs->trans(
"NoUserGroupDefined") .
'</option>';
11188 $out .=
'</select>';
11207 $out =
'<div class="nowraponall">';
11208 $out .=
'<button type="submit" class="liste_titre button_search reposition" name="button_search_x" value="x"><span class="fas fa-search"></span></button>';
11209 $out .=
'<button type="submit" class="liste_titre button_removefilter reposition" name="button_removefilter_x" value="x"><span class="fas fa-times"></span></button>';
11223 public function showCheckAddButtons($cssclass =
'checkforaction', $calljsfunction = 0, $massactionname =
"massaction")
11229 if (!empty(
$conf->use_javascript_ajax)) {
11230 $out .=
'<div class="inline-block checkallactions"><input type="checkbox" id="' . $cssclass .
's" name="' . $cssclass .
's" class="checkallactions"></div>';
11232 $out .=
'<script nonce="' .
getNonce() .
'">
11233 $(document).ready(function() {
11234 $("#' . $cssclass .
's").click(function() {
11235 if($(this).is(\':checked\')){
11236 console.log("We check all ' . $cssclass .
' and trigger the change method");
11237 $(".' . $cssclass .
'").prop(\'checked\', true).trigger(\'change\');
11241 console.log("We uncheck all");
11242 $(".' . $cssclass .
'").prop(\'checked\', false).trigger(\'change\');
11244 if ($calljsfunction) {
11245 $out .=
'if (typeof initCheckForSelect == \'function\') { initCheckForSelect(0, "' . $massactionname .
'", "' . $cssclass .
'"); } else { console.log("No function initCheckForSelect found. Call won\'t be done."); }';
11248 $(".' . $cssclass .
'").change(function() {
11249 console.log("We check and change the tr class highlight after a change on .'.$cssclass.
'");
11250 var $row = $(this).closest("tr");
11252 var anyChecked = $row.find(\'input[type="checkbox"].checkforselect:checked\').length > 0;
11253 console.log(anyChecked);
11255 $row.removeClass("highlight");
11257 $row.addClass("highlight");
11278 $out = $this->showFilterButtons();
11279 if ($addcheckuncheckall) {
11280 $out .= $this->showCheckAddButtons($cssclass, $calljsfunction, $massactionname);
11298 public function selectExpenseCategories($selected =
'', $htmlname =
'fk_c_exp_tax_cat', $useempty = 0, $excludeid = array(), $target =
'', $default_selected = 0, $params = array(), $info_admin = 1)
11300 global $langs, $user;
11303 $sql =
"SELECT rowid, label FROM " . $this->db->prefix() .
"c_exp_tax_cat WHERE active = 1";
11304 $sql .=
" AND entity IN (0," .
getEntity(
'exp_tax_cat') .
")";
11305 if (!empty($excludeid)) {
11306 $sql .=
" AND rowid NOT IN (" . $this->db->sanitize(implode(
',', $excludeid)) .
")";
11308 $sql .=
" ORDER BY label";
11310 $resql = $this->db->query($sql);
11312 $out =
'<select id="select_' . $htmlname .
'" name="' . $htmlname .
'" class="' . $htmlname .
' flat minwidth75imp maxwidth200">';
11314 $out .=
'<option value="0"> </option>';
11317 while ($obj = $this->db->fetch_object($resql)) {
11318 $out .=
'<option ' . ($selected == $obj->rowid ?
'selected="selected"' :
'') .
' value="' . $obj->rowid .
'">' . $langs->trans($obj->label) .
'</option>';
11320 $out .=
'</select>';
11323 if (!empty($htmlname) && $user->admin && $info_admin) {
11324 $out .=
' ' .
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
11327 if (!empty($target)) {
11328 $sql =
"SELECT c.id FROM " . $this->db->prefix() .
"c_type_fees as c WHERE c.code = 'EX_KME' AND c.active = 1";
11329 $resql = $this->db->query($sql);
11331 if ($this->db->num_rows($resql) > 0) {
11332 $obj = $this->db->fetch_object($resql);
11333 $out .=
'<script nonce="' .
getNonce() .
'">
11335 $("select[name=' . $target .
']").on("change", function() {
11336 var current_val = $(this).val();
11337 if (current_val == ' . $obj->id .
') {';
11338 if (!empty($default_selected) || !empty($selected)) {
11339 $out .=
'$("select[name=' . $htmlname .
']").val("' . ($default_selected > 0 ? $default_selected : $selected) .
'");';
11343 $("select[name=' . $htmlname .
']").change();
11347 $("select[name=' . $htmlname .
']").change(function() {
11349 if ($("select[name=' . $target .
']").val() == ' . $obj->id .
') {
11350 // get price of kilometer to fill the unit price
11354 data: { fk_c_exp_tax_cat: $(this).val(), token: \'' .
currentToken() .
'\' },
11355 url:
"' . (DOL_URL_ROOT . '/expensereport/ajax/ajaxik.php?' . implode('&', $params)) . '",
11356 }).done(
function( data, textStatus, jqXHR ) {
11358 if (typeof data.up !=
"undefined") {
11359 $(
"input[name=value_unit]").val(data.up);
11360 $(
"select[name=' . $htmlname . ']").attr(
"title", data.title);
11362 $(
"input[name=value_unit]").val(
"");
11363 $(
"select[name=' . $htmlname . ']").attr(
"title",
"");
11374 dol_print_error($this->db);
11388 public function selectExpenseRanges($selected = '
', $htmlname = 'fk_range
', $useempty = 0)
11390 global $conf, $langs;
11393 $sql = "SELECT rowid, range_ik FROM " . $this->db->prefix() . "c_exp_tax_range";
11394 $sql .= " WHERE entity = " . $conf->entity . " AND active = 1";
11396 $resql = $this->db->query($sql);
11398 $out = '<select
id=
"select_' . $htmlname . '" name=
"' . $htmlname . '" class=
"' . $htmlname . ' flat minwidth75imp">
';
11400 $out .= '<option value=
"0"></option>
';
11403 while ($obj = $this->db->fetch_object($resql)) {
11404 $out .= '<option
' . ($selected == $obj->rowid ? 'selected=
"selected"' : '') . ' value=
"' . $obj->rowid . '">
' . price($obj->range_ik, 0, $langs, 1, 0) . '</option>
';
11406 $out .= '</select>
';
11408 dol_print_error($this->db);
11424 public function selectExpense($selected = '
', $htmlname = 'fk_c_type_fees
', $useempty = 0, $allchoice = 1, $useid = 0)
11429 $sql = "SELECT id, code, label";
11430 $sql .= " FROM ".$this->db->prefix()."c_type_fees";
11431 $sql .= " WHERE active = 1";
11433 $resql = $this->db->query($sql);
11435 $out = '<select
id=
"select_' . $htmlname . '" name=
"' . $htmlname . '" class=
"' . $htmlname . ' flat minwidth75imp">
';
11437 $out .= '<option value=
"0"></option>
';
11440 $out .= '<option value=
"-1">
' . $langs->trans('AllExpenseReport
') . '</option>
';
11448 while ($obj = $this->db->fetch_object($resql)) {
11449 $key = $langs->trans($obj->code);
11450 $out .= '<option
' . ($selected == $obj->{$field} ? 'selected=
"selected"' : '') . ' value=
"' . $obj->{$field} . '">
' . ($key != $obj->code ? $key : $obj->label) . '</option>
';
11452 $out .= '</select>
';
11454 $out .= ajax_combobox('select_
'.$htmlname);
11456 dol_print_error($this->db);
11480 public function selectInvoice($socid = -1, $selected = '
', $htmlname = 'invoiceid
', $maxlength = 24, $option_only = 0, $show_empty = '1
', $discard_closed = 0, $forcefocus = 0, $disabled = 0, $morecss = 'maxwidth500
', $projectsListId = '', $showproject = 'all
', $usertofilter = null)
11482 global $user, $conf, $langs;
11484 require_once DOL_DOCUMENT_ROOT . '/projet/
class/project.class.php
';
11486 if (is_null($usertofilter)) {
11487 $usertofilter = $user;
11492 $hideunselectables = false;
11493 if (getDolGlobalString('INVOICE_HIDE_UNSELECTABLES
')) {
11494 $hideunselectables = true;
11497 if (empty($projectsListId)) {
11498 if (!$usertofilter->hasRight('projet
', 'all
', 'lire
')) {
11499 $projectstatic = new Project($this->db);
11500 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($usertofilter, 0, 1);
11504 // Search all projects
11505 $sql = "SELECT f.rowid, f.ref as fref, 'nolabel
' as flabel, p.rowid as pid, f.ref,
11506 p.title, p.fk_soc, p.fk_statut, p.public,";
11507 $sql .= ' s.nom as
name';
11508 $sql .= ' FROM
' . $this->db->prefix() . 'projet as p
';
11509 $sql .= ' LEFT JOIN
' . $this->db->prefix() . 'societe as s ON s.rowid = p.fk_soc,
';
11510 $sql .= ' ' . $this->db->prefix() . 'facture as f
';
11511 $sql .= " WHERE p.entity IN (" . getEntity('project
') . ")";
11512 $sql .= " AND f.fk_projet = p.rowid AND f.fk_statut=0"; //Brouillons seulement
11513 //if ($projectsListId) $sql.= " AND p.rowid IN (".$this->db->sanitize($projectsListId).")";
11514 //if ($socid == 0) $sql.= " AND (p.fk_soc=0 OR p.fk_soc IS NULL)";
11515 //if ($socid > 0) $sql.= " AND (p.fk_soc=".((int) $socid)." OR p.fk_soc IS NULL)";
11516 $sql .= " ORDER BY p.ref, f.ref ASC";
11518 $resql = $this->db->query($sql);
11520 // Use select2 selector
11521 if (!empty($conf->use_javascript_ajax)) {
11522 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php
';
11523 $comboenhancement = ajax_combobox($htmlname, array(), 0, $forcefocus);
11524 $out .= $comboenhancement;
11525 $morecss = 'minwidth200imp maxwidth500
';
11528 if (empty($option_only)) {
11529 $out .= '<select
class=
"valignmiddle flat' . ($morecss ? ' ' . $morecss : '') . '"' . ($disabled ? ' disabled=
"disabled"' : '') . ' id=
"' . $htmlname . '" name=
"' . $htmlname . '">
';
11531 if (!empty($show_empty)) {
11532 $out .= '<option value=
"0" class=
"optiongrey">
';
11533 if (!is_numeric($show_empty)) {
11534 $out .= $show_empty;
11538 $out .= '</option>
';
11540 $num = $this->db->num_rows($resql);
11543 while ($i < $num) {
11544 $obj = $this->db->fetch_object($resql);
11545 // If we ask to filter on a company and user has no permission to see all companies and project is linked to another company, we hide project.
11546 if ($socid > 0 && (empty($obj->fk_soc) || $obj->fk_soc == $socid) && !$usertofilter->hasRight('societe
', 'lire
')) {
11549 if ($discard_closed == 1 && $obj->fk_statut == Project::STATUS_CLOSED) {
11556 if ($showproject == 'all
') {
11557 $labeltoshow .= dol_trunc($obj->ref, 18); // Invoice ref
11559 $labeltoshow .= ' -
' . $obj->name; // Soc name
11563 if ($obj->fk_statut == Project::STATUS_DRAFT) {
11565 $labeltoshow .= ' -
' . $langs->trans("Draft");
11566 } elseif ($obj->fk_statut == Project::STATUS_CLOSED) {
11567 if ($discard_closed == 2) {
11570 $labeltoshow .= ' -
' . $langs->trans("Closed");
11571 } elseif ($socid > 0 && (!empty($obj->fk_soc) && $obj->fk_soc != $socid)) {
11573 $labeltoshow .= ' -
' . $langs->trans("LinkedToAnotherCompany");
11577 if (!empty($selected) && $selected == $obj->rowid) {
11578 $out .= '<option value=
"' . $obj->rowid . '" selected
';
11579 //if ($disabled) $out.=' disabled'; // with select2, field can't be preselected
if disabled
11580 $out .=
'>' . $labeltoshow .
'</option>';
11582 if ($hideunselectables && $disabled && ($selected != $obj->rowid)) {
11585 $resultat =
'<option value="' . $obj->rowid .
'"';
11587 $resultat .=
' disabled';
11592 $resultat .= $labeltoshow;
11593 $resultat .=
'</option>';
11601 if (empty($option_only)) {
11602 $out .=
'</select>';
11605 $this->db->free($resql);
11627 public function selectInvoiceRec($selected =
'', $htmlname =
'facrecid', $maxlength = 24, $option_only = 0, $show_empty =
'1', $forcefocus = 0, $disabled = 0, $morecss =
'maxwidth500')
11629 global
$conf, $langs;
11635 $sql =
'SELECT f.rowid, f.entity, f.titre as title, f.suspended, f.fk_soc';
11637 $sql .=
' FROM ' . MAIN_DB_PREFIX .
'facture_rec as f';
11638 $sql .=
" WHERE f.entity IN (" .
getEntity(
'invoice') .
")";
11639 $sql .=
" ORDER BY f.titre ASC";
11641 $resql = $this->db->query($sql);
11644 if (!empty(
$conf->use_javascript_ajax)) {
11645 include_once DOL_DOCUMENT_ROOT .
'/core/lib/ajax.lib.php';
11646 $comboenhancement =
ajax_combobox($htmlname, array(), 0, $forcefocus);
11647 $out .= $comboenhancement;
11648 $morecss =
'minwidth200imp maxwidth500';
11651 if (empty($option_only)) {
11652 $out .=
'<select class="valignmiddle flat' . ($morecss ?
' ' . $morecss :
'') .
'"' . ($disabled ?
' disabled="disabled"' :
'') .
' id="' . $htmlname .
'" name="' . $htmlname .
'">';
11654 if (!empty($show_empty)) {
11655 $out .=
'<option value="0" class="optiongrey">';
11656 if (!is_numeric($show_empty)) {
11657 $out .= $show_empty;
11661 $out .=
'</option>';
11663 $num = $this->db->num_rows($resql);
11665 while ($obj = $this->db->fetch_object($resql)) {
11666 $labeltoshow =
dol_trunc($obj->title, 18);
11669 if (!empty($obj->suspended)) {
11671 $labeltoshow .=
' - ' . $langs->trans(
"Closed");
11675 if (!empty($selected) && $selected == $obj->rowid) {
11676 $out .=
'<option value="' . $obj->rowid .
'" selected';
11678 $out .=
'>' . $labeltoshow .
'</option>';
11680 if ($disabled && ($selected != $obj->rowid)) {
11683 $resultat =
'<option value="' . $obj->rowid .
'"';
11685 $resultat .=
' disabled';
11688 $resultat .= $labeltoshow;
11689 $resultat .=
'</option>';
11695 if (empty($option_only)) {
11696 $out .=
'</select>';
11701 $this->db->free($resql);
11704 $this->errors[] = $this->db->lasterror;
11725 public function selectOrder($selected =
'', $htmlname =
'orderid', $maxlength = 24, $option_only = 0, $show_empty =
'1', $discard_closed = 0, $forcefocus = 0, $disabled = 0, $morecss =
'maxwidth500')
11727 global $user,
$conf, $langs;
11731 $hideunselectables =
false;
11733 $hideunselectables =
true;
11737 $sql =
"SELECT c.rowid, c.ref";
11738 $sql .=
' FROM '.$this->db->prefix().
'commande as c';
11739 $sql .=
" ORDER BY c.ref ASC";
11741 $resql = $this->db->query($sql);
11744 if (!empty(
$conf->use_javascript_ajax)) {
11745 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
11746 $comboenhancement =
ajax_combobox($htmlname, array(), 0, $forcefocus);
11747 $out .= $comboenhancement;
11748 $morecss =
'minwidth200imp maxwidth500';
11751 if (empty($option_only)) {
11752 $out .=
'<select class="valignmiddle flat'.($morecss ?
' '.$morecss :
'').
'"'.($disabled ?
' disabled="disabled"' :
'').
' id="'.$htmlname.
'" name="'.$htmlname.
'">';
11754 if (!empty($show_empty)) {
11755 $out .=
'<option value="0" class="optiongrey">';
11756 if (!is_numeric($show_empty)) {
11757 $out .= $show_empty;
11761 $out .=
'</option>';
11763 $num = $this->db->num_rows($resql);
11766 while ($i < $num) {
11767 $obj = $this->db->fetch_object($resql);
11774 $labeltoshow =
dol_trunc($obj->ref, 18);
11776 if (!empty($selected) && $selected == $obj->rowid) {
11777 $out .=
'<option value="'.$obj->rowid.
'" selected';
11779 $out .=
'>'.$labeltoshow.
'</option>';
11781 if ($hideunselectables && $disabled && ($selected != $obj->rowid)) {
11784 $resultat =
'<option value="'.$obj->rowid.
'"';
11786 $resultat .=
' disabled';
11791 $resultat .= $labeltoshow;
11792 $resultat .=
'</option>';
11799 if (empty($option_only)) {
11800 $out .=
'</select>';
11805 $this->db->free($resql);
11828 public function selectSupplierOrder($selected =
'', $htmlname =
'supplierorderid', $maxlength = 24, $option_only = 0, $show_empty =
'1', $discard_closed = 0, $forcefocus = 0, $disabled = 0, $morecss =
'maxwidth500')
11830 global $user,
$conf, $langs;
11834 $hideunselectables =
false;
11836 $hideunselectables =
true;
11840 $sql =
"SELECT cf.rowid, cf.ref";
11841 $sql .=
' FROM '.$this->db->prefix().
'commande_fournisseur as cf';
11842 $sql .=
" ORDER BY cf.ref ASC";
11844 $resql = $this->db->query($sql);
11847 if (!empty(
$conf->use_javascript_ajax)) {
11848 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
11849 $comboenhancement =
ajax_combobox($htmlname, array(), 0, $forcefocus);
11850 $out .= $comboenhancement;
11851 $morecss =
'minwidth200imp maxwidth500';
11854 if (empty($option_only)) {
11855 $out .=
'<select class="valignmiddle flat'.($morecss ?
' '.$morecss :
'').
'"'.($disabled ?
' disabled="disabled"' :
'').
' id="'.$htmlname.
'" name="'.$htmlname.
'">';
11857 if (!empty($show_empty)) {
11858 $out .=
'<option value="0" class="optiongrey">';
11859 if (!is_numeric($show_empty)) {
11860 $out .= $show_empty;
11864 $out .=
'</option>';
11866 $num = $this->db->num_rows($resql);
11869 while ($i < $num) {
11870 $obj = $this->db->fetch_object($resql);
11877 $labeltoshow =
dol_trunc($obj->ref, 18);
11879 if (!empty($selected) && $selected == $obj->rowid) {
11880 $out .=
'<option value="'.$obj->rowid.
'" selected';
11882 $out .=
'>'.$labeltoshow.
'</option>';
11884 if ($hideunselectables && $disabled && ($selected != $obj->rowid)) {
11887 $resultat =
'<option value="'.$obj->rowid.
'"';
11889 $resultat .=
' disabled';
11894 $resultat .= $labeltoshow;
11895 $resultat .=
'</option>';
11902 if (empty($option_only)) {
11903 $out .=
'</select>';
11908 $this->db->free($resql);
11931 public function selectSupplierInvoice($selected =
'', $htmlname =
'supplierinvoiceid', $maxlength = 24, $option_only = 0, $show_empty =
'1', $discard_closed = 0, $forcefocus = 0, $disabled = 0, $morecss =
'maxwidth500')
11933 global $user,
$conf, $langs;
11937 $hideunselectables =
false;
11939 $hideunselectables =
true;
11943 $sql =
"SELECT ff.rowid, ff.ref";
11944 $sql .=
' FROM '.$this->db->prefix().
'facture_fourn as ff';
11945 $sql .=
" ORDER BY ff.ref ASC";
11947 $resql = $this->db->query($sql);
11950 if (!empty(
$conf->use_javascript_ajax)) {
11951 include_once DOL_DOCUMENT_ROOT.
'/core/lib/ajax.lib.php';
11952 $comboenhancement =
ajax_combobox($htmlname, array(), 0, $forcefocus);
11953 $out .= $comboenhancement;
11954 $morecss =
'minwidth200imp maxwidth500';
11957 if (empty($option_only)) {
11958 $out .=
'<select class="valignmiddle flat'.($morecss ?
' '.$morecss :
'').
'"'.($disabled ?
' disabled="disabled"' :
'').
' id="'.$htmlname.
'" name="'.$htmlname.
'">';
11960 if (!empty($show_empty)) {
11961 $out .=
'<option value="0" class="optiongrey">';
11962 if (!is_numeric($show_empty)) {
11963 $out .= $show_empty;
11967 $out .=
'</option>';
11969 $num = $this->db->num_rows($resql);
11972 while ($i < $num) {
11973 $obj = $this->db->fetch_object($resql);
11980 $labeltoshow =
dol_trunc($obj->ref, 18);
11982 if (!empty($selected) && $selected == $obj->rowid) {
11983 $out .=
'<option value="'.$obj->rowid.
'" selected';
11985 $out .=
'>'.$labeltoshow.
'</option>';
11987 if ($hideunselectables && $disabled && ($selected != $obj->rowid)) {
11990 $resultat =
'<option value="'.$obj->rowid.
'"';
11992 $resultat .=
' disabled';
11997 $resultat .= $labeltoshow;
11998 $resultat .=
'</option>';
12005 if (empty($option_only)) {
12006 $out .=
'</select>';
12011 $this->db->free($resql);
12029 public function searchComponent($arrayofcriterias, $search_component_params, $arrayofinputfieldsalreadyoutput = array(), $search_component_params_hidden =
'', $arrayoffiltercriterias = array())
12032 global $langs, $form;
12037 if ($search_component_params_hidden !=
'' && !preg_match(
'/^\(.*\)$/', $search_component_params_hidden)) {
12038 $search_component_params_hidden =
'(' . $search_component_params_hidden .
')';
12041 $ret =
'<!-- searchComponent -->';
12043 $ret .=
'<div class="divadvancedsearchfieldcomp centpercent inline-block">';
12044 $ret .=
'<a href="#" class="dropdownsearch-toggle unsetcolor">';
12045 $ret .=
'<span class="fas fa-filter linkobject boxfilter paddingright pictofixedwidth" title="' .
dol_escape_htmltag($langs->trans(
"Filters")) .
'" id="idsubimgproductdistribution"></span>';
12048 $ret .=
'<div class="divadvancedsearchfieldcompinput inline-block minwidth500 maxwidth300onsmartphone">';
12051 $ret .=
'<div id="divsearch_component_params" name="divsearch_component_params" class="noborderbottom search_component_params inline-block valignmiddle">';
12053 if ($search_component_params_hidden) {
12061 foreach ($arrayofandtags as $tmpkey => $tmpval) {
12062 $errormessage =
'';
12064 if ($errormessage) {
12065 $this->error =
'ERROR in parsing search string: '.$errormessage;
12068 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
12071 $ret .=
'<span class="marginleftonlyshort valignmiddle tagsearch" data-ufilterid="'.($tmpkey + 1).
'" data-ufilter="'.
dol_escape_htmltag($tmpval).
'">';
12072 $ret .=
'<span class="tagsearchdelete select2-selection__choice__remove" data-ufilterid="'.($tmpkey + 1).
'">x</span> ';
12084 $show_search_component_params_hidden = 1;
12085 if ($show_search_component_params_hidden) {
12086 $ret .=
'<input type="hidden" name="show_search_component_params_hidden" value="1">';
12088 $ret .=
"<!-- We store the full Universal Search String into this field. For example: (t.ref:like:'SO-%') AND ((t.ref:like:'CO-%') OR (t.ref:like:'AA%')) -->";
12089 $ret .=
'<input type="hidden" id="search_component_params_hidden" name="search_component_params_hidden" value="' .
dol_escape_htmltag($search_component_params_hidden) .
'">';
12094 foreach ($arrayofcriterias as $criteria) {
12095 foreach ($criteria as $criteriafamilykey => $criteriafamilyval) {
12096 if (in_array(
'search_' . $criteriafamilykey, $arrayofinputfieldsalreadyoutput)) {
12099 if (in_array($criteriafamilykey, array(
'rowid',
'ref_ext',
'entity',
'extraparams'))) {
12102 if (in_array($criteriafamilyval[
'type'], array(
'date',
'datetime',
'timestamp'))) {
12103 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_start">';
12104 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_startyear">';
12105 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_startmonth">';
12106 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_startday">';
12107 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_end">';
12108 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_endyear">';
12109 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_endmonth">';
12110 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'_endday">';
12112 $ret .=
'<input type="hidden" name="search_' . $criteriafamilykey .
'">';
12119 $ret .=
"<!-- Field to enter a generic filter string: t.ref:like:'SO-%', t.date_creation:<:'20160101', t.date_creation:<:'2016-01-01 12:30:00', t.nature:is:NULL, t.field2:isnot:NULL -->\n";
12120 $ret .=
'<input type="text" placeholder="' . $langs->trans(
"Filters") .
'" id="search_component_params_input" name="search_component_params_input" class="noborderbottom search_component_input" value="">';
12126 jQuery(".tagsearchdelete").click(function(e) {
12127 var filterid = $(this).parents().attr("data-ufilterid");
12128 console.log("We click to delete the criteria nb "+filterid);
12130 // Regenerate the search_component_params_hidden with all data-ufilter except the one to delete, and post the page
12131 var newparamstring = \'\';
12132 $(\'.tagsearch\').each(function(index, element) {
12133 tmpfilterid = $(this).attr("data-ufilterid");
12134 if (tmpfilterid != filterid) {
12135 // We keep this criteria
12136 if (newparamstring == \'\') {
12137 newparamstring = $(this).attr("data-ufilter");
12139 newparamstring = newparamstring + \' AND \' + $(this).attr("data-ufilter");
12143 console.log("newparamstring = "+newparamstring);
12145 jQuery("#search_component_params_hidden").val(newparamstring);
12147 // We repost the form
12148 $(this).closest(\'form\').submit();
12151 jQuery("#search_component_params_input").keydown(function(e) {
12152 console.log("We press a key on the filter field that is "+jQuery("#search_component_params_input").val());
12153 console.log(e.which);
12154 if (jQuery("#search_component_params_input").val() == "" && e.which == 8) {
12155 /* We click on back when the input field is already empty */
12156 event.preventDefault();
12157 jQuery("#divsearch_component_params .tagsearch").last().remove();
12158 /* Regenerate content of search_component_params_hidden from remaining .tagsearch */
12160 jQuery("#divsearch_component_params .tagsearch").each(function( index ) {
12164 s = s + $(this).attr("data-ufilter");
12166 console.log("New value for search_component_params_hidden = "+s);
12167 jQuery("#search_component_params_hidden").val(s);
12175 $arrayoffiltercriterias_json = json_encode($arrayoffiltercriterias);
12177 var arrayoffiltercriterias = ' . $arrayoffiltercriterias_json .
';
12181 $arrayoffilterfieldslabel = array();
12182 foreach ($arrayoffiltercriterias as $key => $val) {
12183 $arrayoffilterfieldslabel[$key][
'label'] = $val[
'label'];
12184 $arrayoffilterfieldslabel[$key][
'data-type'] = $val[
'type'];
12188 $ret .=
'<div class="search-component-assistance">';
12191 $ret .=
'<p class="assistance-title">' .
img_picto(
'',
'filter') .
' ' . $langs->trans(
'FilterAssistance') .
' </p>';
12193 $ret .=
'<p class="assistance-errors error" style="display:none">' . $langs->trans(
'AllFieldsRequired') .
' </p>';
12195 $ret .=
'<div class="operand">';
12196 $ret .= $form->selectarray(
'search_filter_field', $arrayoffilterfieldslabel,
'', $langs->trans(
"Fields"), 0, 0,
'', 0, 0, 0,
'',
'width200 combolargeelem', 1);
12199 $ret .=
'<span class="separator"></span>';
12202 $ret .=
'<div class="operator">';
12203 $ret .=
'<select class="operator-selector width150" id="operator-selector"">';
12204 $ret .=
'</select>';
12205 $ret .=
'<script>$(document).ready(function() {';
12206 $ret .=
' $(".operator-selector").select2({';
12207 $ret .=
' placeholder: \'' .
dol_escape_js($langs->transnoentitiesnoconv(
'Operator')) .
'\'';
12209 $ret .=
'});</script>';
12212 $ret .=
'<span class="separator"></span>';
12214 $ret .=
'<div class="value">';
12216 $ret .=
'<input type="text" class="flat width100 value-input" placeholder="' .
dolPrintHTML($langs->trans(
'Value')) .
'">';
12220 $ret .=
'<span class="date-one" style="display:none">';
12221 $ret .= $form->selectDate(($dateOne ? $dateOne : -1),
'dateone', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'');
12225 $ret .=
'<select class="value-selector width150" id="value-selector" style="display:none">';
12226 $ret .=
'</select>';
12228 $(document).ready(function() {
12229 $("#value-selector").select2({
12230 placeholder: "' .
dol_escape_js($langs->trans(
'Value')) .
'"
12232 $("#value-selector").hide();
12233 $("#value-selector").next(".select2-container").hide();
12239 $ret .=
'<div class="btn-div">';
12240 $ret .=
'<button class="button buttongen button-save add-filter-btn" type="button">' . $langs->trans(
"addToFilter") .
'</button>';
12251 $(document).ready(function() {
12252 $("#search_component_params_input").on("click", function() {
12253 const inputPosition = $(this).offset();
12254 const inputHeight = $(this).outerHeight();
12255 $(".search-component-assistance").css({
12256 top: inputPosition.top + inputHeight + 5 + "px",
12257 left: $("#divsearch_component_params").position().left
12258 }).slideToggle(200);
12260 $(document).on("click", function(e) {
12261 if (!$(e.target).closest("#search_component_params_input, .search-component-assistance, #ui-datepicker-div").length) {
12262 $(".search-component-assistance").hide();
12269 $(document).ready(function() {
12270 $(".search_filter_field").on("change", function() {
12271 console.log("We change search_filter_field");
12274 const selectedField = $(this).find(":selected");
12275 let fieldType = selectedField.data("type");
12276 const selectedFieldValue = selectedField.val();
12278 // If the selected field has an array of values then ask toshow the value selector instead of the value input
12279 if (arrayoffiltercriterias[selectedFieldValue]["arrayofkeyval"] !== undefined) {
12280 fieldType = "select";
12283 // If the selected field may be null then ask to append the "IsDefined" and "IsNotDefined" operators
12284 if (arrayoffiltercriterias[selectedFieldValue]["maybenull"] !== undefined) {
12287 const operators = getOperatorsForFieldType(fieldType, maybenull);
12288 const operatorSelector = $(".operator-selector");
12290 // Clear existing options
12291 operatorSelector.empty();
12293 // Populate operators
12294 Object.entries(operators).forEach(function([operator, label]) {
12295 operatorSelector.append("<option value=\'" + operator + "\'>" + label + "</option>");
12298 operatorSelector.trigger("change.select2");
12300 // Clear and hide all input elements initially
12301 $(".value-input, .dateone, .datemonth, .dateyear").val("").hide();
12302 $("#datemonth, #dateyear").val(null).trigger("change.select2");
12303 $("#dateone").datepicker("setDate", null);
12304 $(".date-one, .date-month, .date-year").hide();
12305 $("#value-selector").val("").hide();
12306 $("#value-selector").next(".select2-container").hide();
12307 $("#value-selector").val(null).trigger("change.select2");
12309 if (fieldType === "date" || fieldType === "datetime" || fieldType === "timestamp") {
12310 $(".date-one").show();
12311 } else if (arrayoffiltercriterias[selectedFieldValue]["arrayofkeyval"] !== undefined) {
12312 var arrayofkeyval = arrayoffiltercriterias[selectedFieldValue]["arrayofkeyval"];
12313 var valueSelector = $("#value-selector");
12314 valueSelector.empty();
12315 Object.entries(arrayofkeyval).forEach(function([key, val]) {
12316 valueSelector.append("<option value=\'" + key + "\'>" + val + "</option>");
12318 valueSelector.trigger("change.select2");
12320 $("#value-selector").show();
12321 $("#value-selector").next(".select2-container").show();
12323 $(".value-input").show();
12327 $("#operator-selector").on("change", function() {
12328 console.log("We change operator-selector");
12330 const selectedOperator = $(this).find(":selected").val();
12331 if (selectedOperator === "IsDefined" || selectedOperator === "IsNotDefined") {
12332 // Disable all value input elements
12333 $(".value-input, .dateone, .datemonth, .dateyear").val("").prop("disabled", true);
12334 $("#datemonth, #dateyear").val(null).trigger("change.select2");
12335 $("#dateone").datepicker("setDate", null).datepicker("option", "disabled", true);
12336 $(".date-one, .date-month, .date-year").prop("disabled", true);
12337 $("#value-selector").val("").prop("disabled", true);
12338 $("#value-selector").val(null).trigger("change.select2");
12340 // Enable all value input elements
12341 $(".value-input, .dateone, .datemonth, .dateyear").prop("disabled", false);
12342 $(".date-one, .date-month, .date-year").prop("disabled", false);
12343 $("#dateone").datepicker("option", "disabled", false);
12344 $("#value-selector").prop("disabled", false);
12348 $(".add-filter-btn").on("click", function(event) {
12349 console.log("We click on add-filter-btn");
12351 event.preventDefault();
12353 const field = $(".search_filter_field").val();
12354 const operator = $(".operator-selector").val();
12355 let value = $(".value-input").val();
12356 const fieldType = $(".search_filter_field").find(":selected").data("type");
12358 if (["date", "datetime", "timestamp"].includes(fieldType)) {
12359 const year = $("#dateoneyear").val().toString().padStart(4, "0");;
12360 const month = $("#dateonemonth").val().toString().padStart(2, "0");
12361 const day = $("#dateoneday").val().toString().padStart(2, "0");
12362 value = `${year}-${month}-${day}`;
12363 console.log("value="+value);
12366 // If the selected field has an array of values then take the selected value
12367 if (arrayoffiltercriterias[field]["arrayofkeyval"] !== undefined) {
12368 value = $("#value-selector").val();
12371 // If the operator is "IsDefined" or "IsNotDefined" then set the value to 1 (it will not be used)
12372 if (operator === "IsDefined" || operator === "IsNotDefined") {
12376 const filterString = generateFilterString(field, operator, value, fieldType);
12379 if (filterString !== "" && field !== "" && operator !== "" && value !== "") {
12380 $("#search_component_params_input").val($("#search_component_params_input").val() + " " + filterString);
12381 $("#search_component_params_input").closest("form").submit();
12383 $(".assistance-errors").show();
12402 public function selectModelMail($prefix, $modelType =
'', $default = 0, $addjscombo = 0, $selected = 0)
12404 global $langs, $user;
12408 $TModels = array();
12410 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmail.class.php';
12411 $formmail =
new FormMail($this->db);
12412 $result = $formmail->fetchAllEMailTemplate($modelType, $user, $langs);
12415 $TModels[0] = $langs->trans(
'DefaultMailModel');
12418 foreach ($formmail->lines_model as $model) {
12419 $TModels[(int) $model->id] = $model->label;
12423 $retstring .=
'<select class="flat" id="select_' . $prefix .
'model_mail" name="' . $prefix .
'model_mail">';
12425 foreach ($TModels as $id_model => $label_model) {
12426 $retstring .=
'<option value="' . $id_model .
'"';
12427 if (!empty($selected) && ((
int) $selected) == $id_model) {
12428 $retstring .=
"selected";
12430 $retstring .=
">" . $label_model .
"</option>";
12433 $retstring .=
"</select>";
12436 $retstring .=
ajax_combobox(
'select_' . $prefix .
'model_mail');
12453 public function buttonsSaveCancel($save_label =
'Save', $cancel_label =
'Cancel', $morebuttons = array(), $withoutdiv =
false, $morecss =
'', $dol_openinpopup =
'')
12457 $buttons = array();
12461 'label_key' => $save_label,
12464 if ($save_label ==
'Create' || $save_label ==
'Add') {
12465 $save[
'name'] =
'add';
12466 } elseif ($save_label ==
'Modify') {
12467 $save[
'name'] =
'edit';
12471 'name' =>
'cancel',
12472 'label_key' =>
'Cancel',
12477 !empty($save_label) ? $buttons[] = $save :
'';
12478 if (!empty($morebuttons)) {
12479 $buttons[] = $morebuttons;
12481 !empty($cancel_label) ? $buttons[] = $cancel :
'';
12483 if (!empty($morebuttons)) {
12484 $buttons[] = $morebuttons;
12486 !empty($cancel_label) ? $buttons[] = $cancel :
'';
12487 !empty($save_label) ? $buttons[] = $save :
'';
12490 $retstring = $withoutdiv ?
'' :
'<div class="center">';
12492 foreach ($buttons as $button) {
12493 $addclass = empty($button[
'addclass']) ?
'' : $button[
'addclass'];
12494 $retstring .=
'<input type="submit" class="button button-' . $button[
'name'] . ($morecss ?
' ' . $morecss :
'') .
' ' . $addclass .
'" name="' . $button[
'name'] .
'" value="' .
dol_escape_htmltag($langs->transnoentities($button[
'label_key'])) .
'">';
12496 $retstring .= $withoutdiv ?
'' :
'</div>';
12498 if ($dol_openinpopup) {
12499 $retstring .=
'<!-- buttons are shown into a $dol_openinpopup=' .
dol_escape_htmltag($dol_openinpopup) .
' context, so we enable the close of dialog on cancel -->' .
"\n";
12500 $retstring .=
'<script nonce="' .
getNonce() .
'">';
12501 $retstring .=
'jQuery(".button-cancel").click(function(e) {
12502 e.preventDefault(); console.log(\'We click on cancel in iframe popup ' .
dol_escape_js($dol_openinpopup) .
'\');
12503 window.parent.jQuery(\
'#idfordialog' .
dol_escape_js($dol_openinpopup) .
'\').dialog(\
'close\');
12505 $retstring .=
'</script>';
12524 $num = count($this->cache_invoice_subtype);
12531 $sql =
"SELECT rowid, code, label as label";
12532 $sql .=
" FROM " . MAIN_DB_PREFIX .
'c_invoice_subtype';
12533 $sql .=
" WHERE active = 1";
12535 $resql = $this->db->query($sql);
12537 $num = $this->db->num_rows($resql);
12539 while ($i < $num) {
12540 $obj = $this->db->fetch_object($resql);
12543 $label = ($langs->trans(
"InvoiceSubtype" . $obj->rowid) !=
"InvoiceSubtype" . $obj->rowid) ? $langs->trans(
"InvoiceSubtype" . $obj->rowid) : (($obj->label !=
'-') ? $obj->label :
'');
12544 $this->cache_invoice_subtype[$obj->rowid][
'rowid'] = $obj->rowid;
12545 $this->cache_invoice_subtype[$obj->rowid][
'code'] = $obj->code;
12546 $this->cache_invoice_subtype[$obj->rowid][
'label'] = $label;
12550 $this->cache_invoice_subtype =
dol_sort_array($this->cache_invoice_subtype,
'code',
'asc', 0, 0, 1);
12572 global $langs, $user;
12575 dol_syslog(__METHOD__ .
" selected=" . $selected .
", htmlname=" . $htmlname, LOG_DEBUG);
12577 $this->load_cache_invoice_subtype();
12579 $out .=
'<select id="' . $htmlname .
'" class="flat selectsubtype' . ($morecss ?
' ' . $morecss :
'') .
'" name="' . $htmlname .
'">';
12581 $out .=
'<option value="0"> </option>';
12584 foreach ($this->cache_invoice_subtype as $rowid => $subtype) {
12585 $label = $subtype[
'label'];
12586 $out .=
'<option value="' . $subtype[
'rowid'] .
'"';
12587 if ($selected == $subtype[
'rowid']) {
12588 $out .=
' selected="selected"';
12592 $out .=
'</option>';
12595 $out .=
'</select>';
12596 if ($user->admin && empty($noinfoadmin)) {
12597 $out .=
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
12618 'type' =>
'search',
12619 'name' => $htmlName,
12621 'class' =>
"search-tool-input",
12622 'placeholder' => $langs->trans(
'Search'),
12623 'autocomplete' =>
'off'
12631 if ($dataTarget !==
false) {
12632 $attr[
'data-search-tool-target'] = $dataTarget;
12636 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
12637 foreach ($params[
'attr'] as $key => $value) {
12638 if ($key ==
'class') {
12639 $attr[
'class'] .=
' '.$value;
12640 } elseif ($key ==
'classOverride') {
12641 $attr[
'class'] = $value;
12643 $attr[$key] = $value;
12649 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
12650 $attr[
'class'] .=
' classfortooltip';
12653 $TCompiledAttr = [];
12654 foreach ($attr as $key => $value) {
12655 if (in_array($key, [
'data-target'])
12656 || (!empty($params[
'use_unsecured_unescapedattr']) && is_array($params[
'use_unsecured_unescapedattr']) && in_array($key, $params[
'use_unsecured_unescapedattr']))) {
12662 $TCompiledAttr[] = $key .
'="' . $value .
'"';
12665 $compiledAttributes = implode(
' ', $TCompiledAttr);
12668 return '<div class="search-tool-container"><input '.$compiledAttributes.
'></div>';
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLength=2, $autoselect=0, $ajaxoptions=array(), $moreparams='')
Generic function that return javascript to add to transform a common input text or select field into ...
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_multiautocompleter($htmlname, $fields, $url, $option='', $minLength=2, $autoselect=0)
Generic function that return javascript to add to a page to transform a common input text field into ...
ajax_event($htmlname, $events)
Add event management script.
Class to manage bank accounts.
Class to manage categories.
Class to manage bank accounts description of third parties.
Class to manage a WYSIWYG editor.
const STATUS_OPEN_INTERNAL
Warehouse open and only operations for stock transfers/corrections allowed (not for customer shipping...
const STATUS_OPEN_ALL
Warehouse open and any operations are allowed (customer shipping, supplier dispatch,...
const STATUS_CLOSED
Warehouse closed, inactive.
Class to manage invoices.
Class to manage invoice templates.
Class to parse product price expressions.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class to manage projects.
const STATUS_CLOSED
Closed status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
Class toolbox to validate values.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
currency_name($code_iso, $withcode=0, $outputlangs=null)
Return label of currency or code+label.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
getServerTimeZoneInt($refgmtdate='now')
Return server timezone int.
removeGlobalParenthesis($string)
Remove first and last parenthesis but only if first is the opening and last the closing of the same g...
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
currentToken()
Return the value of token currently saved into session with name 'token'.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
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_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...
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
dol_string_neverthesehtmltags($stringtoclean, $disallowed_tags=array('textarea'), $cleanalsosomestyles=0)
Clean a string from some undesirable HTML tags.
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_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dolIsAllowedForPreview($file)
Return if a file is qualified for preview.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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.
getNonce()
Return a random string to be used as a nonce value for js.
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...
dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox=0, $check='restricthtml')
Sanitize a HTML to remove js, dangerous content and external links.
dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0, $allowscript=0, $allowstyle=0, $allowphp=0)
Clean a string to keep only desirable HTML tags.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
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...
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_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...
treeview li table
No Email.
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
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
if(preg_match('/(crypted|dolcrypt):/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.
dol_hash($chain, $type='0', $nosalt=0, $mode=0)
Returns a hash (non reversible encryption) of a string.
getMaxFileSizeArray()
Return the max allowed for file upload.
dolDecrypt($chain, $key='')
Decode a string with a symmetric encryption.
testSqlAndScriptInject($val, $type)
Security: WAF layer for SQL Injection and XSS Injection (scripts) protection (Filters on GET,...