dolibarr 21.0.0-beta
mo_card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017-2020 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
4 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
28// Load Dolibarr environment
29require '../main.inc.php';
30
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
34require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
35require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
36require_once DOL_DOCUMENT_ROOT.'/mrp/lib/mrp_mo.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php';
38require_once DOL_DOCUMENT_ROOT.'/bom/lib/bom.lib.php';
39
40if (isModEnabled('workstation')) {
41 require_once DOL_DOCUMENT_ROOT.'/workstation/class/workstation.class.php';
42}
43
44
54// Load translation files required by the page
55$langs->loadLangs(array('mrp', 'other'));
56
57
58// Get parameters
59$id = GETPOSTINT('id');
60$ref = GETPOST('ref', 'alpha');
61$action = GETPOST('action', 'aZ09');
62$confirm = GETPOST('confirm', 'alpha');
63$cancel = GETPOST('cancel', 'aZ09');
64$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'mocard'; // To manage different context of search
65$backtopage = GETPOST('backtopage', 'alpha');
66$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
67$TBomLineId = GETPOST('bomlineid', 'array');
68$lineid = GETPOSTINT('lineid');
69$socid = GETPOSTINT("socid");
70
71// Initialize a technical objects
72$object = new Mo($db);
73$objectbom = new BOM($db);
74
75$extrafields = new ExtraFields($db);
76$diroutputmassaction = $conf->mrp->dir_output.'/temp/massgeneration/'.$user->id;
77$hookmanager->initHooks(array('mocard', 'globalcard')); // Note that conf->hooks_modules contains array
78
79// Fetch optionals attributes and labels
80$extrafields->fetch_name_optionals_label($object->table_element);
81
82$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
83
84// Initialize array of search criteria
85$search_all = GETPOST("search_all", 'alpha');
86$search = array();
87foreach ($object->fields as $key => $val) {
88 if (GETPOST('search_'.$key, 'alpha')) {
89 $search[$key] = GETPOST('search_'.$key, 'alpha');
90 }
91}
92
93if (empty($action) && empty($id) && empty($ref)) {
94 $action = 'view';
95}
96
97// Load object
98include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
99
100if (GETPOSTINT('fk_bom') > 0) {
101 $objectbom->fetch(GETPOSTINT('fk_bom'));
102
103 if ($action != 'add') {
104 // We force calling parameters if we are not in the submit of creation of MO
105 $_POST['fk_product'] = $objectbom->fk_product;
106 $_POST['qty'] = $objectbom->qty;
107 $_POST['mrptype'] = $objectbom->bomtype;
108 $_POST['fk_warehouse'] = $objectbom->fk_warehouse;
109 $_POST['note_private'] = $objectbom->note_private;
110 }
111}
112
113// Security check - Protection if external user
114//if ($user->socid > 0) accessforbidden();
115//if ($user->socid > 0) $socid = $user->socid;
116$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
117$result = restrictedArea($user, 'mrp', $object->id, 'mrp_mo', '', 'fk_soc', 'rowid', $isdraft);
118
119// Permissions
120$permissionnote = $user->hasRight('mrp', 'write'); // Used by the include of actions_setnotes.inc.php
121$permissiondellink = $user->hasRight('mrp', 'write'); // Used by the include of actions_dellink.inc.php
122$permissiontoadd = $user->hasRight('mrp', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
123$permissiontodelete = $user->hasRight('mrp', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
124$upload_dir = $conf->mrp->multidir_output[isset($object->entity) ? $object->entity : 1];
125
126
127/*
128 * Actions
129 */
130
131$parameters = array();
132$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
133if ($reshook < 0) {
134 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
135}
136
137if (empty($reshook)) {
138 $error = 0;
139
140 $backurlforlist = dol_buildpath('/mrp/mo_list.php', 1);
141
142 $object->oldQty = $object->qty;
143
144 if (empty($backtopage) || ($cancel && empty($id))) {
145 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
146 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
147 $backtopage = $backurlforlist;
148 } else {
149 $backtopage = DOL_URL_ROOT.'/mrp/mo_card.php?id='.($id > 0 ? $id : '__ID__');
150 }
151 }
152 }
153 if ($cancel && !empty($backtopageforcancel)) {
154 $backtopage = $backtopageforcancel;
155 }
156 $triggermodname = 'MO_MODIFY'; // Name of trigger action code to execute when we modify record
157
158 // Create MO with Children
159 if ($action == 'add' && empty($id) && !empty($TBomLineId) && $permissiontoadd) {
160 $noback = 1;
161 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
162
163 $mo_parent = $object;
164
165 $moline = new MoLine($db);
166 $objectbomchildline = new BOMLine($db);
167
168 foreach ($TBomLineId as $id_bom_line) {
169 $object = new Mo($db); // modified by the actions_addupdatedelete.inc.php
170
171 $objectbomchildline->fetch($id_bom_line);
172
173 $TMoLines = $moline->fetchAll('DESC', 'rowid', '1', '', array('origin_id' => $id_bom_line));
174
175 foreach ($TMoLines as $tmpmoline) {
176 $_POST['fk_bom'] = $objectbomchildline->fk_bom_child;
177 $_POST['fk_parent_line'] = $tmpmoline->id;
178 $_POST['qty'] = $tmpmoline->qty;
179 $_POST['fk_product'] = $tmpmoline->fk_product;
180 }
181
182 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
183
184 $res = $object->add_object_linked('mo', $mo_parent->id);
185 }
186
187 header("Location: ".dol_buildpath('/mrp/mo_card.php?id='.((int) $mo_parent->id), 1));
188 exit;
189 } elseif ($action == 'confirm_cancel' && $confirm == 'yes' && !empty($permissiontoadd)) {
190 $also_cancel_consumed_and_produced_lines = (GETPOST('alsoCancelConsumedAndProducedLines', 'alpha') ? 1 : 0);
191 $result = $object->cancel($user, 0, $also_cancel_consumed_and_produced_lines);
192 if ($result > 0) {
193 header("Location: " . dol_buildpath('/mrp/mo_card.php?id=' . $object->id, 1));
194 exit;
195 } else {
196 $action = '';
197 setEventMessages($object->error, $object->errors, 'errors');
198 }
199 } elseif ($action == 'confirm_delete' && $confirm == 'yes' && !empty($permissiontodelete)) {
200 $also_cancel_consumed_and_produced_lines = (GETPOST('alsoCancelConsumedAndProducedLines', 'alpha') ? 1 : 0);
201 $result = $object->delete($user, 0, $also_cancel_consumed_and_produced_lines);
202 if ($result > 0) {
203 header("Location: " . $backurlforlist);
204 exit;
205 } else {
206 $action = '';
207 setEventMessages($object->error, $object->errors, 'errors');
208 }
209 }
210
211 if ($action == 'confirm_delete' && !empty($permissiontodelete)) {
212 if (!($object->id > 0)) {
213 dol_print_error(null, 'Error, object must be fetched before being deleted');
214 exit;
215 }
216
217 $error = 0;
218 $deleteChilds = GETPOST('deletechilds', 'aZ');
219
220 // Start the database transaction
221 $db->begin();
222
223 if ($deleteChilds === 'on') {
224 $TMoChildren = $object->getAllMoChilds();
225
226 foreach ($TMoChildren as $id => $childObject) {
227 if ($childObject->delete($user) == -1) {
228 $error++;
229 if (!empty($childObject->errors)) {
230 setEventMessages(null, $childObject->errors, 'errors');
231 } else {
232 setEventMessages($childObject->error, null, 'errors');
233 }
234 }
235 }
236 }
237
238 if (!$error) {
239 $result = $object->delete($user);
240
241 if ($result > 0) {
242 setEventMessages("RecordDeleted", null, 'mesgs');
243
244 if ($deleteChilds === 'on') {
245 setEventMessages("MoChildsDeleted", null, 'mesgs');
246 }
247
248 if (empty($noback)) {
249 header("Location: " . $backurlforlist);
250 exit;
251 }
252 } else {
253 $error++;
254 if (!empty($object->errors)) {
255 setEventMessages(null, $object->errors, 'errors');
256 } else {
257 setEventMessages($object->error, null, 'errors');
258 }
259 }
260 }
261
262 // Commit or rollback the database transaction based on whether there was an error
263 if ($error) {
264 $db->rollback();
265 } else {
266 $db->commit();
267 }
268 }
269
270
271 // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
272 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
273
274 // Actions when linking object each other
275 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
276
277 // Actions when printing a doc from card
278 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
279
280 // Action to build doc
281 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
282
283 if ($action == 'set_thirdparty' && $permissiontoadd) {
284 $object->setValueFrom('fk_soc', GETPOSTINT('fk_soc'), '', null, 'date', '', $user, $triggermodname);
285 }
286 if ($action == 'classin' && $permissiontoadd) {
287 $object->setProject(GETPOSTINT('projectid'));
288 }
289
290 // Actions to send emails
291 $triggersendname = 'MO_SENTBYMAIL';
292 $autocopy = 'MAIN_MAIL_AUTOCOPY_MO_TO';
293 $trackid = 'mo'.$object->id;
294 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
295
296 // Action to move up and down lines of object
297 //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be 'include', not 'include_once'
298
299 // Action close produced
300 if ($action == 'confirm_produced' && $confirm == 'yes' && $permissiontoadd) {
301 $result = $object->setStatut($object::STATUS_PRODUCED, 0, '', 'MRP_MO_PRODUCED');
302 if ($result >= 0) {
303 // Define output language
304 if (!getDolGlobalString('MAIN_DISABLE_PDF_AUTOUPDATE')) {
305 $outputlangs = $langs;
306 $newlang = '';
307 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
308 $newlang = GETPOST('lang_id', 'aZ09');
309 }
310 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
311 $newlang = $object->thirdparty->default_lang;
312 }
313 if (!empty($newlang)) {
314 $outputlangs = new Translate("", $conf);
315 $outputlangs->setDefaultLang($newlang);
316 }
317 $model = $object->model_pdf;
318 $ret = $object->fetch($id); // Reload to get new records
319
320 $object->generateDocument($model, $outputlangs, 0, 0, 0);
321 }
322 } else {
323 setEventMessages($object->error, $object->errors, 'errors');
324 }
325 }
326}
327
328
329
330
331/*
332 * View
333 */
334
335$form = new Form($db);
336$formfile = new FormFile($db);
337$formproject = new FormProjets($db);
338
339$title = $langs->trans('ManufacturingOrder')." - ".$langs->trans("Card");
340$help_url = 'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication|DE:Modul_Fertigungsauftrag';
341
342llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-mrp page-card');
343
344
345
346// Part to create
347if ($action == 'create') {
348 if (GETPOSTINT('fk_bom') > 0) {
349 $titlelist = $langs->trans("ToConsume");
350 if ($objectbom->bomtype == 1) {
351 $titlelist = $langs->trans("ToObtain");
352 }
353 }
354
355 print load_fiche_titre($langs->trans("NewObject", $langs->transnoentitiesnoconv("Mo")), '', 'mrp');
356
357 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
358 print '<input type="hidden" name="token" value="'.newToken().'">';
359 print '<input type="hidden" name="action" value="add">';
360 if ($backtopage) {
361 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
362 }
363 if ($backtopageforcancel) {
364 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
365 }
366
367 print dol_get_fiche_head(array(), '');
368
369 print '<table class="border centpercent tableforfieldcreate">'."\n";
370
371 // Common attributes
372 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
373
374 // Other attributes
375 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
376
377 print '</table>'."\n";
378
379 print dol_get_fiche_end();
380
382 <script>
383 $(document).ready(function () {
384 jQuery('#fk_bom').change(function() {
385 console.log('We change value of BOM with BOM of id '+jQuery('#fk_bom').val());
386 if (jQuery('#fk_bom').val() > 0)
387 {
388 // Redirect to page with fk_bom set
389 window.location.href = '<?php echo $_SERVER["PHP_SELF"] ?>?action=create&token=<?php echo newToken(); ?>&fk_bom='+jQuery('#fk_bom').val();
390 /*
391 $.getJSON('<?php echo DOL_URL_ROOT ?>/mrp/ajax/ajax_bom.php?action=getBoms&idbom='+jQuery('#fk_bom').val(), function(data) {
392 console.log(data);
393 if (typeof data.rowid != "undefined") {
394 console.log("New BOM loaded, we set values in form");
395 console.log(data);
396 $('#qty').val(data.qty);
397 $("#mrptype").val(data.bomtype); // We set bomtype into mrptype
398 $('#mrptype').trigger('change'); // Notify any JS components that the value changed
399 $("#fk_product").val(data.fk_product);
400 $('#fk_product').trigger('change'); // Notify any JS components that the value changed
401 $('#note_private').val(data.description);
402 $('#note_private').trigger('change'); // Notify any JS components that the value changed
403 $('#fk_warehouse').val(data.fk_warehouse);
404 $('#fk_warehouse').trigger('change'); // Notify any JS components that the value changed
405 if (typeof CKEDITOR != "undefined") {
406 if (typeof CKEDITOR.instances != "undefined") {
407 if (typeof CKEDITOR.instances.note_private != "undefined") {
408 console.log(CKEDITOR.instances.note_private);
409 CKEDITOR.instances.note_private.setData(data.description);
410 }
411 }
412 }
413 } else {
414 console.log("Failed to get BOM");
415 }
416 });*/
417 }
418 else if (jQuery('#fk_bom').val() < 0) {
419 // Redirect to page with all fields defined except fk_bom set
420 console.log(jQuery('#fk_product').val());
421 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();
422 /*
423 $('#qty').val('');
424 $("#fk_product").val('');
425 $('#fk_product').trigger('change'); // Notify any JS components that the value changed
426 $('#note_private').val('');
427 $('#note_private').trigger('change'); // Notify any JS components that the value changed
428 $('#fk_warehouse').val('');
429 $('#fk_warehouse').trigger('change'); // Notify any JS components that the value changed
430 */
431 }
432 });
433
434 //jQuery('#fk_bom').trigger('change');
435 })
436 </script>
437 <?php
438
439 print $form->buttonsSaveCancel("Create");
440
441 if ($objectbom->id > 0) {
442 print load_fiche_titre($titlelist);
443
444 print '<!-- list of product/services to consume -->'."\n";
445 print '<div class="div-table-responsive-no-min">';
446 print '<table class="noborder centpercent">';
447
448 $arrayOfMoLines = array();
449 foreach ($objectbom->lines as $key => $val) {
450 $moLine = new MoLine($db);
451 $moLine->id = $objectbom->lines[$key]->id;
452 $moLine->position = $objectbom->lines[$key]->position;
453 $moLine->fk_product = $objectbom->lines[$key]->fk_product;
454 $moLine->fk_unit = $objectbom->lines[$key]->fk_unit;
455 $moLine->qty = $objectbom->lines[$key]->qty;
456 $moLine->qty_frozen = $objectbom->lines[$key]->qty_frozen;
457 $moLine->disable_stock_change = $objectbom->lines[$key]->disable_stock_change;
458
459 $arrayOfMoLines[] = $moLine;
460 }
461 $object->lines = $arrayOfMoLines;
462 $object->mrptype = $objectbom->bomtype;
463 $object->bom = $objectbom;
464
465 $object->printOriginLinesList('', array());
466
467 print '</table>';
468 print '</div>';
469 }
470
471 print '</form>';
472}
473
474// Part to edit record
475if (($id || $ref) && $action == 'edit') {
476 print load_fiche_titre($langs->trans("ManufacturingOrder"), '', 'mrp');
477
478 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
479 print '<input type="hidden" name="token" value="'.newToken().'">';
480 print '<input type="hidden" name="action" value="update">';
481 print '<input type="hidden" name="id" value="'.$object->id.'">';
482 if ($backtopage) {
483 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
484 }
485 if ($backtopageforcancel) {
486 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
487 }
488
489 print dol_get_fiche_head();
490
491 $object->fields['fk_bom']['disabled'] = 1;
492
493 print '<table class="border centpercent tableforfieldedit">'."\n";
494
495 // Common attributes
496 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
497
498 // Other attributes
499 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
500
501 print '</table>';
502
503 print dol_get_fiche_end();
504
505 print $form->buttonsSaveCancel();
506
507 print '</form>';
508}
509
510// Part to show record
511if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
512 $res = $object->fetch_thirdparty();
513
514 $head = moPrepareHead($object);
515
516 print dol_get_fiche_head($head, 'card', $langs->trans("ManufacturingOrder"), -1, $object->picto);
517
518 $formconfirm = '';
519
520 // Confirmation to delete
521 if ($action == 'delete') {
522 $numberofmochilds = count($object->getAllMoChilds());
523
524 if ($numberofmochilds > 0) {
525 $label = $langs->trans("DeleteMoChild", '('.strval($numberofmochilds).')');
526 } else {
527 $label = $langs->trans("DeleteMoChild");
528 }
529
530 $formquestion = array(
531 array('type' => 'checkbox', 'name' => 'deletechilds', 'label' => $label, 'value' => 0),
532 array(
533 'label' => $langs->trans('MoCancelConsumedAndProducedLines'),
534 'name' => 'alsoCancelConsumedAndProducedLines',
535 'type' => 'checkbox',
536 'value' => !getDolGlobalString('MO_ALSO_CANCEL_CONSUMED_AND_PRODUCED_LINES_BY_DEFAULT') ? 0 : 1
537 )
538 );
539 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteMo'), $langs->trans('ConfirmDeleteMo'), 'confirm_delete', $formquestion, 0, 1);
540 }
541 // Confirmation to delete line
542 if ($action == 'deleteline') {
543 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
544 }
545
546 // Confirmation of validation
547 if ($action == 'validate') {
548 // We check that object has a temporary ref
549 $ref = substr($object->ref, 1, 4);
550 if ($ref == 'PROV') {
551 $object->fetch_product();
552 $numref = $object->getNextNumRef($object->product);
553 } else {
554 $numref = $object->ref;
555 }
556
557 $text = $langs->trans('ConfirmValidateMo', $numref);
558 /*if (isModEnabled('notification'))
559 {
560 require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php';
561 $notify = new Notify($db);
562 $text .= '<br>';
563 $text .= $notify->confirmMessage('BOM_VALIDATE', $object->socid, $object);
564 }*/
565
566 $formquestion = array();
567 if (isModEnabled('mrp')) {
568 $langs->load("mrp");
569 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
570 $formproduct = new FormProduct($db);
571 $forcecombo = 0;
572 if ($conf->browser->name == 'ie') {
573 $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
574 }
575 $formquestion = array(
576 // 'text' => $langs->trans("ConfirmClone"),
577 // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
578 // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
579 );
580 }
581
582 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('Validate'), $text, 'confirm_validate', $formquestion, 0, 1, 220);
583 }
584
585 // Confirmation to cancel
586 if ($action == 'cancel') {
587 $formquestion = array(
588 array(
589 'label' => $langs->trans('MoCancelConsumedAndProducedLines'),
590 'name' => 'alsoCancelConsumedAndProducedLines',
591 'type' => 'checkbox',
592 'value' => 0
593 ),
594 );
595 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('CancelMo'), $langs->trans('ConfirmCancelMo'), 'confirm_cancel', $formquestion, 0, 1);
596 }
597
598 // Clone confirmation
599 if ($action == 'clone') {
600 // Create an array for form
601 $formquestion = array();
602 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneMo', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
603 }
604
605 // Call Hook formConfirm
606 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
607 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
608 if (empty($reshook)) {
609 $formconfirm .= $hookmanager->resPrint;
610 } elseif ($reshook > 0) {
611 $formconfirm = $hookmanager->resPrint;
612 }
613
614 // Print form confirm
615 print $formconfirm;
616
617
618 // Object card
619 // ------------------------------------------------------------
620 $linkback = '<a href="'.dol_buildpath('/mrp/mo_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
621
622 $morehtmlref = '<div class="refidno">';
623 /*
624 // Ref bis
625 $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', 0, 1);
626 $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', null, null, '', 1);*/
627 // Thirdparty
628 if (is_object($object->thirdparty)) {
629 $morehtmlref .= $object->thirdparty->getNomUrl(1, 'customer');
630 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
631 $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$object->thirdparty->id.'&search_societe='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
632 }
633 }
634 // Project
635 if (isModEnabled('project')) {
636 $langs->load("projects");
637 if (is_object($object->thirdparty)) {
638 $morehtmlref .= '<br>';
639 }
640 if ($permissiontoadd) {
641 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
642 if ($action != 'classify') {
643 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
644 }
645 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
646 } else {
647 if (!empty($object->fk_project)) {
648 $proj = new Project($db);
649 $proj->fetch($object->fk_project);
650 $morehtmlref .= $proj->getNomUrl(1);
651 if ($proj->title) {
652 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
653 }
654 }
655 }
656 }
657 $morehtmlref .= '</div>';
658
659
660 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
661
662
663 print '<div class="fichecenter">';
664 print '<div class="fichehalfleft">';
665 print '<div class="underbanner clearboth"></div>';
666 print '<table class="border centpercent tableforfield">'."\n";
667
668 //Mo Parent
669 $mo_parent = $object->getMoParent();
670 if (is_object($mo_parent)) {
671 print '<tr class="field_fk_mo_parent">';
672 print '<td class="titlefield fieldname_fk_mo_parent">' . $langs->trans('ParentMo') . '</td>';
673 print '<td class="valuefield fieldname_fk_mo_parent">' .$mo_parent->getNomUrl(1).'</td>';
674 print '</tr>';
675 }
676
677 // Common attributes
678 $keyforbreak = 'fk_warehouse';
679 unset($object->fields['fk_project']);
680 unset($object->fields['fk_soc']);
681 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
682
683 // Other attributes
684 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
685
686 print '</table>';
687 print '</div>';
688 print '</div>';
689
690 print '<div class="clearboth"></div>';
691
692 print dol_get_fiche_end();
693
694
695 /*
696 * Lines
697 */
698
699 if (!empty($object->table_element_line)) {
700 // Show object lines
701 //$result = $object->getLinesArray();
702 $object->fetchLines();
703
704 print ' <form name="addproduct" id="addproduct" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.(($action != 'editline') ? '' : '#line_'.GETPOSTINT('lineid')).'" method="POST">
705 <input type="hidden" name="token" value="' . newToken().'">
706 <input type="hidden" name="action" value="' . (($action != 'editline') ? 'addline' : 'updateline').'">
707 <input type="hidden" name="mode" value="">
708 <input type="hidden" name="page_y" value="">
709 <input type="hidden" name="id" value="' . $object->id.'">
710 ';
711
712 /*if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
713 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
714 }*/
715
716 if (!empty($object->lines)) {
717 print '<div class="div-table-responsive-no-min">';
718 print '<table id="tablelines" class="noborder noshadow" width="100%">';
719
720 print '<tr class="liste_titre">';
721 print '<td class="liste_titre">'.$langs->trans("Summary").'</td>';
722 print '<td></td>';
723 print '</tr>';
724
725 print '<tr class="oddeven">';
726 print '<td>'.$langs->trans("ProductsToConsume").'</td>';
727 print '<td>';
728 if (!empty($object->lines)) {
729 $i = 0;
730 foreach ($object->lines as $line) {
731 if ($line->role == 'toconsume') {
732 if ($i) {
733 print ', ';
734 }
735 $tmpproduct = new Product($db);
736 $tmpproduct->fetch($line->fk_product);
737 print $tmpproduct->getNomUrl(1);
738 $i++;
739 }
740 }
741 }
742 print '</td>';
743 print '</tr>';
744
745 print '<tr class="oddeven">';
746 print '<td>'.$langs->trans("ProductsToProduce").'</td>';
747 print '<td>';
748 if (!empty($object->lines)) {
749 $i = 0;
750 foreach ($object->lines as $line) {
751 if ($line->role == 'toproduce') {
752 if ($i) {
753 print ', ';
754 }
755 $tmpproduct = new Product($db);
756 $tmpproduct->fetch($line->fk_product);
757 print $tmpproduct->getNomUrl(1);
758 $i++;
759 }
760 }
761 }
762 print '</td>';
763 print '</tr>';
764
765 print '</table>';
766 print '</div>';
767 }
768
769 print "</form>\n";
770 }
771
772
773 // Buttons for actions
774
775 if ($action != 'presend' && $action != 'editline') {
776 print '<div class="tabsAction">'."\n";
777 $parameters = array();
778 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
779 if ($reshook < 0) {
780 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
781 }
782
783 if (empty($reshook)) {
784 // Send
785 //if (empty($user->socid)) {
786 // print '<a class="butAction" href="' . $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=presend&mode=init#formmailbeforetitle">' . $langs->trans('SendMail') . '</a>'."\n";
787 //}
788
789 // Back to draft
790 if ($object->status == $object::STATUS_VALIDATED) {
791 if ($permissiontoadd) {
792 // TODO Add test that production has not started
793 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=confirm_setdraft&confirm=yes&token='.newToken().'">'.$langs->trans("SetToDraft").'</a>';
794 }
795 }
796
797 // Modify
798 if ($object->status == $object::STATUS_DRAFT) {
799 if ($permissiontoadd) {
800 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a>'."\n";
801 } else {
802 print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans('Modify').'</a>'."\n";
803 }
804 }
805
806 // Validate
807 if ($object->status == $object::STATUS_DRAFT) {
808 if ($permissiontoadd) {
809 if (empty($object->table_element_line) || (is_array($object->lines) && count($object->lines) > 0)) {
810 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=validate&token='.newToken().'">'.$langs->trans("Validate").'</a>';
811 } else {
812 $langs->load("errors");
813 print '<a class="butActionRefused" href="" title="'.$langs->trans("ErrorAddAtLeastOneLineFirst").'">'.$langs->trans("Validate").'</a>';
814 }
815 }
816 }
817
818 // Clone
819 if ($permissiontoadd) {
820 print dolGetButtonAction($langs->trans("ToClone"), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.(!empty($object->socid) ? '&socid='.$object->socid : "").'&action=clone&token='.newToken().'&object=mo', 'clone', $permissiontoadd);
821 }
822
823 // Cancel - Reopen
824 if ($permissiontoadd) {
825 if ($object->status == $object::STATUS_VALIDATED || $object->status == $object::STATUS_INPROGRESS) {
826 $arrayproduced = $object->fetchLinesLinked('produced', 0);
827 $nbProduced = 0;
828 foreach ($arrayproduced as $lineproduced) {
829 $nbProduced += $lineproduced['qty'];
830 }
831 if ($nbProduced > 0) { // If production has started, we can close it
832 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_produced&confirm=yes&token='.newToken().'">'.$langs->trans("Close").'</a>'."\n";
833 } else {
834 print '<a class="butActionRefused" href="#" title="'.$langs->trans("GoOnTabProductionToProduceFirst", $langs->transnoentitiesnoconv("Production")).'">'.$langs->trans("Close").'</a>'."\n";
835 }
836
837 print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=cancel&token='.newToken().'">'.$langs->trans("Cancel").'</a>'."\n";
838 }
839
840 if ($object->status == $object::STATUS_PRODUCED || $object->status == $object::STATUS_CANCELED) {
841 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen&confirm=yes&token='.newToken().'">'.$langs->trans("ReOpen").'</a>'."\n";
842 }
843 }
844
845 // Delete
846 print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
847 }
848 print '</div>'."\n";
849 }
850
851
852 // Select mail models is same action as presend
853 if (GETPOST('modelselected')) {
854 $action = 'presend';
855 }
856
857 if ($action != 'presend') {
858 print '<div class="fichecenter"><div class="fichehalfleft">';
859 print '<a name="builddoc"></a>'; // ancre
860
861 // Documents
862 $objref = dol_sanitizeFileName($object->ref);
863 $relativepath = $objref.'/'.$objref.'.pdf';
864 $filedir = $conf->mrp->dir_output.'/'.$objref;
865 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
866 $genallowed = $user->hasRight('mrp', 'read'); // If you can read, you can build the PDF to read content
867 $delallowed = $user->hasRight("mrp", "creer"); // If you can create/edit, you can remove a file on card
868 print $formfile->showdocuments('mrp:mo', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $mysoc->default_lang);
869
870 // Show links to link elements
871 $tmparray = $form->showLinkToObjectBlock($object, array(), array('mo'), 1);
872 $linktoelem = $tmparray['linktoelem'];
873 $htmltoenteralink = $tmparray['htmltoenteralink'];
874 print $htmltoenteralink;
875
876 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, false);
877
878
879 print '</div><div class="fichehalfright">';
880
881 $MAXEVENT = 10;
882
883 $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/mrp/mo_agenda.php?id='.$object->id);
884
885 // List of actions on element
886 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
887 $formactions = new FormActions($db);
888 $somethingshown = $formactions->showactions($object, $object->element, $socid, 1, '', $MAXEVENT, '', $morehtmlcenter);
889
890 print '</div></div>';
891 }
892
893 //Select mail models is same action as presend
894 if (GETPOST('modelselected')) {
895 $action = 'presend';
896 }
897
898 // Presend form
899 $modelmail = 'mo';
900 $defaulttopic = 'InformationMessage';
901 $diroutput = $conf->mrp->dir_output;
902 $trackid = 'mo'.$object->id;
903
904 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
905}
906
907// End of page
908llxFooter();
909$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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.
Definition wrapper.php:71
mrpCollapseBomManagement()
Manage collapse bom display.
Definition bom.lib.php:153
Class for BOM.
Definition bom.class.php:42
Class for BOMLine.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage building of HTML components.
Class for Mo.
Definition mo.class.php:34
Class MoLine.
Class to manage products or services.
Class to manage projects.
Class to manage translations.
llxFooter()
Footer empty.
Definition document.php:107
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)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
moPrepareHead($object)
Prepare array of tabs for Mo.
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.