31require
'../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.
'/bom/class/bom.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/mrp/class/mo.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/mrp/lib/mrp_mo.lib.php';
38require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/workstation/class/workstation.class.php';
56$langs->loadLangs(array(
"mrp",
"stocks",
"other",
"product",
"productbatch"));
61$action =
GETPOST(
'action',
'aZ09');
62$confirm =
GETPOST(
'confirm',
'alpha');
64$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'mocard';
65$backtopage =
GETPOST(
'backtopage',
'alpha');
68$fk_default_warehouse =
GETPOSTINT(
'fk_default_warehouse');
70$collapse =
GETPOST(
'collapse',
'aZ09comma');
75$diroutputmassaction =
$conf->mrp->dir_output.
'/temp/massgeneration/'.$user->id;
76$objectline =
new MoLine($db);
78$hookmanager->initHooks(array(
'moproduction',
'globalcard'));
81$extrafields->fetch_name_optionals_label(
$object->table_element);
83$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
86$search_all =
GETPOST(
"search_all",
'alpha');
88foreach (
$object->fields as $key => $val) {
89 if (
GETPOST(
'search_'.$key,
'alpha')) {
90 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
94if (empty($action) && empty($id) && empty($ref)) {
99include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
104$isdraft = ((
$object->status == $object::STATUS_DRAFT) ? 1 : 0);
108$permissionnote = $user->hasRight(
'mrp',
'write');
109$permissiondellink = $user->hasRight(
'mrp',
'write');
110$permissiontoadd = $user->hasRight(
'mrp',
'write');
111$permissiontodelete = $user->hasRight(
'mrp',
'delete') || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
113$permissiontoproduce = $permissiontoadd;
114$permissiontoupdatecost = $user->hasRight(
'bom',
'read');
123$parameters = array();
124$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
129if (empty($reshook)) {
132 $backurlforlist = DOL_URL_ROOT.
'/mrp/mo_list.php';
134 if (empty($backtopage) || ($cancel && empty($id))) {
136 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
137 $backtopage = $backurlforlist;
139 $backtopage = DOL_URL_ROOT.
'/mrp/mo_production.php?id='.(
$id > 0 ?
$id :
'__ID__');
142 $triggermodname =
'MO_MODIFY';
144 if ($action ==
'confirm_cancel' && $confirm ==
'yes' && !empty($permissiontoadd)) {
145 $also_cancel_consumed_and_produced_lines = (
GETPOST(
'alsoCancelConsumedAndProducedLines',
'alpha') ? 1 : 0);
146 $result =
$object->cancel($user, 0, (
bool) $also_cancel_consumed_and_produced_lines);
148 header(
"Location: " . DOL_URL_ROOT.
'/mrp/mo_card.php?id=' .
$object->id);
154 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && !empty($permissiontodelete)) {
155 $also_cancel_consumed_and_produced_lines = (
GETPOST(
'alsoCancelConsumedAndProducedLines',
'alpha') ? 1 : 0);
156 $result =
$object->delete($user, 0, (
bool) $also_cancel_consumed_and_produced_lines);
158 header(
"Location: " . $backurlforlist);
167 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
170 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
173 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
176 $triggersendname =
'MO_SENTBYMAIL';
177 $autocopy =
'MAIN_MAIL_AUTOCOPY_MO_TO';
178 $trackid =
'mo'.$object->id;
179 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
184 if ($action ==
'set_thirdparty' && $permissiontoadd) {
185 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
null,
'date',
'', $user, $triggermodname);
187 if ($action ==
'classin' && $permissiontoadd) {
191 if ($action ==
'confirm_reopen' && $permissiontoadd) {
192 $result =
$object->setStatut($object::STATUS_INPROGRESS, 0,
'',
'MRP_REOPEN');
195 if (($action ==
'confirm_addconsumeline' &&
GETPOST(
'addconsumelinebutton') && $permissiontoadd)
196 || ($action ==
'confirm_addproduceline' &&
GETPOST(
'addproducelinebutton') && $permissiontoadd)) {
197 $moline =
new MoLine($db);
202 $moline->fk_product =
GETPOSTINT(
'productidtoadd');
203 if (
GETPOST(
'addconsumelinebutton')) {
204 $moline->role =
'toconsume';
206 $moline->role =
'toproduce';
208 $moline->origin_type =
'free';
209 $moline->position = 0;
212 if (!empty($moline->fk_product)) {
213 $tmpproduct =
new Product($db);
214 $tmpproduct->fetch($moline->fk_product);
216 $moline->fk_default_workstation = $tmpproduct->fk_default_workstation;
217 $moline->disable_stock_change = 1;
218 if ($tmpproduct->duration_unit) {
219 $moline->qty = $tmpproduct->duration_value;
220 include_once DOL_DOCUMENT_ROOT.
'/core/class/cunits.class.php';
221 $cunits =
new CUnits($db);
222 $res = $cunits->fetch(0,
'', $tmpproduct->duration_unit,
'time');
224 $moline->fk_unit = $cunits->id;
228 $moline->disable_stock_change = 0;
230 $moline->fk_unit = $tmpproduct->fk_unit;
235 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
236 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
238 if (is_array($extralabelsline)) {
240 foreach ($extralabelsline as $key => $value) {
241 unset($_POST[
"options_".$key]);
244 if (is_array($array_options) && count($array_options) > 0) {
245 $moline->array_options = $array_options;
248 $resultline = $moline->create($user, 0);
249 if ($resultline <= 0) {
256 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
260 if (in_array($action, array(
'confirm_consumeorproduce',
'confirm_consumeandproduceall')) && $permissiontoproduce) {
263 $labelmovement =
GETPOST(
'inventorylabel',
'alphanohtml');
264 $codemovement =
GETPOST(
'inventorycode',
'alphanohtml');
269 foreach (
$object->lines as $line) {
270 if ($line->role ==
'toconsume') {
271 $tmpproduct =
new Product($db);
272 $tmpproduct->fetch($line->fk_product);
275 while (GETPOSTISSET(
'qty-'.$line->id.
'-'.$i)) {
278 if ($qtytoprocess != 0) {
280 if (GETPOSTISSET(
'idwarehouse-'.$line->id.
'-'.$i)) {
281 if (!(
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) > 0)) {
282 $langs->load(
"errors");
283 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref),
null,
'errors');
286 if ($tmpproduct->status_batch && (!
GETPOST(
'batch-'.$line->id.
'-'.$i))) {
287 $langs->load(
"errors");
288 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref),
null,
'errors');
294 if (!$error &&
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) > 0) {
296 $id_product_batch = 0;
298 $stockmove->context[
'mrp_role'] =
'toconsume';
300 if ($qtytoprocess >= 0) {
301 $idstockmove = $stockmove->livraison($user, $line->fk_product,
GETPOSTINT(
'idwarehouse-'.$line->id.
'-'.$i), $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'',
GETPOST(
'batch-'.$line->id.
'-'.$i), $id_product_batch, $codemovement);
303 $idstockmove = $stockmove->reception($user, $line->fk_product,
GETPOSTINT(
'idwarehouse-'.$line->id.
'-'.$i), $qtytoprocess * -1, 0, $labelmovement,
dol_now(),
'',
'',
GETPOST(
'batch-'.$line->id.
'-'.$i), $id_product_batch, $codemovement);
305 if ($idstockmove < 0) {
313 $moline =
new MoLine($db);
315 $moline->position = $pos;
316 $moline->fk_product = $line->fk_product;
317 $moline->fk_warehouse =
GETPOSTINT(
'idwarehouse-'.$line->id.
'-'.$i);
318 $moline->qty = $qtytoprocess;
319 $moline->batch =
GETPOST(
'batch-'.$line->id.
'-'.$i);
320 $moline->role =
'consumed';
321 $moline->fk_mrp_production = $line->id;
322 $moline->fk_stock_movement = $idstockmove == 0 ? null : $idstockmove;
323 $moline->fk_user_creat = $user->id;
325 $resultmoline = $moline->create($user);
326 if ($resultmoline <= 0) {
343 foreach (
$object->lines as $line) {
344 if ($line->role ==
'toproduce') {
345 $tmpproduct =
new Product($db);
346 $tmpproduct->fetch($line->fk_product);
349 while (GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i)) {
350 $qtytoprocess = (float)
price2num(
GETPOST(
'qtytoproduce-'.$line->id.
'-'.$i));
351 $pricetoprocess =
GETPOST(
'pricetoproduce-'.$line->id.
'-'.$i) ?
price2num(
GETPOST(
'pricetoproduce-'.$line->id.
'-'.$i)) : 0;
353 if ($qtytoprocess != 0) {
355 if (GETPOSTISSET(
'idwarehousetoproduce-'.$line->id.
'-'.$i)) {
356 if (!(
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) > 0)) {
357 $langs->load(
"errors");
358 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref),
null,
'errors');
361 if (isModEnabled(
'productbatch') && $tmpproduct->status_batch && (!
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i))) {
362 $langs->load(
"errors");
363 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref),
null,
'errors');
369 if (!$error &&
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) > 0) {
371 $id_product_batch = 0;
372 $stockmove->origin_type =
$object->element;
373 $stockmove->origin_id =
$object->id;
374 $stockmove->context[
'mrp_role'] =
'toproduce';
376 $idstockmove = $stockmove->reception($user, $line->fk_product,
GETPOSTINT(
'idwarehousetoproduce-'.$line->id.
'-'.$i), $qtytoprocess, $pricetoprocess, $labelmovement,
'',
'',
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i),
dol_now(), $id_product_batch, $codemovement);
377 if ($idstockmove < 0) {
385 $moline =
new MoLine($db);
387 $moline->position = $pos;
388 $moline->fk_product = $line->fk_product;
389 $moline->fk_warehouse =
GETPOSTINT(
'idwarehousetoproduce-'.$line->id.
'-'.$i);
390 $moline->qty = $qtytoprocess;
391 $moline->batch =
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i);
392 $moline->role =
'produced';
393 $moline->fk_mrp_production = $line->id;
394 $moline->fk_stock_movement = $idstockmove;
395 $moline->fk_user_creat = $user->id;
397 $resultmoline = $moline->create($user);
398 if ($resultmoline <= 0) {
413 $consumptioncomplete =
true;
414 $productioncomplete =
true;
417 foreach (
$object->lines as $line) {
418 $tmpproduct =
new Product($db);
419 $tmpproduct->fetch($line->fk_product);
420 if ((
int) $tmpproduct->stockable_product > 0) {
421 if ($line->role ==
'toconsume') {
422 $arrayoflines =
$object->fetchLinesLinked(
'consumed', $line->id);
423 $alreadyconsumed = 0;
424 foreach ($arrayoflines as $line2) {
425 $alreadyconsumed += $line2[
'qty'];
428 if ($alreadyconsumed < $line->qty) {
429 $consumptioncomplete =
false;
432 if ($line->role ==
'toproduce') {
433 $arrayoflines =
$object->fetchLinesLinked(
'produced', $line->id);
434 $alreadyproduced = 0;
435 foreach ($arrayoflines as $line2) {
436 $alreadyproduced += $line2[
'qty'];
439 if ($alreadyproduced < $line->qty) {
440 $productioncomplete =
false;
446 $consumptioncomplete =
false;
447 $productioncomplete =
false;
451 dol_syslog(
"consumptioncomplete = ".json_encode($consumptioncomplete).
" productioncomplete = ".json_encode($productioncomplete));
452 if ($consumptioncomplete && $productioncomplete) {
453 $result =
$object->setStatut($object::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
455 $result =
$object->setStatut($object::STATUS_INPROGRESS, 0,
'',
'MRP_MO_PRODUCED');
464 $action = str_replace(
'confirm_',
'', $action);
470 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
476 if ($action ==
'confirm_produced' && $confirm ==
'yes' && $permissiontoadd) {
477 $result =
$object->setStatut($object::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
481 $outputlangs = $langs;
484 $newlang =
GETPOST(
'lang_id',
'aZ09');
487 $newlang =
$object->thirdparty->default_lang;
489 if (!empty($newlang)) {
491 $outputlangs->setDefaultLang($newlang);
496 $object->generateDocument($model, $outputlangs, 0, 0, 0);
503 if ($action ==
'confirm_editline' && $permissiontoadd) {
504 $moline =
new MoLine($db);
507 $extrafields->fetch_name_optionals_label($moline->element);
508 foreach ($extrafields->attributes[$moline->table_element][
'label'] as $key => $label) {
509 $value =
GETPOST(
'options_'.$key,
'alphanohtml');
510 $moline->array_options[
"options_".$key] = $value;
513 if (GETPOSTISSET(
'warehouse_lineProduce')) {
514 $moline->fk_warehouse = (
GETPOSTINT(
'warehouse_lineProduce') > 0 ?
GETPOSTINT(
'warehouse_lineProduce') : 0);
516 if (GETPOSTISSET(
'workstation_lineProduce')) {
517 $moline->fk_default_workstation = (
GETPOSTINT(
'workstation_lineProduce') > 0 ?
GETPOSTINT(
'workstation_lineProduce') : 0);
520 $res = $moline->update($user);
524 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
527 header(
"Location: ".$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
539$form =
new Form($db);
546$title = $langs->trans(
'Mo');
547$help_url =
'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication|DE:Modul_Fertigungsauftrag';
548$morejs = array(
'/mrp/js/lib_dispatch.js.php');
549llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-mrp page-card_production');
554if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
555 $res =
$object->fetch_thirdparty();
556 $res =
$object->fetch_optionals();
559 $tmpwarehouse->fetch(
$object->fk_warehouse);
560 $fk_default_warehouse =
$object->fk_warehouse;
570 if ($action ==
'delete') {
571 $formquestion = array(
573 'label' => $langs->trans(
'MoCancelConsumedAndProducedLines'),
574 'name' =>
'alsoCancelConsumedAndProducedLines',
575 'type' =>
'checkbox',
579 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteMo'), $langs->trans(
'ConfirmDeleteMo'),
'confirm_delete', $formquestion, 0, 1);
582 if ($action ==
'deleteline') {
583 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid.
'&fk_movement='.$fk_movement, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
586 if ($action ==
'clone') {
588 $formquestion = array();
589 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneMo',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
593 if ($action ==
'validate') {
595 $ref = substr(
$object->ref, 1, 4);
596 if ($ref ==
'PROV') {
603 $text = $langs->trans(
'ConfirmValidateMo', $numref);
612 $formquestion = array();
613 if (isModEnabled(
'mrp')) {
615 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
618 if (
$conf->browser->name ==
'ie') {
621 $formquestion = array(
628 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'Validate'), $text,
'confirm_validate', $formquestion, 0, 1, 220);
632 if ($action ==
'cancel') {
633 $formquestion = array(
635 'label' => $langs->trans(
'MoCancelConsumedAndProducedLines'),
636 'name' =>
'alsoCancelConsumedAndProducedLines',
637 'type' =>
'checkbox',
638 'value' => !
getDolGlobalString(
'MO_ALSO_CANCEL_CONSUMED_AND_PRODUCED_LINES_BY_DEFAULT') ? 0 : 1
641 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id, $langs->trans(
'CancelMo'), $langs->trans(
'ConfirmCancelMo'),
'confirm_cancel', $formquestion, 0, 1);
645 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
646 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
647 if (empty($reshook)) {
648 $formconfirm .= $hookmanager->resPrint;
649 } elseif ($reshook > 0) {
650 $formconfirm = $hookmanager->resPrint;
659 $linkback =
'<a href="'.DOL_URL_ROOT.
'/mrp/mo_list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
661 $morehtmlref =
'<div class="refidno">';
670 if (is_object(
$object->thirdparty)) {
671 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'customer');
673 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'">'.$langs->trans(
"OtherOrders").
'</a>)';
678 if (isModEnabled(
'project')) {
679 $langs->load(
"projects");
680 if (is_object(
$object->thirdparty)) {
681 $morehtmlref .=
'<br>';
683 if ($permissiontoadd) {
684 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
685 if ($action !=
'classify') {
686 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
688 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
690 if (!empty(
$object->fk_project)) {
692 $proj->fetch(
$object->fk_project);
693 $morehtmlref .= $proj->getNomUrl(1);
695 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
700 $morehtmlref .=
'</div>';
703 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
706 print
'<div class="fichecenter">';
707 print
'<div class="fichehalfleft">';
708 print
'<div class="underbanner clearboth"></div>';
709 print
'<table class="border centpercent tableforfield">'.
"\n";
712 $keyforbreak =
'fk_warehouse';
713 unset(
$object->fields[
'fk_project']);
714 unset(
$object->fields[
'fk_soc']);
715 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
718 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
724 print
'<div class="clearboth"></div>';
729 if (!in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
730 print
'<div class="tabsAction">';
732 $parameters = array();
734 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
735 if (empty($reshook)) {
737 if (
$object->status == $object::STATUS_DRAFT) {
738 if ($permissiontoadd) {
740 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=validate&token='.$newToken.
'">'.$langs->trans(
"Validate").
'</a>';
742 $langs->load(
"errors");
743 print
'<a class="butActionRefused" href="" title="'.$langs->trans(
"ErrorAddAtLeastOneLineFirst").
'">'.$langs->trans(
"Validate").
'</a>';
749 if (
$object->status == Mo::STATUS_VALIDATED ||
$object->status == Mo::STATUS_INPROGRESS) {
750 if ($permissiontoproduce) {
751 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=consumeorproduce&token='.$newToken.
'">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
753 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
755 } elseif (
$object->status == Mo::STATUS_DRAFT) {
756 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ValidateBefore").
'">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
760 if (
$object->status == Mo::STATUS_VALIDATED ||
$object->status == Mo::STATUS_INPROGRESS) {
761 if ($permissiontoproduce) {
762 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=consumeandproduceall&token='.$newToken.
'">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
764 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
766 } elseif (
$object->status == Mo::STATUS_DRAFT) {
767 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ValidateBefore").
'">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
771 if ($permissiontoadd) {
772 if (
$object->status == $object::STATUS_VALIDATED ||
$object->status == $object::STATUS_INPROGRESS) {
773 $arrayproduced =
$object->fetchLinesLinked(
'produced', 0);
775 foreach ($arrayproduced as $lineproduced) {
776 $nbProduced += $lineproduced[
'qty'];
778 if ($nbProduced > 0) {
779 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_produced&confirm=yes&token='.$newToken.
'">'.$langs->trans(
"Close").
'</a>'.
"\n";
781 print
'<a class="butActionRefused" href="#" title="'.$langs->trans(
"GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv(
"Production")).
'">'.$langs->trans(
"Close").
'</a>'.
"\n";
784 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=cancel&token='.$newToken.
'">'.$langs->trans(
"Cancel").
'</a>'.
"\n";
787 if (
$object->status == $object::STATUS_CANCELED) {
788 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_reopen&confirm=yes&token='.$newToken.
'">'.$langs->trans(
"ReOpen").
'</a>'.
"\n";
791 if (
$object->status == $object::STATUS_PRODUCED) {
792 if ($permissiontoproduce) {
793 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_reopen&token='.$newToken.
'">'.$langs->trans(
'ReOpen').
'</a>';
795 print
'<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ReOpen').
'</a>';
804 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall',
'addconsumeline',
'addproduceline',
'editline'))) {
805 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
806 print
'<input type="hidden" name="token" value="'.newToken().
'">';
807 print
'<input type="hidden" name="action" value="confirm_'.$action.
'">';
808 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
809 print
'<input type="hidden" name="id" value="'.$id.
'">';
812 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
813 $defaultstockmovementlabel =
GETPOST(
'inventorylabel',
'alphanohtml') ?
GETPOST(
'inventorylabel',
'alphanohtml') : $langs->trans(
"ProductionForRef",
$object->
ref);
816 print
'<div class="center'.(in_array($action, array(
'consumeorproduce',
'consumeandproduceall')) ?
' formconsumeproduce' :
'').
'">';
817 print
'<div class="opacitymedium hideonsmartphone paddingbottom">'.$langs->trans(
"ConfirmProductionDesc", $langs->transnoentitiesnoconv(
"Confirm")).
'<br></div>';
818 print
'<span class="fieldrequired">'.$langs->trans(
"InventoryCode").
':</span> <input type="text" class="minwidth150 maxwidth200" name="inventorycode" value="'.$defaultstockmovementcode.
'"> ';
819 print
'<span class="clearbothonsmartphone"></span>';
820 print $langs->trans(
"MovementLabel").
': <input type="text" class="minwidth300" name="inventorylabel" value="'.$defaultstockmovementlabel.
'"><br><br>';
821 print
'<input type="checkbox" id="autoclose" name="autoclose" value="1"'.(GETPOSTISSET(
'inventorylabel') ? (
GETPOST(
'autoclose') ?
' checked="checked"' :
'') :
' checked="checked"').
'> <label for="autoclose">'.$langs->trans(
"AutoCloseMO").
'</label><br>';
822 print
'<input type="submit" class="button" value="'.$langs->trans(
"Confirm").
'" name="confirm">';
824 print
'<input class="button button-cancel" type="submit" value="'.$langs->trans(
"Cancel").
'" name="cancel">';
838 if (!empty(
$object->table_element_line)) {
845 $res = $bom->fetch(
$object->fk_bom);
847 $bom->calculateCosts();
848 $bomcost = $bom->unit_cost;
854 print
'<!-- Lines to consume -->'.
"\n";
855 print
'<div class="fichecenter">';
856 print
'<div class="fichehalfleft">';
857 print
'<div class="clearboth"></div>';
859 $url = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=addconsumeline&token='.
newToken();
860 $permissiontoaddaconsumeline = (
$object->status != $object::STATUS_PRODUCED &&
$object->status != $object::STATUS_CANCELED) ? 1 : -2;
861 $parameters = array(
'morecss' =>
'reposition');
863 if ($permissiontoaddaconsumeline == -2) {
864 $helpText = $langs->trans(
'MOIsClosed');
868 if ($action !=
'consumeorproduce' && $action !=
'consumeandproduceall') {
869 $newcardbutton =
dolGetButtonTitle($langs->trans(
'AddNewConsumeLines'), $helpText,
'fa fa-plus-circle size15x', $url,
'', $permissiontoaddaconsumeline, $parameters);
872 print
load_fiche_titre($langs->trans(
'Consumption'), $newcardbutton,
'', 0,
'',
'',
'');
874 print
'<div class="div-table-responsive-no-min">';
875 print
'<table class="noborder noshadow centpercent nobottom">';
877 print
'<!-- Line of title for products to consume -->'.
"\n";
878 print
'<tr class="liste_titre trheight5em">';
880 print
'<td>'.$langs->trans(
"Product").
'</td>';
882 print
'<td class="right">'.$langs->trans(
"Qty").
'</td>';
887 print
'<td class="right">'.$langs->trans(
"UnitCost").
'</td>';
890 print
'<td class="right classfortooltip" title="'.$langs->trans(
"QtyAlreadyConsumed").
'">';
891 print $langs->trans(
"QtyAlreadyConsumedShort");
895 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
896 print $langs->trans(
"Warehouse");
897 if (isModEnabled(
'workstation')) {
898 print
' '.$langs->trans(
"or").
' '.$langs->trans(
"Workstation");
901 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
902 $listwarehouses = $tmpwarehouse->list_array(1);
903 if (count($listwarehouses) > 1) {
904 print
'<br>'.$form->selectarray(
'fk_default_warehouse', $listwarehouses, $fk_default_warehouse, $langs->trans(
"ForceTo"), 0, 0,
'', 0, 0, 0,
'',
'minwidth100 maxwidth200', 1);
905 } elseif (count($listwarehouses) == 1) {
906 print
'<br>'.$form->selectarray(
'fk_default_warehouse', $listwarehouses, $fk_default_warehouse, 0, 0, 0,
'', 0, 0, 0,
'',
'minwidth100 maxwidth200', 1);
912 if (isModEnabled(
'stock')) {
914 print
'<td align="right">';
915 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
916 print $langs->trans(
"Stock");
921 if (isModEnabled(
'productbatch')) {
923 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
924 print $langs->trans(
"Batch");
936 if (
$object->status == Mo::STATUS_DRAFT) {
941 if ($permissiontodelete) {
947 if ($action ==
'addconsumeline') {
948 print
'<!-- Add line to consume -->'.
"\n";
949 print
'<tr class="liste_titre">';
952 print $form->select_produits(0,
'productidtoadd',
'', 0, 0, -1, 2,
'', 1, array(), 0,
'1', 0,
'maxwidth150');
955 print
'<td class="right"><input type="text" name="qtytoadd" value="1" class="width40 right"></td>';
968 if (isModEnabled(
'stock')) {
971 if (isModEnabled(
'productbatch')) {
975 print
'<td colspan="'.$colspan.
'">';
976 print
'<input type="submit" class="button buttongen button-add" name="addconsumelinebutton" value="'.$langs->trans(
"Add").
'">';
977 print
'<input type="submit" class="button buttongen button-cancel" name="canceladdconsumelinebutton" value="'.$langs->trans(
"Cancel").
'">';
982 if (
$object->status == Mo::STATUS_DRAFT) {
986 if ($permissiontodelete) {
992 if (is_object($objectline)) {
993 $extrafields->fetch_name_optionals_label(
$object->table_element_line);
994 $temps = $objectline->showOptionals($extrafields,
'edit', array(),
'',
'',
'1',
'line');
995 if (!empty($temps)) {
996 print
'<tr class="liste_titre"><td style="padding-top: 20px" colspan="9" id="extrafield_lines_area_edit" name="extrafield_lines_area_edit">';
1005 $bomcostupdated = 0;
1008 $nblinetoconsume = 0;
1009 foreach (
$object->lines as $line) {
1010 if ($line->role ==
'toconsume') {
1015 $nblinetoconsumecursor = 0;
1016 foreach (
$object->lines as $line) {
1017 if ($line->role ==
'toconsume') {
1018 $nblinetoconsumecursor++;
1020 $tmpproduct =
new Product($db);
1021 $tmpproduct->fetch($line->fk_product);
1022 $linecost =
price2num($tmpproduct->pmp,
'MT');
1026 $costprice =
price2num((!empty($tmpproduct->cost_price)) ? $tmpproduct->cost_price : $tmpproduct->pmp);
1027 if (empty($costprice)) {
1028 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
1030 if ($productFournisseur->find_min_price_product_fournisseur($line->fk_product, $line->qty) > 0) {
1031 $costprice = $productFournisseur->fourn_unitprice;
1039 if ($useunit && $line->fk_unit > 0) {
1041 $qtyhourservice = 0;
1042 if (preg_match(
'/^(\d+)([a-z]+)$/', $tmpproduct->duration, $reg)) {
1045 $qtyhourforline = 0;
1046 if ($line->fk_unit) {
1052 if (isModEnabled(
'workstation') && $line->fk_default_workstation > 0) {
1054 $workstation->fetch($line->fk_default_workstation);
1055 $linecost =
price2num($qtyhourforline * ($workstation->thm_operator_estimated + $workstation->thm_machine_estimated) /
$object->qty,
'MT');
1056 $bomcostupdated +=
price2num($qtyhourforline * ($workstation->thm_operator_estimated + $workstation->thm_machine_estimated) /
$object->qty,
'MU');
1057 } elseif ($qtyhourservice && $qtyhourforline) {
1058 $linecost =
price2num(($qtyhourforline / $qtyhourservice * $costprice) /
$object->qty,
'MT');
1059 $bomcostupdated +=
price2num(($qtyhourforline / $qtyhourservice * $costprice) /
$object->qty,
'MU');
1062 $bomcostupdated +=
price2num(($line->qty * $costprice) /
$object->qty,
'MU');
1066 $bomcostupdated +=
price2num(($line->qty * $costprice) /
$object->qty,
'MU');
1070 $bomcostupdated =
price2num($bomcostupdated,
'MU');
1071 $arrayoflines =
$object->fetchLinesLinked(
'consumed', $line->id);
1072 $alreadyconsumed = 0;
1073 foreach ($arrayoflines as $line2) {
1074 $alreadyconsumed += $line2[
'qty'];
1077 if ($action ==
'editline' && $lineid == $line->id) {
1078 $linecost =
price2num($tmpproduct->pmp,
'MT');
1080 $arrayoflines =
$object->fetchLinesLinked(
'consumed', $line->id);
1081 $alreadyconsumed = 0;
1082 if (is_array($arrayoflines) && !empty($arrayoflines)) {
1083 foreach ($arrayoflines as $line2) {
1084 $alreadyconsumed += $line2[
'qty'];
1087 $suffix =
'_' . $line->id;
1088 print
'<!-- Line to dispatch ' . $suffix .
' (line edited) -->' .
"\n";
1090 print
'<input id="qty_ordered' . $suffix .
'" type="hidden" value="' . $line->qty .
'">';
1092 print
'<input id="qty_dispatched' . $suffix .
'" type="hidden" value="' . $alreadyconsumed .
'">';
1094 print
'<input name="lineid" type="hidden" value="' . $line->id .
'">';
1097 print
'<td>' . $tmpproduct->getNomUrl(1);
1098 print
'<br><div class="opacitymedium small tdoverflowmax150" title="' .
dol_escape_htmltag($tmpproduct->label) .
'">' . $tmpproduct->label .
'</span>';
1102 print
'<td class="right nowraponall">';
1103 print
'<input class="width40 right" name="qty_lineProduce" value="'. $line->qty.
'">';
1107 print
'<td class="right nowraponall">';
1115 if ($permissiontoupdatecost &&
getDolGlobalString(
'MRP_SHOW_COST_FOR_CONSUMPTION')) {
1120 print
'<td class="right">';
1121 print
' ' .
price2num($alreadyconsumed,
'MS');
1127 print $formproduct->selectWarehouses($line->fk_warehouse,
'warehouse_lineProduce',
'warehouseopen', 1);
1128 } elseif (isModEnabled(
'workstation')) {
1129 print $formproduct->selectWorkstations($line->fk_default_workstation,
'workstation_lineProduce', 1);
1134 if (isModEnabled(
'stock')) {
1135 print
'<td class="nowraponall right">';
1136 if ($tmpproduct->isStockManaged()) {
1137 if ($tmpproduct->stock_reel < ($line->qty - $alreadyconsumed)) {
1138 print
img_warning($langs->trans(
'StockTooLow')).
' ';
1140 print
'<span class="left">'. $tmpproduct->stock_reel .
' </span>';
1146 if (isModEnabled(
'productbatch')) {
1150 print
'<td colspan="'.(3 + (
$object->status == Mo::STATUS_DRAFT ? 1 : 0) + ($permissiontodelete ? 1 : 0)).
'">';
1151 print
'<input type="submit" class="button buttongen button-add small nominwidth" name="save" value="' . $langs->trans(
"Save") .
'">';
1152 print
'<input type="submit" class="button buttongen button-cancel small nominwidth" name="cancel" value="' . $langs->trans(
"Cancel") .
'">';
1158 if (!empty($extrafields)) {
1159 $line->fetch_optionals();
1160 $temps = $line->showOptionals($extrafields,
'edit', array(),
'',
'',
'1',
'line');
1161 if (!empty($temps)) {
1163 print
'<tr><td colspan="'.$colspan.
'"><div style="padding-top: 20px" id="extrafield_lines_area_edit" name="extrafield_lines_area_edit">';
1165 print
'</div></td></tr>';
1169 $suffix =
'_' . $line->id;
1170 print
'<!-- Line to dispatch ' . $suffix .
' -->' .
"\n";
1172 print
'<input id="qty_ordered' . $suffix .
'" type="hidden" value="' . $line->qty .
'">';
1173 print
'<input id="qty_dispatched' . $suffix .
'" type="hidden" value="' . $alreadyconsumed .
'">';
1175 print
'<tr data-line-id="' . $line->id .
'">';
1178 print
'<td>' . $tmpproduct->getNomUrl(1);
1179 print
'<br><div class="opacitymedium small tdoverflowmax150" title="' .
dol_escape_htmltag($tmpproduct->label) .
'">' . $tmpproduct->label .
'</div>';
1183 print
'<td class="right nowraponall">';
1185 if ($line->qty_frozen) {
1186 $help = ($help ?
'<br>' :
'') .
'<strong>' . $langs->trans(
"QuantityFrozen") .
'</strong>: ' .
yn(1) .
' (' . $langs->trans(
"QuantityConsumedInvariable") .
')';
1187 print $form->textwithpicto(
'', $help, -1,
'lock') .
' ';
1189 if ($line->disable_stock_change) {
1190 $help = ($help ?
'<br>' :
'') .
'<strong>' . $langs->trans(
"DisableStockChange") .
'</strong>: ' .
yn(1) .
' (' . (($tmpproduct->type ==
Product::TYPE_SERVICE && !
getDolGlobalString(
'STOCK_SUPPORTS_SERVICES')) ? $langs->trans(
"NoStockChangeOnServices") : $langs->trans(
"DisableStockChangeHelp")) .
')';
1191 print $form->textwithpicto(
'', $help, -1,
'help') .
' ';
1197 print
'<td class="right nowraponall">';
1205 if ($permissiontoupdatecost &&
getDolGlobalString(
'MRP_SHOW_COST_FOR_CONSUMPTION')) {
1206 print
'<td class="right nowraponall">';
1207 print
price($linecost);
1212 print
'<td class="right">';
1213 if ($alreadyconsumed) {
1215 print
'jQuery(document).ready(function() {
1216 jQuery("#expandtoproduce' . $line->id .
'").click(function() {
1217 console.log("Expand mrp_production line ' . $line->id .
'");
1218 jQuery(".expanddetail' . $line->id .
'").toggle();';
1219 if ($nblinetoconsume == $nblinetoconsumecursor) {
1220 print
'if (jQuery("#tablelines").hasClass("nobottom")) { jQuery("#tablelines").removeClass("nobottom"); } else { jQuery("#tablelines").addClass("nobottom"); }';
1226 if (empty(
$conf->use_javascript_ajax)) {
1227 print
'<a href="' . $_SERVER[
"PHP_SELF"] .
'?collapse=' . $collapse .
',' . $line->id .
'">';
1229 print
img_picto($langs->trans(
"ShowDetails"),
"chevron-down",
'id="expandtoproduce' . $line->id .
'"');
1230 if (empty(
$conf->use_javascript_ajax)) {
1234 if ($nblinetoconsume == $nblinetoconsumecursor) {
1235 print
'<script>jQuery("#tablelines").removeClass("nobottom");</script>';
1238 print
' ' .
price2num($alreadyconsumed,
'MS');
1242 print
'<td class="tdoverflowmax100">';
1243 if ($tmpproduct->isStockManaged()) {
1245 if (
getDolGlobalString(
'STOCK_CONSUMPTION_FROM_MANUFACTURING_WAREHOUSE') && $tmpwarehouse->id > 0) {
1246 print
img_picto(
'', $tmpwarehouse->picto) .
" " . $tmpwarehouse->label;
1248 if ($line->fk_warehouse > 0) {
1249 $warehouseline =
new Entrepot($db);
1250 $warehouseline->fetch($line->fk_warehouse);
1251 print $warehouseline->getNomUrl(1);
1255 if (isModEnabled(
'workstation') && $line->fk_default_workstation > 0) {
1257 $tmpworkstation->fetch($line->fk_default_workstation);
1258 print $tmpworkstation->getNomUrl(1);
1263 if (isModEnabled(
'stock')) {
1264 print
'<td class="nowraponall right">';
1266 if (!$line->disable_stock_change && $tmpproduct->stock_reel < ($line->qty - $alreadyconsumed)) {
1267 print
img_warning($langs->trans(
'StockTooLow')) .
' ';
1269 if (!
getDolGlobalString(
'STOCK_CONSUMPTION_FROM_MANUFACTURING_WAREHOUSE') || empty($tmpwarehouse->id)) {
1270 print
price2num($tmpproduct->stock_reel,
'MS');
1273 $tmpproduct->load_stock();
1274 $wh_stock = $tmpproduct->stock_warehouse[$tmpwarehouse->id];
1275 if (!empty($wh_stock)) {
1286 if (isModEnabled(
'productbatch')) {
1297 if (
$object->status == Mo::STATUS_DRAFT) {
1298 $href = $_SERVER[
"PHP_SELF"] .
'?id=' . ((int)
$object->id) .
'&action=editline&token=' .
newToken() .
'&lineid=' . ((int) $line->id);
1299 print
'<td class="center">';
1300 print
'<a class="reposition editfielda" href="' . $href .
'">';
1301 print
img_picto($langs->trans(
'TooltipEditAndRevertStockMovement'),
'edit');
1307 if ($permissiontodelete && empty($arrayoflines)) {
1308 $href = $_SERVER[
"PHP_SELF"] .
'?id=' . ((int)
$object->id) .
'&action=deleteline&token=' .
newToken() .
'&lineid=' . ((int) $line->id);
1309 print
'<td class="center">';
1310 print
'<a class="reposition" href="' . $href .
'">';
1311 print
img_picto($langs->trans(
'TooltipDeleteAndRevertStockMovement'),
'delete');
1319 if (!empty($extrafields)) {
1320 $line->fetch_optionals();
1321 $temps = $line->showOptionals($extrafields,
'view', array(),
'',
'',
'1',
'line');
1322 if (!empty($temps)) {
1324 print
'<tr><td colspan="'.$colspan.
'"><div id="extrafield_lines_area_'.$line->id.
'" name="extrafield_lines_area_'.$line->id.
'">';
1326 print
'</div></td></tr>';
1332 foreach ($arrayoflines as $line2) {
1333 print
'<tr class="expanddetail'.$line->id.
' hideobject opacitylow">';
1337 $tmpstockmovement->id = $line2[
'fk_stock_movement'];
1338 print
'<a href="'.DOL_URL_ROOT.
'/product/stock/movement_list.php?search_ref='.$tmpstockmovement->id.
'">'.
img_picto($langs->trans(
"StockMovement"),
'movement',
'class="paddingright"').
'</a>';
1349 if ($permissiontoupdatecost &&
getDolGlobalString(
'MRP_SHOW_COST_FOR_CONSUMPTION')) {
1354 print
'<td class="right">'.$line2[
'qty'].
'</td>';
1357 print
'<td class="tdoverflowmax150">';
1358 if ($line2[
'fk_warehouse'] > 0) {
1359 $result = $tmpwarehouse->fetch($line2[
'fk_warehouse']);
1361 print $tmpwarehouse->getNomUrl(1);
1367 if (isModEnabled(
'stock')) {
1372 if (isModEnabled(
'productbatch')) {
1374 if ($line2[
'batch'] !=
'') {
1375 $tmpbatch->fetch(0, $line2[
'fk_product'], $line2[
'batch']);
1376 print $tmpbatch->getNomUrl(1);
1388 if (
$object->status == Mo::STATUS_DRAFT) {
1389 $href = $_SERVER[
"PHP_SELF"] .
'?id=' . ((int)
$object->id) .
'&action=editline&token=' .
newToken() .
'&lineid=' . ((int) $line2[
'rowid']);
1390 print
'<td class="center">';
1391 print
'<a class="reposition" href="' . $href .
'">';
1392 print
img_picto($langs->trans(
'TooltipEditAndRevertStockMovement'),
'edit');
1398 if ($permissiontodelete) {
1399 $href = $_SERVER[
"PHP_SELF"].
'?id='.((int)
$object->id).
'&action=deleteline&token='.
newToken().
'&lineid='.((int) $line2[
'rowid']).
'&fk_movement='.((int) $line2[
'fk_stock_movement']);
1400 print
'<td class="center">';
1401 print
'<a class="reposition" href="'.$href.
'">';
1402 print
img_picto($langs->trans(
'TooltipDeleteAndRevertStockMovement'),
'delete');
1410 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
1412 print
'<!-- Enter line to consume -->'.
"\n";
1414 print
'<tr data-max-qty="'.$maxQty.
'" name="batch_'.$line->id.
'_'.$i.
'">';
1416 print
'<td><span class="opacitymedium">'.$langs->trans(
"ToConsume").
'</span></td>';
1417 $preselected = (GETPOSTISSET(
'qty-'.$line->id.
'-'.$i) ?
GETPOST(
'qty-'.$line->id.
'-'.$i) : max(0, $line->qty - $alreadyconsumed));
1418 if ($action ==
'consumeorproduce' && !
getDolGlobalString(
'MRP_AUTO_SET_REMAINING_QUANTITIES_TO_BE_CONSUMED') && !GETPOSTISSET(
'qty-'.$line->id.
'-'.$i)) {
1423 if (
getDolGlobalString(
'MRP_NEVER_CONSUME_MORE_THAN_EXPECTED') && ($line->qty - $alreadyconsumed) <= 0) {
1424 $disable =
'disabled';
1428 print
'<input type="hidden" name="product-'.$line->id.
'-'.$i.
'" value="'.$line->fk_product.
'">';
1431 print
'<td class="right">';
1432 if ((
int) $tmpproduct->stockable_product > 0) {
1433 print
'<input type="text" class="width50 right" id="qtytoconsume-' . $line->id .
'-' . $i .
'" name="qty-' . $line->id .
'-' . $i .
'" value="' . $preselected .
'" ' . $disable .
'>';
1435 print
'<input type="hidden" id="qtytoconsume-' . $line->id .
'-' . $i .
'" name="qty-' . $line->id .
'-' . $i .
'" value="0">';
1436 print
'<span class="opacitymedium">' . $langs->trans(
"StockDisabled") .
'</span>';
1444 if ($permissiontoupdatecost &&
getDolGlobalString(
'MRP_SHOW_COST_FOR_CONSUMPTION')) {
1454 && ((
int) $tmpproduct->stockable_product > 0)) {
1455 if (empty($line->disable_stock_change)) {
1456 $preselected = (GETPOSTISSET(
'idwarehouse-'.$line->id.
'-'.$i) ?
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) : ($tmpproduct->fk_default_warehouse > 0 ? $tmpproduct->fk_default_warehouse :
'ifone'));
1457 print $formproduct->selectWarehouses($preselected,
'idwarehouse-'.$line->id.
'-'.$i,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'maxwidth200 csswarehouse_'.$line->id.
'_'.$i);
1459 print
'<span class="opacitymedium">'.$langs->trans(
"DisableStockChange").
'</span>';
1462 if ((
int) $tmpproduct->stockable_product > 0) {
1463 print
'<span class="opacitymedium">' . $langs->trans(
"StockDisabled") .
'</span>';
1465 print
'<span class="opacitymedium">' . $langs->trans(
"NoStockChangeOnServices") .
'</span>';
1471 if (isModEnabled(
'stock')) {
1476 if (isModEnabled(
'productbatch')) {
1477 print
'<td class="nowraponall">';
1478 if ($tmpproduct->status_batch) {
1479 $preselected = (GETPOSTISSET(
'batch-'.$line->id.
'-'.$i) ?
GETPOST(
'batch-'.$line->id.
'-'.$i) :
'');
1480 print
'<input type="text" class="width75" name="batch-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'" list="batch-'.$line->id.
'-'.$i.
'">';
1481 print $formproduct->selectLotDataList(
'batch-'.$line->id.
'-'.$i, 0, $line->fk_product, 0, array());
1488 print
'<td align="right" class="split">';
1489 print
' '.img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.((int) $line->id).
', \''.
dol_escape_js($type).
'\', \
'qtymissingconsume\')"');
1493 print
'<td align="right" class="splitall">';
1494 if (($action ==
'consumeorproduce' || $action ==
'consumeandproduceall') && $tmpproduct->status_batch == 2) {
1495 print
img_picto($langs->trans(
'SplitAllQuantity'),
'split.png',
'class="splitbutton splitallbutton field-error-icon" data-max-qty="1" onClick="addDispatchLine('.$line->id.
', \'batch\', \'allmissingconsume\')"');
1500 if (
$object->status == Mo::STATUS_DRAFT) {
1505 if ($permissiontodelete) {
1519 print
'<script type="text/javascript">
1520 $(document).ready(function () {
1521 $("select[name=fk_default_warehouse]").change(function() {
1522 var fk_default_warehouse = $("option:selected", this).val();
1523 $("select[name^=idwarehouse-]").val(fk_default_warehouse).change();
1528 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall')) &&
1530 print
'<script>$(document).ready(function () {
1531 $("#fk_default_warehouse").change();
1539 print
'<div class="fichehalfright">';
1540 print
'<div class="clearboth"></div>';
1542 $nblinetoproduce = 0;
1543 foreach (
$object->lines as $line) {
1544 if ($line->role ==
'toproduce') {
1549 $newcardbutton =
'';
1550 $url = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=addproduceline&token='.
newToken();
1551 $permissiontoaddaproductline =
$object->status != $object::STATUS_PRODUCED &&
$object->status != $object::STATUS_CANCELED;
1552 $parameters = array(
'morecss' =>
'reposition');
1553 if ($action !=
'consumeorproduce' && $action !=
'consumeandproduceall') {
1554 if ($nblinetoproduce == 0 ||
$object->mrptype == 1) {
1555 $newcardbutton =
dolGetButtonTitle($langs->trans(
'AddNewProduceLines'),
'',
'fa fa-plus-circle size15x', $url,
'', (
int) $permissiontoaddaproductline, $parameters);
1559 print
load_fiche_titre($langs->trans(
'Production'), $newcardbutton,
'', 0,
'',
'');
1561 print
'<div class="div-table-responsive-no-min">';
1562 print
'<table id="tablelinestoproduce" class="noborder noshadow nobottom centpercent">';
1564 print
'<tr class="liste_titre trheight5em">';
1566 print
'<td>'.$langs->trans(
"Product").
'</td>';
1568 print
'<td class="right">'.$langs->trans(
"Qty").
'</td>';
1571 print
'<td class="right">'.$langs->trans(
"Unit").
'</td>';
1574 if ($permissiontoupdatecost) {
1575 if (empty($bomcostupdated)) {
1576 print
'<td class="right classfortooltip" title="'.$langs->trans(
"AmountUsedToUpdateWAP").
'">';
1577 print $langs->trans(
"UnitCost");
1580 print
'<td class="right classfortooltip" title="'.$langs->trans(
"AmountUsedToUpdateWAP").
'">';
1581 print $langs->trans(
"ManufacturingPrice");
1586 print
'<td class="right classfortooltip" title="'.$langs->trans(
"QtyAlreadyProduced").
'">';
1587 print $langs->trans(
"QtyAlreadyProducedShort");
1591 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
1592 print $langs->trans(
"Warehouse");
1597 if (isModEnabled(
'productbatch')) {
1599 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
1600 print $langs->trans(
"Batch");
1612 if ($permissiontodelete) {
1618 if ($action ==
'addproduceline') {
1619 print
'<!-- Add line to produce -->'.
"\n";
1620 print
'<tr class="liste_titre">';
1624 print $form->select_produits(0,
'productidtoadd',
'', 0, 0, -1, 2,
'', 1, array(), 0,
'1', 0,
'maxwidth300');
1627 print
'<td class="right"><input type="text" name="qtytoadd" value="1" class="width50 right"></td>';
1633 if ($permissiontoupdatecost) {
1637 print
'<td colspan="2">';
1638 print
'<input type="submit" class="button buttongen button-add" name="addproducelinebutton" value="'.$langs->trans(
"Add").
'">';
1639 print
'<input type="submit" class="button buttongen button-cancel" name="canceladdproducelinebutton" value="'.$langs->trans(
"Cancel").
'">';
1642 if (isModEnabled(
'productbatch')) {
1652 if ($permissiontodelete) {
1659 $nblinetoproduce = 0;
1660 foreach (
$object->lines as $line) {
1661 if ($line->role ==
'toproduce') {
1666 $nblinetoproducecursor = 0;
1667 foreach (
$object->lines as $line) {
1668 if ($line->role ==
'toproduce') {
1671 $nblinetoproducecursor++;
1673 $tmpproduct =
new Product($db);
1674 $tmpproduct->fetch($line->fk_product);
1676 $arrayoflines =
$object->fetchLinesLinked(
'produced', $line->id);
1677 $alreadyproduced = 0;
1678 foreach ($arrayoflines as $line2) {
1679 $alreadyproduced += $line2[
'qty'];
1682 $suffix =
'_'.$line->id;
1683 print
'<!-- Line to dispatch '.$suffix.
' (toproduce) -->'.
"\n";
1685 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$line->qty.
'">';
1686 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" value="'.$alreadyproduced.
'">';
1690 print
'<td>'.$tmpproduct->getNomUrl(1);
1691 print
'<br><span class="opacitymedium small">'.$tmpproduct->label.
'</span>';
1694 print
'<td class="right">'.$line->qty.
'</td>';
1697 print
'<td class="right">'.measuringUnitString($line->fk_unit,
'',
null, 1).
'</td>';
1700 if ($permissiontoupdatecost) {
1702 $manufacturingcost = 0;
1703 $manufacturingcostsrc =
'';
1705 $manufacturingcost = $bomcostupdated;
1706 $manufacturingcostsrc = $langs->trans(
"CalculatedFromProductsToConsume");
1707 if (empty($manufacturingcost)) {
1708 $manufacturingcost = $bomcost;
1709 $manufacturingcostsrc = $langs->trans(
"ValueFromBom");
1711 if (empty($manufacturingcost)) {
1712 $manufacturingcost =
price2num($tmpproduct->cost_price,
'MU');
1713 $manufacturingcostsrc = $langs->trans(
"CostPrice");
1715 if (empty($manufacturingcost)) {
1716 $manufacturingcost =
price2num($tmpproduct->pmp,
'MU');
1717 $manufacturingcostsrc = $langs->trans(
"PMPValue");
1721 print
'<td class="right nowraponall" title="'.dol_escape_htmltag($manufacturingcostsrc).
'">';
1722 if ($manufacturingcost) {
1723 print
price($manufacturingcost);
1728 print
'<td class="right nowraponall">';
1729 if ($alreadyproduced) {
1731 print
'jQuery(document).ready(function() {
1732 jQuery("#expandtoproduce'.$line->id.
'").click(function() {
1733 console.log("Expand mrp_production line '.$line->id.
'");
1734 jQuery(".expanddetailtoproduce'.$line->id.
'").toggle();';
1735 if ($nblinetoproduce == $nblinetoproducecursor) {
1736 print
'if (jQuery("#tablelinestoproduce").hasClass("nobottom")) { jQuery("#tablelinestoproduce").removeClass("nobottom"); } else { jQuery("#tablelinestoproduce").addClass("nobottom"); }';
1742 if (empty(
$conf->use_javascript_ajax)) {
1743 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?collapse='.$collapse.
','.$line->id.
'">';
1745 print
img_picto($langs->trans(
"ShowDetails"),
"chevron-down",
'id="expandtoproduce'.$line->id.
'"');
1746 if (empty(
$conf->use_javascript_ajax)) {
1750 print
' '.$alreadyproduced;
1756 if (isModEnabled(
'productbatch')) {
1766 if ($permissiontodelete) {
1767 if ($line->origin_type ==
'free') {
1768 $href = $_SERVER[
"PHP_SELF"];
1769 $href .=
'?id='.$object->id;
1770 $href .=
'&action=deleteline';
1771 $href .=
'&token='.newToken();
1772 $href .=
'&lineid='.$line->id;
1773 print
'<td class="center">';
1774 print
'<a class="reposition" href="'.$href.
'">';
1775 print
img_picto($langs->trans(
'TooltipDeleteAndRevertStockMovement'),
"delete");
1785 foreach ($arrayoflines as $line2) {
1786 print
'<tr class="expanddetailtoproduce'.$line->id.
' hideobject opacitylow">';
1789 $tmpstockmovement->id = $line2[
'fk_stock_movement'];
1790 print
'<a href="'.DOL_URL_ROOT.
'/product/stock/movement_list.php?search_ref='.$tmpstockmovement->id.
'">'.
img_picto($langs->trans(
"StockMovement"),
'movement',
'class="paddingright"').
'</a>';
1800 if ($permissiontoupdatecost) {
1804 print
'<td class="right">'.$line2[
'qty'].
'</td>';
1806 print
'<td class="tdoverflowmax150">';
1807 if ($line2[
'fk_warehouse'] > 0) {
1808 $result = $tmpwarehouse->fetch($line2[
'fk_warehouse']);
1810 print $tmpwarehouse->getNomUrl(1);
1815 if (isModEnabled(
'productbatch')) {
1817 if ($line2[
'batch'] !=
'') {
1818 $tmpbatch->fetch(0, $line2[
'fk_product'], $line2[
'batch']);
1819 print $tmpbatch->getNomUrl(1);
1830 if ($permissiontodelete) {
1836 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
1837 print
'<!-- Enter line to produce -->'.
"\n";
1839 print
'<tr data-max-qty="'.$maxQty.
'" name="batch_'.$line->id.
'_'.$i.
'">';
1841 print
'<td><span class="opacitymedium">'.$langs->trans(
"ToProduce").
'</span></td>';
1842 $preselected = (GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'qtytoproduce-'.$line->id.
'-'.$i) : max(0, $line->qty - $alreadyproduced));
1843 if ($action ==
'consumeorproduce' && !GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i)) {
1847 print
'<td class="right"><input type="text" class="width50 right" id="qtytoproduce-'.$line->id.
'-'.$i.
'" name="qtytoproduce-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'"></td>';
1850 print
'<td class="right"></td>';
1853 if ($permissiontoupdatecost) {
1855 $manufacturingcost = 0;
1856 $manufacturingcostsrc =
'';
1858 $manufacturingcost = $bomcostupdated;
1859 $manufacturingcostsrc = $langs->trans(
"CalculatedFromProductsToConsume");
1860 if (empty($manufacturingcost)) {
1861 $manufacturingcost = $bomcost;
1862 $manufacturingcostsrc = $langs->trans(
"ValueFromBom");
1864 if (empty($manufacturingcost)) {
1865 $manufacturingcost =
price2num($tmpproduct->cost_price,
'MU');
1866 $manufacturingcostsrc = $langs->trans(
"CostPrice");
1868 if (empty($manufacturingcost)) {
1869 $manufacturingcost =
price2num($tmpproduct->pmp,
'MU');
1870 $manufacturingcostsrc = $langs->trans(
"PMPValue");
1875 $preselected = (GETPOSTISSET(
'pricetoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'pricetoproduce-'.$line->id.
'-'.$i) : ($manufacturingcost ?
price($manufacturingcost) :
''));
1876 print
'<td class="right"><input type="text" class="width75 right" name="pricetoproduce-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'"></td>';
1878 print
'<td><input type="hidden" class="width50 right" name="pricetoproduce-'.$line->id.
'-'.$i.
'" value="'.($manufacturingcost ? $manufacturingcost :
'').
'"></td>';
1886 $preselected = (GETPOSTISSET(
'idwarehousetoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) : (
$object->fk_warehouse > 0 ?
$object->fk_warehouse :
'ifone'));
1887 print $formproduct->selectWarehouses($preselected,
'idwarehousetoproduce-'.$line->id.
'-'.$i,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'maxwidth200 csswarehouse_'.$line->id.
'_'.$i);
1889 print
'<span class="opacitymedium">'.$langs->trans(
"NoStockChangeOnServices").
'</span>';
1893 if (isModEnabled(
'productbatch')) {
1895 if ($tmpproduct->status_batch) {
1896 $preselected = (GETPOSTISSET(
'batchtoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i) :
'');
1897 print
'<input type="text" class="width75" name="batchtoproduce-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'">';
1901 if ($tmpproduct->status_batch) {
1903 print
'<td align="right" class="split">';
1904 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.$line->id.
', \''.$type.
'\', \
'qtymissing\')"');
1907 print
'<td align="right" class="splitall">';
1908 if (($action ==
'consumeorproduce' || $action ==
'consumeandproduceall') && $tmpproduct->status_batch == 2) {
1909 print
img_picto($langs->trans(
'SplitAllQuantity'),
'split.png',
'class="splitbutton splitallbutton field-error-icon" onClick="addDispatchLine('.$line->id.
', \'batch\', \'alltoproduce\')"');
1935 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall',
'addconsumeline'))) {
1939 <script
type=
"text/javascript" language=
"javascript">
1941 $(document).ready(
function() {
1943 updateselectbatchbywarehouse();
1945 updateselectwarehousebybatch();
1948 function updateselectbatchbywarehouse() {
1949 $(document).on(
'change',
"select[name*='idwarehouse']",
function () {
1950 console.log(
"We change warehouse so we update the list of possible batch number");
1952 var selectwarehouse = $(
this);
1954 var selectbatch_name = selectwarehouse.attr(
'name').replace(
'idwarehouse',
'batch');
1955 var selectbatch = $(
"datalist[id*='" + selectbatch_name +
"']");
1956 var selectedbatch = selectbatch.val();
1958 var product_element_name = selectwarehouse.attr(
'name').replace(
'idwarehouse',
'product');
1962 url:
"<?php echo DOL_URL_ROOT . '/mrp/ajax/interface.php'; ?>",
1964 action:
"updateselectbatchbywarehouse",
1965 permissiontoproduce: <?php echo $permissiontoproduce ?>,
1966 warehouse_id: $(
this).val(),
1967 token:
'<?php echo currentToken(); ?>',
1968 product_id: $(
"input[name='" + product_element_name +
"']").val()
1970 }).done(
function (data) {
1972 selectbatch.empty();
1974 if (typeof data ==
"object") {
1975 console.log(
"data is already type object, no need to parse it");
1977 console.log(
"data is type "+(typeof data));
1978 data = JSON.parse(data);
1981 selectbatch.append($(
'<option>', {
1985 $.each(data,
function (key, value) {
1987 if(selectwarehouse.val() == -1) {
1988 var label = key +
" (<?php echo $langs->trans('TotalStock') ?> : " + value +
")";
1990 var label = key +
" (<?php echo $langs->trans('Stock') ?> : " + value +
")";
1993 if(key === selectedbatch) {
1994 var option =
'<option value="'+key+
'" selected>'+ label +
'</option>';
1996 var option =
'<option value="'+key+
'">'+ label +
'</option>';
1999 selectbatch.append(option);
2005 function updateselectwarehousebybatch() {
2006 $(document).on(
'change',
'input[name*=batch]',
function(){
2007 console.log(
"We change batch so we update the list of possible warehouses");
2009 var selectbatch = $(
this);
2011 var selectwarehouse_name = selectbatch.attr(
'name').replace(
'batch',
'idwarehouse');
2012 var selectwarehouse = $(
"select[name*='" + selectwarehouse_name +
"']");
2013 var selectedwarehouse = selectwarehouse.val();
2015 if(selectedwarehouse != -1){
2019 var product_element_name = selectbatch.attr(
'name').replace(
'batch',
'product');
2023 url:
"<?php echo DOL_URL_ROOT . '/mrp/ajax/interface.php'; ?>",
2025 action:
"updateselectwarehousebybatch",
2026 permissiontoproduce: <?php echo $permissiontoproduce ?>,
2027 batch: $(
this).val(),
2028 token:
'<?php echo currentToken(); ?>',
2029 product_id: $(
"input[name='" + product_element_name +
"']").val()
2031 }).done(
function (data) {
2033 if (typeof data ==
"object") {
2034 console.log(
"data is already type object, no need to parse it");
2036 console.log(
"data is type "+(typeof data));
2037 data = JSON.parse(data);
2041 selectwarehouse.val(data).change();
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class of dictionary type of thirdparty (used by imports)
Class to manage warehouses.
Class to manage stock movements.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class with list of lots and properties.
Class to manage projects.
Class to manage translations.
convertDurationtoHour($duration_value, $duration_unit)
Convert duration to hour.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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.
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).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
moPrepareHead($object)
Prepare array of tabs for Mo.
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
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.