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.
'/mrp/class/mo.class.php';
32 require_once DOL_DOCUMENT_ROOT.
'/mrp/lib/mrp_mo.lib.php';
33 require_once DOL_DOCUMENT_ROOT.
'/bom/class/bom.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/bom/lib/bom.lib.php';
38 $langs->loadLangs(array(
"mrp",
"other"));
43 $action =
GETPOST(
'action',
'aZ09');
44 $confirm =
GETPOST(
'confirm',
'alpha');
45 $cancel =
GETPOST(
'cancel',
'aZ09');
46 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'mocard';
47 $backtopage =
GETPOST(
'backtopage',
'alpha');
48 $backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
49 $TBomLineId =
GETPOST(
'bomlineid',
'array');
53 $object =
new Mo($db);
54 $objectbom =
new BOM($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) {
69 if (
GETPOST(
'search_'.$key,
'alpha')) {
70 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
74 if (empty($action) && empty($id) && empty($ref)) {
79 include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
81 if (
GETPOST(
'fk_bom',
'int') > 0) {
82 $objectbom->fetch(
GETPOST(
'fk_bom',
'int'));
84 if ($action !=
'add') {
86 $_POST[
'fk_product'] = $objectbom->fk_product;
87 $_POST[
'qty'] = $objectbom->qty;
88 $_POST[
'mrptype'] = $objectbom->bomtype;
89 $_POST[
'fk_warehouse'] = $objectbom->fk_warehouse;
90 $_POST[
'note_private'] = $objectbom->note_private;
97 $isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
98 $result =
restrictedArea($user,
'mrp', $object->id,
'mrp_mo',
'',
'fk_soc',
'rowid', $isdraft);
100 $permissionnote = $user->rights->mrp->write;
101 $permissiondellink = $user->rights->mrp->write;
102 $permissiontoadd = $user->rights->mrp->write;
103 $permissiontodelete = $user->rights->mrp->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
104 $upload_dir = $conf->mrp->multidir_output[isset($object->entity) ? $object->entity : 1];
111 $parameters = array();
112 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
117 if (empty($reshook)) {
122 if (empty($backtopage) || ($cancel && empty($id))) {
123 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
124 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
125 $backtopage = $backurlforlist;
127 $backtopage = DOL_URL_ROOT.
'/mrp/mo_card.php?id='.($id > 0 ? $id :
'__ID__');
131 if ($cancel && !empty($backtopageforcancel)) {
132 $backtopage = $backtopageforcancel;
134 $triggermodname =
'MRP_MO_MODIFY';
137 if ($action ==
'add' && empty($id) && !empty($TBomLineId)) {
139 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
141 $mo_parent = $object;
143 $moline =
new MoLine($db);
144 $objectbomchildline =
new BOMLine($db);
146 foreach ($TBomLineId as $id_bom_line) {
147 $object =
new Mo($db);
149 $objectbomchildline->fetch($id_bom_line);
151 $TMoLines = $moline->fetchAll(
'DESC',
'rowid',
'1',
'', array(
'origin_id' => $id_bom_line));
153 foreach ($TMoLines as $moline) {
154 $_POST[
'fk_bom'] = $objectbomchildline->fk_bom_child;
155 $_POST[
'fk_parent_line'] = $moline->id;
156 $_POST[
'qty'] = $moline->qty;
157 $_POST[
'fk_product'] = $moline->fk_product;
160 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
162 $res = $object->add_object_linked(
'mo', $mo_parent->id);
165 header(
"Location: ".
dol_buildpath(
'/mrp/mo_card.php?id='.$moline->fk_mo, 1));
170 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
173 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
176 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
179 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
181 if ($action ==
'set_thirdparty' && $permissiontoadd) {
182 $object->setValueFrom(
'fk_soc',
GETPOST(
'fk_soc',
'int'),
'',
'',
'date',
'', $user,
'MO_MODIFY');
184 if ($action ==
'classin' && $permissiontoadd) {
185 $object->setProject(
GETPOST(
'projectid',
'int'));
189 $triggersendname =
'MO_SENTBYMAIL';
190 $autocopy =
'MAIN_MAIL_AUTOCOPY_MO_TO';
191 $trackid =
'mo'.$object->id;
192 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
198 if ($action ==
'confirm_produced' && $confirm ==
'yes' && $permissiontoadd) {
199 $result = $object->setStatut($object::STATUS_PRODUCED, 0,
'',
'MRP_MO_PRODUCED');
202 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
203 $outputlangs = $langs;
205 if ($conf->global->MAIN_MULTILANGS && empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
206 $newlang =
GETPOST(
'lang_id',
'aZ09');
208 if ($conf->global->MAIN_MULTILANGS && empty($newlang)) {
209 $newlang = $object->thirdparty->default_lang;
211 if (!empty($newlang)) {
213 $outputlangs->setDefaultLang($newlang);
215 $model = $object->model_pdf;
216 $ret = $object->fetch($id);
218 $object->generateDocument($model, $outputlangs, 0, 0, 0);
237 $title = $langs->trans(
'ManufacturingOrder').
" - ".$langs->trans(
"Card");
244 if ($action ==
'create') {
245 if (
GETPOST(
'fk_bom',
'int') > 0) {
246 $titlelist = $langs->trans(
"ToConsume");
247 if ($objectbom->bomtype == 1) {
248 $titlelist = $langs->trans(
"ToObtain");
252 print
load_fiche_titre($langs->trans(
"NewObject", $langs->transnoentitiesnoconv(
"Mo")),
'',
'mrp');
254 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
255 print
'<input type="hidden" name="token" value="'.newToken().
'">';
256 print
'<input type="hidden" name="action" value="add">';
258 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
260 if ($backtopageforcancel) {
261 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
266 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
269 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
272 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
274 print
'</table>'.
"\n";
282 $(document).ready(
function () {
283 jQuery(
'#fk_bom').change(
function() {
284 console.log(
'We change value of BOM with BOM of id '+jQuery(
'#fk_bom').val());
285 if (jQuery(
'#fk_bom').val() > 0)
288 window.location.href =
'<?php echo $_SERVER["PHP_SELF"] ?>?action=create&token=<?php echo newToken(); ?>&fk_bom='+jQuery(
'#fk_bom').val();
317 else if (jQuery(
'#fk_bom').val() < 0) {
319 console.log(jQuery(
'#fk_product').val());
320 window.location.href =
'<?php echo $_SERVER["PHP_SELF"] ?>?action=create&token=<?php echo newToken(); ?>&qty='+jQuery(
'#qty').val()+
'&mrptype='+jQuery(
'#mrptype').val()+
'&fk_product='+jQuery(
'#fk_product').val()+
'&label='+jQuery(
'#label').val()+
'&fk_project='+jQuery(
'#fk_project').val()+
'&fk_warehouse='+jQuery(
'#fk_warehouse').val();
338 print
$form->buttonsSaveCancel(
"Create");
340 if ($objectbom->id > 0) {
343 print
'<div class="div-table-responsive-no-min">';
344 print
'<table class="noborder centpercent">';
346 $object->lines = $objectbom->lines;
347 $object->mrptype = $objectbom->bomtype;
348 $object->bom = $objectbom;
350 $object->printOriginLinesList(
'', array());
360 if (($id || $ref) && $action ==
'edit') {
363 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
364 print
'<input type="hidden" name="token" value="'.newToken().
'">';
365 print
'<input type="hidden" name="action" value="update">';
366 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
368 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
370 if ($backtopageforcancel) {
371 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
376 $object->fields[
'fk_bom'][
'disabled'] = 1;
378 print
'<table class="border centpercent tableforfieldedit">'.
"\n";
381 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_edit.tpl.php';
384 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_edit.tpl.php';
390 print
$form->buttonsSaveCancel();
396 if ($object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
397 $res = $object->fetch_thirdparty();
398 $res = $object->fetch_optionals();
402 print
dol_get_fiche_head($head,
'card', $langs->trans(
"ManufacturingOrder"), -1, $object->picto);
407 if ($action ==
'delete') {
408 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteMo'), $langs->trans(
'ConfirmDeleteMo'),
'confirm_delete',
'', 0, 1);
411 if ($action ==
'deleteline') {
412 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
416 if ($action ==
'validate') {
418 $ref = substr($object->ref, 1, 4);
419 if ($ref ==
'PROV') {
420 $object->fetch_product();
421 $numref = $object->getNextNumRef($object->fk_product);
423 $numref = $object->ref;
426 $text = $langs->trans(
'ConfirmValidateMo', $numref);
435 $formquestion = array();
436 if (!empty($conf->mrp->enabled)) {
438 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
441 if ($conf->browser->name ==
'ie') {
444 $formquestion = array(
451 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'Validate'), $text,
'confirm_validate', $formquestion, 0, 1, 220);
455 if ($action ==
'clone') {
457 $formquestion = array();
458 $formconfirm =
$form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneMo', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
462 $parameters = array(
'formConfirm' =>
$formconfirm,
'lineid' => $lineid);
463 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
464 if (empty($reshook)) {
466 } elseif ($reshook > 0) {
476 $linkback =
'<a href="'.dol_buildpath(
'/mrp/mo_list.php', 1).
'?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
478 $morehtmlref =
'<div class="refidno">';
484 $morehtmlref .= $langs->trans(
'ThirdParty').
' ';
485 $morehtmlref .=
': '.(is_object($object->thirdparty) ? $object->thirdparty->getNomUrl(1) :
'');
487 if (!empty($conf->project->enabled)) {
488 $langs->load(
"projects");
489 $morehtmlref .=
'<br>'.$langs->trans(
'Project').
' ';
490 if ($permissiontoadd) {
491 if ($action !=
'classify') {
492 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> : ';
494 if ($action ==
'classify') {
496 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'">';
497 $morehtmlref .=
'<input type="hidden" name="action" value="classin">';
498 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
499 $morehtmlref .= $formproject->select_projects($object->fk_soc, $object->fk_project,
'projectid', 0, 0, 1, 0, 1, 0, 0,
'', 1);
500 $morehtmlref .=
'<input type="submit" class="button valignmiddle" value="'.$langs->trans(
"Modify").
'">';
501 $morehtmlref .=
'</form>';
503 $morehtmlref .=
$form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->fk_soc, $object->fk_project,
'none', 0, 0, 0, 1);
506 if (!empty($object->fk_project)) {
508 $proj->fetch($object->fk_project);
509 $morehtmlref .=
' : '.$proj->getNomUrl();
515 $morehtmlref .=
'</div>';
518 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
521 print
'<div class="fichecenter">';
522 print
'<div class="fichehalfleft">';
523 print
'<div class="underbanner clearboth"></div>';
524 print
'<table class="border centpercent tableforfield">'.
"\n";
527 $mo_parent = $object->getMoParent();
528 if (is_object($mo_parent)) {
529 print
'<tr class="field_fk_mo_parent">';
530 print
'<td class="titlefield fieldname_fk_mo_parent">' . $langs->trans(
'ParentMo') .
'</td>';
531 print
'<td class="valuefield fieldname_fk_mo_parent">' .$mo_parent->getNomUrl(1).
'</td>';
536 $keyforbreak =
'fk_warehouse';
537 unset($object->fields[
'fk_project']);
538 unset($object->fields[
'fk_soc']);
539 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
542 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
548 print
'<div class="clearboth"></div>';
557 if (!empty($object->table_element_line)) {
560 $object->fetchLines();
562 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">
563 <input type="hidden" name="token" value="' .
newToken().
'">
564 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
565 <input type="hidden" name="mode" value="">
566 <input type="hidden" name="page_y" value="">
567 <input type="hidden" name="id" value="' . $object->id.
'">
574 if (!empty($object->lines)) {
575 print
'<div class="div-table-responsive-no-min">';
576 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
578 print
'<tr class="liste_titre">';
579 print
'<td class="liste_titre">'.$langs->trans(
"Summary").
'</td>';
583 print
'<tr class="oddeven">';
584 print
'<td>'.$langs->trans(
"ProductsToConsume").
'</td>';
586 if (!empty($object->lines)) {
588 foreach ($object->lines as $line) {
589 if ($line->role ==
'toconsume') {
593 $tmpproduct =
new Product($db);
594 $tmpproduct->fetch($line->fk_product);
595 print $tmpproduct->getNomUrl(1);
603 print
'<tr class="oddeven">';
604 print
'<td>'.$langs->trans(
"ProductsToProduce").
'</td>';
606 if (!empty($object->lines)) {
608 foreach ($object->lines as $line) {
609 if ($line->role ==
'toproduce') {
613 $tmpproduct =
new Product($db);
614 $tmpproduct->fetch($line->fk_product);
615 print $tmpproduct->getNomUrl(1);
633 if ($action !=
'presend' && $action !=
'editline') {
634 print
'<div class="tabsAction">'.
"\n";
635 $parameters = array();
636 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
641 if (empty($reshook)) {
648 if ($object->status == $object::STATUS_VALIDATED) {
649 if ($permissiontoadd) {
651 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=confirm_setdraft&confirm=yes&token='.
newToken().
'">'.$langs->trans(
"SetToDraft").
'</a>';
656 if ($object->status == $object::STATUS_DRAFT) {
657 if ($permissiontoadd) {
658 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=edit&token='.
newToken().
'">'.$langs->trans(
"Modify").
'</a>'.
"\n";
660 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'Modify').
'</a>'.
"\n";
665 if ($object->status == $object::STATUS_DRAFT) {
666 if ($permissiontoadd) {
667 if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
668 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=validate">'.$langs->trans(
"Validate").
'</a>';
670 $langs->load(
"errors");
671 print
'<a class="butActionRefused" href="" title="'.$langs->trans(
"ErrorAddAtLeastOneLineFirst").
'">'.$langs->trans(
"Validate").
'</a>';
677 if ($permissiontoadd) {
678 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&socid='.$object->fk_soc.
'&action=clone&object=mo">'.$langs->trans(
"ToClone").
'</a>';
682 if ($permissiontoadd) {
683 if ($object->status == $object::STATUS_VALIDATED || $object->status == $object::STATUS_INPROGRESS) {
684 $arrayproduced = $object->fetchLinesLinked(
'produced', 0);
686 foreach ($arrayproduced as $lineproduced) {
687 $nbProduced += $lineproduced[
'qty'];
689 if ($nbProduced > 0) {
690 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_produced&confirm=yes&token='.
newToken().
'">'.$langs->trans(
"Close").
'</a>'.
"\n";
692 print
'<a class="butActionRefused" href="#" title="'.$langs->trans(
"GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv(
"Production")).
'">'.$langs->trans(
"Close").
'</a>'.
"\n";
695 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_close&confirm=yes&token='.
newToken().
'">'.$langs->trans(
"Cancel").
'</a>'.
"\n";
698 if ($object->status == $object::STATUS_PRODUCED || $object->status == $object::STATUS_CANCELED) {
699 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=confirm_reopen&confirm=yes&token='.
newToken().
'">'.$langs->trans(
"ReOpen").
'</a>'.
"\n";
704 if ($permissiontodelete || ($object->status == $object::STATUS_DRAFT && $permissiontoadd)) {
705 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete&token='.
newToken().
'">'.$langs->trans(
'Delete').
'</a>'.
"\n";
707 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'Delete').
'</a>'.
"\n";
715 if (
GETPOST(
'modelselected')) {
719 if ($action !=
'presend') {
720 print
'<div class="fichecenter"><div class="fichehalfleft">';
721 print
'<a name="builddoc"></a>';
725 $relativepath = $objref.
'/'.$objref.
'.pdf';
726 $filedir = $conf->mrp->dir_output.
'/'.$objref;
727 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
728 $genallowed = $user->rights->mrp->read;
729 $delallowed = $user->rights->mrp->create;
730 print $formfile->showdocuments(
'mrp:mo', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $mysoc->default_lang);
733 $linktoelem =
$form->showLinkToObjectBlock($object,
null, array(
'mo'));
734 $somethingshown =
$form->showLinkedObjectBlock($object, $linktoelem,
false);
737 print
'</div><div class="fichehalfright">';
741 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/mrp/mo_agenda.php?id='.$object->id);
744 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
746 $somethingshown =
$formactions->showactions($object, $object->element, $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
748 print
'</div></div>';
752 if (
GETPOST(
'modelselected')) {
758 $defaulttopic =
'InformationMessage';
759 $diroutput = $conf->mrp->dir_output;
760 $trackid =
'mo'.$object->id;
762 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';