25 require
'../main.inc.php';
27 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
28 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
29 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
30 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
31 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
33 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
35 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
40 $langs->loadLangs(array(
"mrp",
"stocks",
"other",
"productbatch"));
45 $action =
GETPOST(
'action',
'aZ09');
46 $confirm =
GETPOST(
'confirm',
'alpha');
47 $cancel =
GETPOST(
'cancel',
'aZ09');
48 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'mocard';
49 $backtopage =
GETPOST(
'backtopage',
'alpha');
52 $collapse =
GETPOST(
'collapse',
'aZ09comma');
55 $object =
new Mo($db);
57 $diroutputmassaction = $conf->mrp->dir_output.
'/temp/massgeneration/'.$user->id;
58 $hookmanager->initHooks(array(
'mocard',
'globalcard'));
61 $extrafields->fetch_name_optionals_label($object->table_element);
63 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
66 $search_all =
GETPOST(
"search_all",
'alpha');
68 foreach ($object->fields as $key => $val)
70 if (
GETPOST(
'search_'.$key,
'alpha')) $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
73 if (empty($action) && empty($id) && empty($ref)) $action =
'view';
76 include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
81 $isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
82 $result =
restrictedArea($user,
'mrp', $object->id,
'mrp_mo',
'',
'fk_soc',
'rowid', $isdraft);
84 $permissionnote = $user->rights->mrp->write;
85 $permissiondellink = $user->rights->mrp->write;
86 $permissiontoadd = $user->rights->mrp->write;
87 $permissiontodelete = $user->rights->mrp->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
88 $upload_dir = $conf->mrp->multidir_output[isset($object->entity) ? $object->entity : 1];
90 $permissiontoproduce = $permissiontoadd;
97 $parameters = array();
98 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
99 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
107 if (empty($backtopage) || ($cancel && empty($id))) {
109 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) $backtopage = $backurlforlist;
110 else $backtopage = DOL_URL_ROOT.
'/mrp/mo_production.php?id='.($id > 0 ? $id :
'__ID__');
112 $triggermodname =
'MRP_MO_MODIFY';
115 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
118 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
121 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
124 $triggersendname =
'MO_SENTBYMAIL';
125 $autocopy =
'MAIN_MAIL_AUTOCOPY_MO_TO';
126 $trackid =
'mo'.$object->id;
127 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
132 if ($action ==
'set_thirdparty' && $permissiontoadd)
134 $object->setValueFrom(
'fk_soc',
GETPOST(
'fk_soc',
'int'),
'',
'',
'date',
'', $user,
'MO_MODIFY');
136 if ($action ==
'classin' && $permissiontoadd)
138 $object->setProject(
GETPOST(
'projectid',
'int'));
141 if ($action ==
'confirm_reopen') {
142 $result = $object->setStatut($object::STATUS_INPROGRESS, 0,
'',
'MRP_REOPEN');
145 if ($action ==
'confirm_addconsumeline' &&
GETPOST(
'addconsumelinebutton')) {
146 $moline =
new MoLine($db);
149 $moline->fk_mo = $object->id;
150 $moline->qty =
GETPOST(
'qtytoadd',
'int'); ;
151 $moline->fk_product =
GETPOST(
'productidtoadd',
'int');
152 $moline->role =
'toconsume';
153 $moline->position = 0;
155 $resultline = $moline->create($user,
false);
156 if ($resultline <= 0) {
164 if (in_array($action, array(
'confirm_consumeorproduce',
'confirm_consumeandproduceall'))) {
167 $labelmovement =
GETPOST(
'inventorylabel',
'alphanohtml');
168 $codemovement =
GETPOST(
'inventorycode',
'alphanohtml');
173 foreach ($object->lines as $line) {
174 if ($line->role ==
'toconsume') {
175 $tmpproduct =
new Product($db);
176 $tmpproduct->fetch($line->fk_product);
182 if ($qtytoprocess != 0) {
185 if (!(
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) > 0)) {
186 $langs->load(
"errors");
187 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref), null,
'errors');
190 if ($tmpproduct->status_batch && (!
GETPOST(
'batch-'.$line->id.
'-'.$i))) {
191 $langs->load(
"errors");
192 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref), null,
'errors');
198 if (!$error &&
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) > 0) {
200 $id_product_batch = 0;
201 $stockmove->origin = $object;
202 $idstockmove = $stockmove->livraison($user, $line->fk_product,
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i), $qtytoprocess, 0, $labelmovement,
dol_now(),
'',
'',
GETPOST(
'batch-'.$line->id.
'-'.$i), $id_product_batch, $codemovement);
203 if ($idstockmove < 0) {
212 $moline =
new MoLine($db);
213 $moline->fk_mo = $object->id;
214 $moline->position = $pos;
215 $moline->fk_product = $line->fk_product;
216 $moline->fk_warehouse =
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i);
217 $moline->qty = $qtytoprocess;
218 $moline->batch =
GETPOST(
'batch-'.$line->id.
'-'.$i);
219 $moline->role =
'consumed';
220 $moline->fk_mrp_production = $line->id;
221 $moline->fk_stock_movement = $idstockmove;
222 $moline->fk_user_creat = $user->id;
224 $resultmoline = $moline->create($user);
225 if ($resultmoline <= 0) {
240 foreach ($object->lines as $line) {
241 if ($line->role ==
'toproduce') {
242 $tmpproduct =
new Product($db);
243 $tmpproduct->fetch($line->fk_product);
246 while (
GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i)) {
249 if ($qtytoprocess != 0) {
251 if (
GETPOSTISSET(
'idwarehousetoproduce-'.$line->id.
'-'.$i)) {
252 if (!(
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) > 0)) {
253 $langs->load(
"errors");
254 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Warehouse"), $tmpproduct->ref), null,
'errors');
257 if (!empty($conf->productbatch->enabled) && $tmpproduct->status_batch && (!
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i))) {
258 $langs->load(
"errors");
259 setEventMessages($langs->trans(
"ErrorFieldRequiredForProduct", $langs->transnoentitiesnoconv(
"Batch"), $tmpproduct->ref), null,
'errors');
265 if (!$error &&
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) > 0) {
267 $id_product_batch = 0;
268 $stockmove->origin = $object;
269 $idstockmove = $stockmove->reception($user, $line->fk_product,
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i), $qtytoprocess, 0, $labelmovement,
'',
'',
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i),
dol_now(), $id_product_batch, $codemovement);
270 if ($idstockmove < 0) {
279 $moline =
new MoLine($db);
280 $moline->fk_mo = $object->id;
281 $moline->position = $pos;
282 $moline->fk_product = $line->fk_product;
283 $moline->fk_warehouse =
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i);
284 $moline->qty = $qtytoprocess;
285 $moline->batch =
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i);
286 $moline->role =
'produced';
287 $moline->fk_mrp_production = $line->id;
288 $moline->fk_stock_movement = $idstockmove;
289 $moline->fk_user_creat = $user->id;
291 $resultmoline = $moline->create($user);
292 if ($resultmoline <= 0) {
307 $consumptioncomplete =
true;
308 $productioncomplete =
true;
310 if (
GETPOST(
'autoclose',
'int')) {
311 foreach ($object->lines as $line) {
312 if ($line->role ==
'toconsume') {
313 $arrayoflines = $object->fetchLinesLinked(
'consumed', $line->id);
314 $alreadyconsumed = 0;
315 foreach ($arrayoflines as $line2) {
316 $alreadyconsumed += $line2[
'qty'];
319 if ($alreadyconsumed < $line->qty) {
320 $consumptioncomplete =
false;
323 if ($line->role ==
'toproduce') {
324 $arrayoflines = $object->fetchLinesLinked(
'produced', $line->id);
325 $alreadyproduced = 0;
326 foreach ($arrayoflines as $line2) {
327 $alreadyproduced += $line2[
'qty'];
330 if ($alreadyproduced < $line->qty) {
331 $productioncomplete =
false;
336 $consumptioncomplete =
false;
337 $productioncomplete =
false;
341 dol_syslog(
"consumptioncomplete = ".$consumptioncomplete.
" productioncomplete = ".$productioncomplete);
343 if ($consumptioncomplete && $productioncomplete) {
344 $result = $object->setStatut($object::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
346 $result = $object->setStatut($object::STATUS_INPROGRESS, 0,
'',
'MRP_MO_PRODUCED');
355 $action = str_replace(
'confirm_',
'', $action);
361 header(
"Location: ".
$_SERVER[
"PHP_SELF"].
'?id='.$object->id);
367 if ($action ==
'confirm_produced' && $confirm ==
'yes' && $permissiontoadd)
369 $result = $object->setStatut($object::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
373 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
375 $outputlangs = $langs;
377 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) $newlang =
GETPOST(
'lang_id',
'aZ09');
378 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang;
379 if (!empty($newlang)) {
381 $outputlangs->setDefaultLang($newlang);
383 $model = $object->model_pdf;
384 $ret = $object->fetch($id);
386 $object->generateDocument($model, $outputlangs, 0, 0, 0);
400 $form =
new Form($db);
406 $help_url =
'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication';
407 llxHeader(
'', $langs->trans(
'Mo'), $help_url,
'', 0, 0, array(
'/mrp/js/lib_dispatch.js.php'));
410 if ($object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create')))
412 $res = $object->fetch_thirdparty();
413 $res = $object->fetch_optionals();
422 if ($action ==
'delete')
424 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteMo'), $langs->trans(
'ConfirmDeleteMo'),
'confirm_delete',
'', 0, 1);
427 if ($action ==
'deleteline')
429 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
432 if ($action ==
'clone') {
434 $formquestion = array();
435 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneMo', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
439 if ($action ==
'validate')
442 $ref = substr($object->ref, 1, 4);
443 if ($ref ==
'PROV') {
444 $object->fetch_product();
445 $numref = $object->getNextNumRef($object->fk_product);
447 $numref = $object->ref;
450 $text = $langs->trans(
'ConfirmValidateMo', $numref);
459 $formquestion = array();
460 if (!empty($conf->mrp->enabled))
463 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
466 if ($conf->browser->name ==
'ie') $forcecombo = 1;
467 $formquestion = array(
474 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'Validate'), $text,
'confirm_validate', $formquestion, 0, 1, 220);
478 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
479 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
480 if (empty($reshook)) $formconfirm .= $hookmanager->resPrint;
481 elseif ($reshook > 0) $formconfirm = $hookmanager->resPrint;
489 $linkback = '<a href="'.
dol_buildpath('/mrp/mo_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
491 $morehtmlref = '<div class="refidno">';
497 $morehtmlref .= $langs->trans('ThirdParty').' : '.(is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) : '');
499 if (!empty($conf->projet->enabled))
501 $langs->load(
"projects");
502 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
503 if ($permissiontoadd)
505 if ($action !=
'classify')
506 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
507 if ($action ==
'classify') {
509 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
510 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
511 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
512 $morehtmlref .= $formproject->select_projects($object->fk_soc, $object->fk_project,
'projectid', 0, 0, 1, 0, 1, 0, 0,
'', 1);
513 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
514 $morehtmlref .=
'</form>';
516 $morehtmlref .= $form->form_project(
$_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_soc, $object->fk_project,
'none', 0, 0, 0, 1);
519 if (!empty($object->fk_project)) {
521 $proj->fetch($object->fk_project);
522 $morehtmlref .= $proj->getNomUrl();
528 $morehtmlref .=
'</div>';
531 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
534 print '<div class="fichecenter">';
535 print '<div class="fichehalfleft">';
536 print '<div class="underbanner clearboth"></div>';
537 print '<table class="border centpercent tableforfield">'.
"\n";
540 $keyforbreak =
'fk_warehouse';
541 unset($object->fields[
'fk_project']);
542 unset($object->fields[
'fk_soc']);
543 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
546 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
552 print '<div class="clearboth"></div>';
557 if (!in_array($action, array(
'consumeorproduce',
'consumeandproduceall')))
559 print '<div class="tabsAction">';
561 $parameters = array();
563 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
564 if (empty($reshook)) {
566 if ($object->status == $object::STATUS_DRAFT)
568 if ($permissiontoadd)
570 if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0))
572 print '<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=validate">'.$langs->trans(
"Validate").
'</a>';
574 $langs->load(
"errors");
575 print '<a class="butActionRefused" href="" title="'.$langs->trans(
"ErrorAddAtLeastOneLineFirst").
'">'.$langs->trans(
"Validate").
'</a>';
581 if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) {
582 if ($permissiontoproduce) {
583 print '<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=consumeorproduce">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
585 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
587 } elseif ($object->status == Mo::STATUS_DRAFT) {
588 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ValidateBefore").
'">'.$langs->trans(
'ConsumeOrProduce').
'</a>';
592 if ($object->status == Mo::STATUS_VALIDATED || $object->status == Mo::STATUS_INPROGRESS) {
593 if ($permissiontoproduce) {
594 print '<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=consumeandproduceall">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
596 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
598 } elseif ($object->status == Mo::STATUS_DRAFT) {
599 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"ValidateBefore").
'">'.$langs->trans(
'ConsumeAndProduceAll').
'</a>';
603 if ($permissiontoadd)
605 if ($object->status == $object::STATUS_VALIDATED || $object->status == $object::STATUS_INPROGRESS)
607 $arrayproduced = $object->fetchLinesLinked(
'produced', 0);
609 foreach ($arrayproduced as $lineproduced) {
610 $nbProduced += $lineproduced[
'qty'];
612 if ($nbProduced > 0) {
613 print '<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_produced&confirm=yes">'.$langs->trans(
"Close").
'</a>'.
"\n";
615 print '<a class="butActionRefused" href="#" title="'.$langs->trans(
"GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv(
"Production")).
'">'.$langs->trans(
"Close").
'</a>'.
"\n";
618 print '<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_close&confirm=yes">'.$langs->trans(
"Cancel").
'</a>'.
"\n";
621 if ($object->status == $object::STATUS_CANCELED)
623 print '<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_reopen&confirm=yes">'.$langs->trans(
"Re-Open").
'</a>'.
"\n";
626 if ($object->status == $object::STATUS_PRODUCED) {
627 if ($permissiontoproduce) {
628 print '<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_reopen">'.$langs->trans(
'ReOpen').
'</a>';
630 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans(
"NotEnoughPermissions").
'">'.$langs->trans(
'ReOpen').
'</a>';
639 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall',
'addconsumeline')))
641 print '<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
642 print '<input type="hidden" name="token" value="'.newToken().
'">';
643 print '<input type="hidden" name="action" value="confirm_'.$action.
'">';
644 print '<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
645 print '<input type="hidden" name="id" value="'.$id.
'">';
648 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
649 $defaultstockmovementlabel =
GETPOST(
'inventorylabel',
'alphanohtml') ?
GETPOST(
'inventorylabel',
'alphanohtml') : $langs->trans(
"ProductionForRef", $object->ref);
651 $defaultstockmovementcode =
GETPOST(
'inventorycode',
'alphanohtml') ?
GETPOST(
'inventorycode',
'alphanohtml') : $langs->trans(
"ProductionForRef", $object->ref);
653 print '<div class="center'.(in_array($action, array(
'consumeorproduce',
'consumeandproduceall')) ?
' formconsumeproduce' :
'').
'">';
654 print '<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"ConfirmProductionDesc", $langs->transnoentitiesnoconv(
"Confirm")).
'<br></span>';
655 print '<span class="fieldrequired">'.$langs->trans(
"InventoryCode").
':</span> <input type="text" class="maxwidth200" name="inventorycode" value="'.$defaultstockmovementcode.
'"> ';
656 print '<span class="clearbothonsmartphone"></span>';
657 print $langs->trans(
"MovementLabel").
': <input type="text" class="minwidth300" name="inventorylabel" value="'.$defaultstockmovementlabel.
'"><br><br>';
658 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>';
659 print '<input class="button" type="submit" value="'.$langs->trans(
"Confirm").
'" name="confirm">';
661 print '<input class="button button-cancel" type="submit" value="'.$langs->trans(
"Cancel").
'" name="cancel">';
675 if (!empty($object->table_element_line))
678 $object->fetchLines();
680 print '<div class="fichecenter">';
681 print '<div class="fichehalfleft">';
682 print '<div class="clearboth"></div>';
685 if ($action !=
'consumeorproduce' && $action !=
'consumeandproduceall') {
686 $newlinetext =
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=addconsumeline">'.$langs->trans(
"AddNewConsumeLines").
'</a>';
690 print '<div class="div-table-responsive-no-min">';
691 print
'<table class="noborder noshadow centpercent nobottom">';
693 print
'<tr class="liste_titre">';
694 print
'<td>'.$langs->trans(
"Product").
'</td>';
695 print
'<td class="right">'.$langs->trans(
"Qty").
'</td>';
696 print
'<td class="right">'.$langs->trans(
"QtyAlreadyConsumed").
'</td>';
698 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) print $langs->trans(
"Warehouse");
700 if ($conf->productbatch->enabled) {
702 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) print $langs->trans(
"Batch");
707 if ($action ==
'addconsumeline') {
708 print
'<!-- Add line to consume -->'.
"\n";
709 print
'<tr class="liste_titre">';
711 print $form->select_produits(
'',
'productidtoadd',
'', 0, 0, -1, 2,
'', 0, array(), 0,
'1', 0,
'maxwidth300');
713 print
'<td class="right"><input type="text" name="qtytoadd" value="1" class="width50 right"></td>';
714 print
'<td class="right"></td>';
716 print
'<input type="submit" class="button buttongen" name="addconsumelinebutton" value="'.$langs->trans(
"Add").
'">';
718 if ($conf->productbatch->enabled) {
726 if (!empty($object->lines))
728 $nblinetoconsume = 0;
729 foreach ($object->lines as $line) {
730 if ($line->role ==
'toconsume') {
735 $nblinetoconsumecursor = 0;
736 foreach ($object->lines as $line) {
737 if ($line->role ==
'toconsume') {
738 $nblinetoconsumecursor++;
740 $tmpproduct =
new Product($db);
741 $tmpproduct->fetch($line->fk_product);
743 $arrayoflines = $object->fetchLinesLinked(
'consumed', $line->id);
744 $alreadyconsumed = 0;
745 foreach ($arrayoflines as $line2) {
746 $alreadyconsumed += $line2[
'qty'];
750 print
'<td>'.$tmpproduct->getNomUrl(1);
751 print
'<br><span class="opacitymedium small">'.$tmpproduct->label.
'</span>';
753 print
'<td class="right nowraponall">';
755 if ($line->qty_frozen) $help .= ($help ?
'<br>' :
'').
'<strong>'.$langs->trans(
"QuantityFrozen").
'</strong>: '.
yn(1).
' ('.$langs->trans(
"QuantityConsumedInvariable").
')';
756 if ($line->disable_stock_change) $help .= ($help ?
'<br>' :
'').
'<strong>'.$langs->trans(
"DisableStockChange").
'</strong>: '.
yn(1).
' ('.(($tmpproduct->type ==
Product::TYPE_SERVICE && empty($conf->global->STOCK_SUPPORTS_SERVICES)) ? $langs->trans(
"NoStockChangeOnServices") : $langs->trans(
"DisableStockChangeHelp")).
')';
758 print $form->textwithpicto($line->qty, $help, -1);
763 print
'<td class="right">';
764 if ($alreadyconsumed) {
766 print
'jQuery(document).ready(function() {
767 jQuery("#expandtoproduce'.$line->id.
'").click(function() {
768 console.log("Expand mrp_production line '.$line->id.
'");
769 jQuery(".expanddetail'.$line->id.
'").toggle();';
770 if ($nblinetoconsume == $nblinetoconsumecursor) {
771 print
'if (jQuery("#tablelines").hasClass("nobottom")) { jQuery("#tablelines").removeClass("nobottom"); } else { jQuery("#tablelines").addClass("nobottom"); }';
777 if (empty($conf->use_javascript_ajax)) print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?collapse='.$collapse.
','.$line->id.
'">';
778 print
img_picto($langs->trans(
"ShowDetails"),
"chevron-down",
'id="expandtoproduce'.$line->id.
'"');
779 if (empty($conf->use_javascript_ajax)) print
'</a>';
781 if ($nblinetoconsume == $nblinetoconsumecursor) {
782 print
'<script>jQuery("#tablelines").removeClass("nobottom");</script>';
785 print
' '.$alreadyconsumed;
789 if ($conf->productbatch->enabled) {
795 foreach ($arrayoflines as $line2) {
796 print
'<tr class="expanddetail'.$line->id.
' hideobject opacitylow">';
801 print
'<td class="right">'.$line2[
'qty'].
'</td>';
802 print
'<td class="tdoverflowmax150">';
803 if ($line2[
'fk_warehouse'] > 0) {
804 $result = $tmpwarehouse->fetch($line2[
'fk_warehouse']);
805 if ($result > 0) print $tmpwarehouse->getNomUrl(1);
810 if ($line2[
'batch'] !=
'') {
811 $tmpbatch->fetch(0, $line2[
'fk_product'], $line2[
'batch']);
812 print $tmpbatch->getNomUrl(1);
818 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
820 print
'<!-- Enter line to consume -->'.
"\n";
822 print
'<td><span class="opacitymedium">'.$langs->trans(
"ToConsume").
'</span></td>';
823 $preselected = (
GETPOSTISSET(
'qty-'.$line->id.
'-'.$i) ?
GETPOST(
'qty-'.$line->id.
'-'.$i) : max(0, $line->qty - $alreadyconsumed));
824 if ($action ==
'consumeorproduce' && !
GETPOSTISSET(
'qty-'.$line->id.
'-'.$i)) $preselected = 0;
825 print
'<td class="right"><input type="text" class="width50 right" name="qty-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'"></td>';
829 if (empty($line->disable_stock_change)) {
830 $preselected = (
GETPOSTISSET(
'idwarehouse-'.$line->id.
'-'.$i) ?
GETPOST(
'idwarehouse-'.$line->id.
'-'.$i) : ($tmpproduct->fk_default_warehouse > 0 ? $tmpproduct->fk_default_warehouse :
'ifone'));
831 print $formproduct->selectWarehouses($preselected,
'idwarehouse-'.$line->id.
'-'.$i,
'', 1, 0, $line->fk_product,
'', 1, 0, null,
'maxwidth300');
833 print
'<span class="opacitymedium">'.$langs->trans(
"DisableStockChange").
'</span>';
836 print
'<span class="opacitymedium">'.$langs->trans(
"NoStockChangeOnServices").
'</span>';
840 if ($conf->productbatch->enabled) {
842 if ($tmpproduct->status_batch) {
843 $preselected = (
GETPOSTISSET(
'batch-'.$line->id.
'-'.$i) ?
GETPOST(
'batch-'.$line->id.
'-'.$i) :
'');
844 print
'<input type="text" class="width50" name="batch-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'">';
860 print
'<div class="fichehalfright">';
861 print
'<div class="clearboth"></div>';
865 print
'<div class="div-table-responsive-no-min">';
866 print
'<table id="tablelinestoproduce" class="noborder noshadow nobottom centpercent">';
868 print
'<tr class="liste_titre">';
869 print
'<td>'.$langs->trans(
"Product").
'</td>';
870 print
'<td class="right">'.$langs->trans(
"Qty").
'</td>';
871 print
'<td class="right">'.$langs->trans(
"QtyAlreadyProduced").
'</td>';
873 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) print $langs->trans(
"Warehouse");
875 if ($conf->productbatch->enabled) {
877 if ($collapse || in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) print $langs->trans(
"Batch");
883 if (!empty($object->lines))
885 $nblinetoproduce = 0;
886 foreach ($object->lines as $line) {
887 if ($line->role ==
'toproduce') {
892 $nblinetoproducecursor = 0;
893 foreach ($object->lines as $line) {
894 if ($line->role ==
'toproduce') {
897 $nblinetoproducecursor++;
899 $tmpproduct =
new Product($db);
900 $tmpproduct->fetch($line->fk_product);
902 $arrayoflines = $object->fetchLinesLinked(
'produced', $line->id);
903 $alreadyproduced = 0;
904 foreach ($arrayoflines as $line2) {
905 $alreadyproduced += $line2[
'qty'];
908 $suffix =
'_'.$line->id;
909 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
911 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$line->qty.
'">';
912 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" value="'.$alreadyproduced.
'">';
915 print
'<td>'.$tmpproduct->getNomUrl(1);
916 print
'<br><span class="opacitymedium small">'.$tmpproduct->label.
'</span>';
918 print
'<td class="right">'.$line->qty.
'</td>';
919 print
'<td class="right nowraponall">';
920 if ($alreadyproduced) {
922 print
'jQuery(document).ready(function() {
923 jQuery("#expandtoproduce'.$line->id.
'").click(function() {
924 console.log("Expand mrp_production line '.$line->id.
'");
925 jQuery(".expanddetailtoproduce'.$line->id.
'").toggle();';
926 if ($nblinetoproduce == $nblinetoproducecursor) {
927 print
'if (jQuery("#tablelinestoproduce").hasClass("nobottom")) { jQuery("#tablelinestoproduce").removeClass("nobottom"); } else { jQuery("#tablelinestoproduce").addClass("nobottom"); }';
933 if (empty($conf->use_javascript_ajax)) print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?collapse='.$collapse.
','.$line->id.
'">';
934 print
img_picto($langs->trans(
"ShowDetails"),
"chevron-down",
'id="expandtoproduce'.$line->id.
'"');
935 if (empty($conf->use_javascript_ajax)) print
'</a>';
937 print
' '.$alreadyproduced;
941 if ($conf->productbatch->enabled) {
948 foreach ($arrayoflines as $line2) {
949 print
'<tr class="expanddetailtoproduce'.$line->id.
' hideobject opacitylow">';
954 print
'<td class="right">'.$line2[
'qty'].
'</td>';
955 print
'<td class="tdoverflowmax150">';
956 if ($line2[
'fk_warehouse'] > 0) {
957 $result = $tmpwarehouse->fetch($line2[
'fk_warehouse']);
958 if ($result > 0) print $tmpwarehouse->getNomUrl(1);
961 if ($conf->productbatch->enabled) {
963 if ($line2[
'batch'] !=
'') {
964 $tmpbatch->fetch(0, $line2[
'fk_product'], $line2[
'batch']);
965 print $tmpbatch->getNomUrl(1);
973 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall'))) {
974 print
'<!-- Enter line to produce -->'.
"\n";
975 print
'<tr name="batch_'.$line->id.
'_'.$i.
'">';
976 print
'<td><span class="opacitymedium">'.$langs->trans(
"ToProduce").
'</span></td>';
977 $preselected = (
GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'qtytoproduce-'.$line->id.
'-'.$i) : max(0, $line->qty - $alreadyproduced));
978 if ($action ==
'consumeorproduce' && !
GETPOSTISSET(
'qtytoproduce-'.$line->id.
'-'.$i)) $preselected = 0;
979 print
'<td class="right"><input type="text" class="width50 right" id="qtytoproduce-'.$line->id.
'-'.$i.
'" name="qtytoproduce-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'"></td>';
983 $preselected = (
GETPOSTISSET(
'idwarehousetoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'idwarehousetoproduce-'.$line->id.
'-'.$i) : ($object->fk_warehouse > 0 ? $object->fk_warehouse :
'ifone'));
984 print $formproduct->selectWarehouses($preselected,
'idwarehousetoproduce-'.$line->id.
'-'.$i,
'', 1, 0, $line->fk_product,
'', 1, 0, null,
'maxwidth300 csswarehouse_'.$line->id.
'_'.$i);
986 print
'<span class="opacitymedium">'.$langs->trans(
"NoStockChangeOnServices").
'</span>';
989 if ($conf->productbatch->enabled) {
991 if ($tmpproduct->status_batch) {
992 $preselected = (
GETPOSTISSET(
'batchtoproduce-'.$line->id.
'-'.$i) ?
GETPOST(
'batchtoproduce-'.$line->id.
'-'.$i) :
'');
993 print
'<input type="text" class="width50" name="batchtoproduce-'.$line->id.
'-'.$i.
'" value="'.$preselected.
'">';
997 if ($tmpproduct->status_batch) {
999 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.$line->id.
', \''.$type.
'\', \
'qtymissing\')"');
1016 if (in_array($action, array(
'consumeorproduce',
'consumeandproduceall',
'addconsumeline')))
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname= '')
Make an include_once using default root and alternate root if it fails.
GETPOST($paramname, $check= 'alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
Class to manage stock movements.
img_edit($titlealt= 'default', $float=0, $other= '')
Show logo editer/modifier fiche.
Class with list of lots and properties.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
Class to manage products or services.
dol_now($mode= 'auto')
Return date for now.
const TYPE_SERVICE
Service.
const TYPE_PRODUCT
Regular product.
moPrepareHead($object)
Prepare array of tabs for Mo.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
setEventMessages($mesg, $mesgs, $style= 'mesgs', $messagekey= '')
Set event messages in dol_events session object.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname.
Class to manage projects.
load_fiche_titre($titre, $morehtmlright= '', $picto= 'generic', $pictoisfullpath=0, $id= '', $morecssontable= '', $morehtmlcenter= '')
Load a title with picto.
price2num($amount, $rounding= '', $option=0)
Function that return a number with universal decimal format (decimal separator is '...
img_picto($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt= '', $morecss= '', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename= '', $restricttologhandler= '', $logcontext=null)
Write log message into outputs.
restrictedArea($user, $features, $objectid=0, $tableandshare= '', $feature2= '', $dbt_keyfield= 'fk_soc', $dbt_select= 'rowid', $isdraft=0)
Check permissions of a user to show a page and an object.
Class to manage translations.
print $_SERVER["PHP_SELF"]
Edit parameters.
dol_get_fiche_head($links=array(), $active= '', $title= '', $notab=0, $picto= '', $pictoisfullpath=0, $morehtmlright= '', $morecss= '', $limittoshow=0, $moretabssuffix= '')
Show tabs of a record.
print
Draft customers invoices.
dol_print_date($time, $format= '', $tzoutput= 'auto', $outputlangs= '', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_banner_tab($object, $paramid, $morehtml= '', $shownav=1, $fieldid= 'rowid', $fieldref= 'ref', $morehtmlref= '', $moreparam= '', $nodbprefix=0, $morehtmlleft= '', $morehtmlstatus= '', $onlybanner=0, $morehtmlright= '')
Show tab footer of a card.
if(!defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN'
Draft customers invoices.
Class to manage warehouses.