26 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.
'/bom/class/bom.class.php';
30 require_once DOL_DOCUMENT_ROOT.
'/bom/lib/bom.lib.php';
33 $langs->loadLangs(array(
"mrp",
"other"));
38 $action =
GETPOST(
'action',
'aZ09');
39 $confirm =
GETPOST(
'confirm',
'alpha');
40 $cancel =
GETPOST(
'cancel',
'aZ09');
41 $contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'bomcard';
42 $backtopage =
GETPOST(
'backtopage',
'alpha');
43 $lineid =
GETPOST(
'lineid',
'int');
46 $hidedetails = (
GETPOST(
'hidedetails',
'int') ?
GETPOST(
'hidedetails',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0));
47 $hidedesc = (
GETPOST(
'hidedesc',
'int') ?
GETPOST(
'hidedesc',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0));
48 $hideref = (
GETPOST(
'hideref',
'int') ?
GETPOST(
'hideref',
'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0));
51 $object =
new BOM($db);
53 $diroutputmassaction = $conf->bom->dir_output.
'/temp/massgeneration/'.$user->id;
54 $hookmanager->initHooks(array(
'bomcard',
'globalcard'));
56 $extrafields->fetch_name_optionals_label($object->table_element);
57 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element,
'',
'search_');
60 $search_all =
GETPOST(
"search_all",
'alpha');
62 foreach ($object->fields as $key => $val)
64 if (
GETPOST(
'search_'.$key,
'alpha')) $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
67 if (empty($action) && empty($id) && empty($ref)) $action =
'view';
70 include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
78 $permissionnote = $user->rights->bom->write;
79 $permissiondellink = $user->rights->bom->write;
80 $permissiontoadd = $user->rights->bom->write;
81 $permissiontodelete = $user->rights->bom->delete || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
82 $upload_dir = $conf->bom->multidir_output[isset($object->entity) ? $object->entity : 1];
89 $parameters = array();
90 $reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
91 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
97 $backurlforlist = DOL_URL_ROOT.
'/bom/bom_list.php';
99 if (empty($backtopage) || ($cancel && empty($id))) {
100 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
101 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) $backtopage = $backurlforlist;
102 else $backtopage =
dol_buildpath(
'/bom/bom_card.php', 1).
'?id='.($id > 0 ? $id :
'__ID__');
106 $triggermodname =
'BOM_MODIFY';
109 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
112 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
115 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
121 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
124 $triggersendname =
'BOM_SENTBYMAIL';
125 $autocopy =
'MAIN_MAIL_AUTOCOPY_BOM_TO';
126 $trackid =
'bom'.$object->id;
127 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
130 if ($action ==
'addline' && $user->rights->bom->write)
132 $langs->load(
'errors');
136 $idprod = (int)
GETPOST(
'idprod',
'int');
139 $disable_stock_change =
GETPOST(
'disable_stock_change',
'int');
143 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')), null,
'errors');
146 if (!($idprod > 0)) {
147 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Product')), null,
'errors');
151 if ($object->fk_product == $idprod) {
152 setEventMessages($langs->trans(
'TheProductXIsAlreadyTheProductToProduce'), null,
'errors');
159 $bomline->fk_bom = $id;
160 $bomline->fk_product = $idprod;
161 $bomline->qty = $qty;
162 $bomline->qty_frozen = (int) $qty_frozen;
163 $bomline->disable_stock_change = (int) $disable_stock_change;
164 $bomline->efficiency = $efficiency;
167 $rangmax = $object->line_max(0);
168 $ranktouse = $rangmax + 1;
170 $bomline->position = ($ranktouse + 1);
172 $result = $bomline->create($user);
177 unset($_POST[
'idprod']);
178 unset($_POST[
'qty']);
179 unset($_POST[
'qty_frozen']);
180 unset($_POST[
'disable_stock_change']);
182 $object->fetchLines();
184 $object->calculateCosts();
190 if ($action ==
'updateline' && $user->rights->bom->write)
192 $langs->load(
'errors');
198 $disable_stock_change =
GETPOST(
'disable_stock_change',
'int');
202 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')), null,
'errors');
207 $bomline->fetch($lineid);
208 $bomline->qty = $qty;
209 $bomline->qty_frozen = (int) $qty_frozen;
210 $bomline->disable_stock_change = (int) $disable_stock_change;
211 $bomline->efficiency = $efficiency;
213 $result = $bomline->update($user);
219 unset($_POST[
'idprod']);
220 unset($_POST[
'qty']);
221 unset($_POST[
'qty_frozen']);
222 unset($_POST[
'disable_stock_change']);
224 $object->fetchLines();
226 $object->calculateCosts();
236 $form =
new Form($db);
242 print '<script type="text/javascript" language="javascript">
243 jQuery(document).ready(function() {
244 function init_myfunc()
246 jQuery("#myid").removeAttr(\'disabled\');
247 jQuery("#myid").attr(\'disabled\',\'disabled\');
250 jQuery("#mybutton").click(function() {
258 if ($action ==
'create')
262 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
263 print
'<input type="hidden" name="token" value="'.newToken().
'">';
264 print
'<input type="hidden" name="action" value="add">';
265 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
269 print
'<table class="border centpercent tableforfieldcreate">'.
"\n";
272 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_add.tpl.php';
275 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
277 print
'</table>'.
"\n";
281 print
'<div class="center">';
282 print
'<input type="submit" class="button" name="add" value="'.dol_escape_htmltag($langs->trans(
"Create")).
'">';
284 print
'<input type="'.($backtopage ?
"submit" :
"button").
'" class="button button-cancel" name="cancel" value="'.
dol_escape_htmltag($langs->trans(
"Cancel")).
'"'.($backtopage ?
'' :
' onclick="javascript:history.go(-1)"').
'>';
291 if (($id || $ref) && $action ==
'edit')
295 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
296 print
'<input type="hidden" name="token" value="'.newToken().
'">';
297 print
'<input type="hidden" name="action" value="update">';
298 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
299 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
305 print
'<table class="border centpercent tableforfieldedit">'.
"\n";
308 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_edit.tpl.php';
311 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_edit.tpl.php';
317 print
'<div class="center"><input type="submit" class="button button-save" name="save" value="'.$langs->trans(
"Save").
'">';
318 print
' <input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
325 if ($object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create')))
327 $res = $object->fetch_optionals();
335 if ($action ==
'delete')
337 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'DeleteBillOfMaterials'), $langs->trans(
'ConfirmDeleteBillOfMaterials'),
'confirm_delete',
'', 0, 1);
340 if ($action ==
'deleteline')
342 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
346 if ($action ==
'validate')
349 $ref = substr($object->ref, 1, 4);
350 if ($ref ==
'PROV') {
351 $object->fetch_product();
352 $numref = $object->getNextNumRef($object->product);
354 $numref = $object->ref;
357 $text = $langs->trans(
'ConfirmValidateBom', $numref);
366 $formquestion = array();
367 if (!empty($conf->bom->enabled))
370 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
373 if ($conf->browser->name ==
'ie') $forcecombo = 1;
374 $formquestion = array(
381 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'Validate'), $text,
'confirm_validate', $formquestion, 0, 1, 220);
385 if ($action ==
'close')
387 $text = $langs->trans(
'ConfirmCloseBom', $object->ref);
396 $formquestion = array();
397 if (!empty($conf->bom->enabled))
400 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
403 if ($conf->browser->name ==
'ie') $forcecombo = 1;
404 $formquestion = array(
411 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'Close'), $text,
'confirm_close', $formquestion, 0, 1, 220);
415 if ($action ==
'reopen')
417 $text = $langs->trans(
'ConfirmReopenBom', $object->ref);
426 $formquestion = array();
427 if (!empty($conf->bom->enabled))
430 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
433 if ($conf->browser->name ==
'ie') $forcecombo = 1;
434 $formquestion = array(
441 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ReOpen'), $text,
'confirm_reopen', $formquestion, 0, 1, 220);
445 if ($action ==
'clone') {
447 $formquestion = array();
448 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneBillOfMaterials', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
452 if ($action ==
'setdraft')
454 $text = $langs->trans(
'ConfirmSetToDraft', $object->ref);
456 $formquestion = array();
457 $formconfirm = $form->formconfirm(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'SetToDraft'), $text,
'confirm_setdraft', $formquestion, 0, 1, 220);
461 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
462 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
463 if (empty($reshook)) $formconfirm .= $hookmanager->resPrint;
464 elseif ($reshook > 0) $formconfirm = $hookmanager->resPrint;
472 $linkback = '<a href="'.
dol_buildpath('/bom/bom_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
474 $morehtmlref = '<div class="refidno">';
512 $morehtmlref .= '</div>';
515 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
518 print '<div class="fichecenter">';
519 print '<div class="fichehalfleft">';
520 print '<div class="underbanner clearboth"></div>';
521 print '<table class="border centpercent tableforfield">'."\
n";
524 $keyforbreak = 'duration';
525 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
527 print '<tr><td>'.$form->textwithpicto($langs->trans("TotalCost"), $langs->trans("BOMTotalCost")).'</td><td>'.
price($object->total_cost).'</td></tr>';
528 print '<tr><td>'.$langs->trans("UnitCost").'</td><td>'.
price($object->unit_cost).'</td></tr>';
531 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
537 print '<div class="clearboth"></div>';
547 if (!empty($object->table_element_line))
549 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'#addline' :
'').
'" method="POST">
550 <input type="hidden" name="token" value="' .
newToken().
'">
551 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
552 <input type="hidden" name="mode" value="">
553 <input type="hidden" name="id" value="' . $object->id.
'">
556 if (!empty($conf->use_javascript_ajax) && $object->status == 0) {
557 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
560 print
'<div class="div-table-responsive-no-min">';
561 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline'))
563 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
566 if (!empty($object->lines))
568 $object->printObjectLines($action, $mysoc, null,
GETPOST(
'lineid',
'int'), 1,
'/bom/tpl');
572 if ($object->status == 0 && $permissiontoadd && $action !=
'selectlines')
574 if ($action !=
'editline')
577 $object->formAddObjectLine(1, $mysoc, null,
'/bom/tpl');
579 $parameters = array();
580 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
584 if (!empty($object->lines) || ($object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline'))
596 if ($action !=
'presend' && $action !=
'editline') {
597 print
'<div class="tabsAction">'.
"\n";
598 $parameters = array();
599 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
600 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
610 if ($object->status == $object::STATUS_VALIDATED)
612 if ($permissiontoadd)
614 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=setdraft&token='.
newToken().
'">'.$langs->trans(
"SetToDraft").
'</a>';
619 if ($object->status == $object::STATUS_DRAFT)
621 if ($permissiontoadd)
623 print
'<a class="butAction" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=edit&token='.
newToken().
'">'.$langs->trans(
"Modify").
'</a>'.
"\n";
625 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'Modify').
'</a>'.
"\n";
630 if ($object->status == $object::STATUS_DRAFT)
632 if ($permissiontoadd)
634 if (is_array($object->lines) && count($object->lines) > 0)
636 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=validate&token='.
newToken().
'">'.$langs->trans(
"Validate").
'</a>';
638 $langs->load(
"errors");
639 print
'<a class="butActionRefused" href="" title="'.$langs->trans(
"ErrorAddAtLeastOneLineFirst").
'">'.$langs->trans(
"Validate").
'</a>';
645 if ($permissiontoadd && $object->status == $object::STATUS_CANCELED)
647 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=reopen">'.$langs->trans(
"ReOpen").
'</a>';
651 if ($conf->mrp->enabled)
653 if ($object->status == $object::STATUS_VALIDATED && !empty($user->rights->mrp->write))
655 print
'<a class="butAction" href="'.DOL_URL_ROOT.
'/mrp/mo_card.php?action=create&fk_bom='.$object->id.
'&backtopageforcancel='.urlencode(
$_SERVER[
"PHP_SELF"].
'?id='.$object->id).
'">'.$langs->trans(
"CreateMO").
'</a>';
660 if ($permissiontoadd)
662 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=clone&object=bom">'.$langs->trans(
"ToClone").
'</a>';
666 if ($permissiontoadd && $object->status == $object::STATUS_VALIDATED)
668 print
'<a class="butActionDelete" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=close">'.$langs->trans(
"Disable").
'</a>';
685 if ($permissiontodelete)
687 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete&token='.
newToken().
'">'.$langs->trans(
'Delete').
'</a>'.
"\n";
689 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'Delete').
'</a>'.
"\n";
697 if (
GETPOST(
'modelselected')) {
701 if ($action !=
'presend')
703 print
'<div class="fichecenter"><div class="fichehalfleft">';
704 print
'<a name="builddoc"></a>';
708 $relativepath = $objref.
'/'.$objref.
'.pdf';
709 $filedir = $conf->bom->dir_output.
'/'.$objref;
710 $urlsource =
$_SERVER[
"PHP_SELF"].
"?id=".$object->id;
711 $genallowed = $user->rights->bom->read;
712 $delallowed = $user->rights->bom->write;
713 print $formfile->showdocuments(
'bom', $objref, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $langs->defaultlang);
716 $linktoelem = $form->showLinkToObjectBlock($object, null, array(
'bom'));
717 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
720 print
'</div><div class="fichehalfright"><div class="ficheaddleft">';
724 $morehtmlright =
'<a href="'.dol_buildpath(
'/bom/bom_agenda.php', 1).
'?id='.$object->id.
'">';
725 $morehtmlright .= $langs->trans(
"SeeAll");
726 $morehtmlright .=
'</a>';
729 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
731 $somethingshown =
$formactions->showactions($object,
'bom', $socid, 1,
'', $MAXEVENT,
'', $morehtmlright);
733 print
'</div></div></div>';
737 if (
GETPOST(
'modelselected')) $action =
'presend';
741 $defaulttopic =
'InformationMessage';
742 $diroutput = $conf->bom->dir_output;
743 $trackid =
'bom'.$object->id;
745 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
GETPOST($paramname, $check= 'alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action== 'set') elseif($action== 'specimen') elseif($action== 'setmodel') elseif($action== 'del') elseif($action== 'setdoc') $formactions
View.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
price($amount, $form=0, $outlangs= '', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code= '')
Function to format a value into an amount for visual output Function used into PDF and HTML pages...
setEventMessages($mesg, $mesgs, $style= 'mesgs', $messagekey= '')
Set event messages in dol_events session object.
bomPrepareHead($object)
Prepare array of tabs for BillOfMaterials.
load_fiche_titre($titre, $morehtmlright= '', $picto= 'generic', $pictoisfullpath=0, $id= '', $morecssontable= '', $morehtmlcenter= '')
Load a title with picto.
price2num($amount, $rounding= '', $option=0)
Function that return a number with universal decimal format (decimal separator is '...
dol_sanitizeFileName($str, $newstr= '_', $unaccent=1)
Clean a string to use it as a file name.
print $_SERVER["PHP_SELF"]
Edit parameters.
dol_get_fiche_head($links=array(), $active= '', $title= '', $notab=0, $picto= '', $pictoisfullpath=0, $morehtmlright= '', $morecss= '', $limittoshow=0, $moretabssuffix= '')
Show tabs of a record.
print
Draft customers invoices.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
print $_SERVER["PHP_SELF"] n
Edit parameters.
dol_banner_tab($object, $paramid, $morehtml= '', $shownav=1, $fieldid= 'rowid', $fieldref= 'ref', $morehtmlref= '', $moreparam= '', $nodbprefix=0, $morehtmlleft= '', $morehtmlstatus= '', $onlybanner=0, $morehtmlright= '')
Show tab footer of a card.
if(!defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN'
Draft customers invoices.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $keepmoretags= '', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields...