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