28require
'../main.inc.php';
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.
'/product/class/html.formproduct.class.php';
33require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
34require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/mrp/class/mo.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/mrp/lib/mrp_mo.lib.php';
42$langs->loadLangs(array(
"mrp",
"stocks",
"other"));
47$action =
GETPOST(
'action',
'aZ09');
48$confirm =
GETPOST(
'confirm',
'alpha');
49$cancel =
GETPOST(
'cancel',
'aZ09');
50$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'mostockmovement';
51$backtopage =
GETPOST(
'backtopage',
'alpha');
52$optioncss =
GETPOST(
'optioncss',
'aZ');
53$massaction =
GETPOST(
'massaction',
'aZ09');
61$search_ref =
GETPOST(
'search_ref',
'alpha');
62$search_movement =
GETPOST(
"search_movement",
'alpha');
63$search_product_ref = trim(
GETPOST(
"search_product_ref",
'alpha'));
64$search_product = trim(
GETPOST(
"search_product",
'alpha'));
65$search_warehouse = trim(
GETPOST(
"search_warehouse",
'alpha'));
66$search_inventorycode = trim(
GETPOST(
"search_inventorycode",
'alpha'));
67$search_user = trim(
GETPOST(
"search_user",
'alpha'));
68$search_batch = trim(
GETPOST(
"search_batch",
'alpha'));
69$search_qty = trim(
GETPOST(
"search_qty",
'alpha'));
70$search_type_mouvement =
GETPOST(
'search_type_mouvement',
"intcomma");
73$page = GETPOSTISSET(
'pageplusone') ? (
GETPOST(
'pageplusone') - 1) :
GETPOSTINT(
"page");
74$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
75$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
76if (empty($page) || $page == -1) {
79$offset = $limit * $page;
81 $sortfield =
"m.datem";
90$diroutputmassaction = $conf->mrp->dir_output.
'/temp/massgeneration/'.$user->id;
91$hookmanager->initHooks(array(
'mocard',
'globalcard'));
94$extrafields->fetch_name_optionals_label(
$object->table_element);
96$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
99$search_all = trim(
GETPOST(
"search_all",
'alpha'));
101foreach (
$object->fields as $key => $val) {
102 if (
GETPOST(
'search_'.$key,
'alpha')) {
103 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
107if (empty($action) && empty($id) && empty($ref)) {
112include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
117$isdraft = ((
$object->status == $object::STATUS_DRAFT) ? 1 : 0);
124 'm.rowid' => array(
'label' =>
"Ref",
'checked' => 1,
'position' => 1),
125 'm.datem' => array(
'label' =>
"Date",
'checked' => 1,
'position' => 2),
126 'p.ref' => array(
'label' =>
"ProductRef",
'checked' => 1,
'css' =>
'maxwidth100',
'position' => 3),
127 'p.label' => array(
'label' =>
"ProductLabel",
'checked' => 0,
'position' => 5),
128 'm.batch' => array(
'label' =>
"BatchNumberShort",
'checked' => 1,
'position' => 8,
'enabled' => (isModEnabled(
'productbatch'))),
129 'pl.eatby' => array(
'label' =>
"EatByDate",
'checked' => 0,
'position' => 9,
'enabled' => (isModEnabled(
'productbatch'))),
130 'pl.sellby' => array(
'label' =>
"SellByDate",
'checked' => 0,
'position' => 10,
'enabled' => (isModEnabled(
'productbatch'))),
131 'e.ref' => array(
'label' =>
"Warehouse",
'checked' => 1,
'position' => 100,
'enabled' => (!($id > 0))),
132 'm.fk_user_author' => array(
'label' =>
"Author",
'checked' => 0,
'position' => 120),
133 'm.inventorycode' => array(
'label' =>
"InventoryCodeShort",
'checked' => 1,
'position' => 130),
134 'm.label' => array(
'label' =>
"MovementLabel",
'checked' => 1,
'position' => 140),
135 'm.type_mouvement' => array(
'label' =>
"TypeMovement",
'checked' => 0,
'position' => 150),
136 'origin' => array(
'label' =>
"Origin",
'checked' => 1,
'position' => 155),
137 'm.fk_projet' => array(
'label' =>
'Project',
'checked' => 0,
'position' => 180),
138 'm.value' => array(
'label' =>
"Qty",
'checked' => 1,
'position' => 200),
139 'm.price' => array(
'label' =>
"UnitPurchaseValue",
'checked' => 0,
'position' => 210)
144 unset($arrayfields[
'pl.sellby']);
147 unset($arrayfields[
'pl.eatby']);
149$objectlist->fields =
dol_sort_array($objectlist->fields,
'position');
153$permissionnote = $user->hasRight(
'mrp',
'write');
154$permissiondellink = $user->hasRight(
'mrp',
'write');
155$permissiontoadd = $user->hasRight(
'mrp',
'write');
156$permissiontodelete = $user->hasRight(
'mrp',
'delete') || ($permissiontoadd && isset(
$object->status) &&
$object->status == $object::STATUS_DRAFT);
157$upload_dir = $conf->mrp->multidir_output[isset(
$object->entity) ?
$object->entity : 1];
159$permissiontoproduce = $permissiontoadd;
160$permissiontoupdatecost = $user->hasRight(
'bom',
'write');
162if ($permissiontoupdatecost) {
163 $arrayfields[
'm.price'][
'enabled'] = 1;
166$arrayofselected = array();
173if (
GETPOST(
'cancel',
'alpha')) {
177if (!
GETPOST(
'confirmmassaction',
'alpha') && $massaction !=
'presend' && $massaction !=
'confirm_presend') {
181$parameters = array();
182$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
187include DOL_DOCUMENT_ROOT.
'/core/actions_changeselectedfields.inc.php';
190if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
194 $search_movement =
"";
195 $search_type_mouvement =
"";
196 $search_inventorycode =
"";
197 $search_product_ref =
"";
198 $search_product =
"";
199 $search_warehouse =
"";
205 $search_array_options = array();
208if (empty($reshook)) {
213 if (empty($backtopage) || ($cancel && empty($id))) {
215 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
216 $backtopage = $backurlforlist;
218 $backtopage = DOL_URL_ROOT.
'/mrp/mo_production.php?id='.($id > 0 ? $id :
'__ID__');
221 $triggermodname =
'MO_MODIFY';
224 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
227 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
230 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
233 $triggersendname =
'MO_SENTBYMAIL';
234 $autocopy =
'MAIN_MAIL_AUTOCOPY_MO_TO';
235 $trackid =
'mo'.$object->id;
236 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
241 if ($action ==
'set_thirdparty' && $permissiontoadd) {
242 $object->setValueFrom(
'fk_soc',
GETPOSTINT(
'fk_soc'),
'',
'',
'date',
'', $user, $triggermodname);
244 if ($action ==
'classin' && $permissiontoadd) {
248 if ($action ==
'confirm_reopen') {
249 $result =
$object->setStatut($object::STATUS_INPROGRESS, 0,
'',
'MRP_REOPEN');
259$form =
new Form($db);
262$productstatic =
new Product($db);
264$warehousestatic =
new Entrepot($db);
265$userstatic =
new User($db);
267$title = $langs->trans(
'Mo');
268$help_url =
'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication|DE:Modul_Fertigungsauftrag';
270llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-mrp page-card_movements');
273if (
$object->id > 0 && (empty($action) || ($action !=
'edit' && $action !=
'create'))) {
274 $res =
$object->fetch_thirdparty();
275 $res =
$object->fetch_optionals();
284 if ($action ==
'delete') {
285 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteMo'), $langs->trans(
'ConfirmDeleteMo'),
'confirm_delete',
'', 0, 1);
288 if ($action ==
'deleteline') {
289 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
292 if ($action ==
'clone') {
294 $formquestion = array();
295 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneMo',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
299 if ($action ==
'xxx') {
300 $formquestion = array();
311 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'XXX'), $text,
'confirm_xxx', $formquestion, 0, 1, 220);
315 $parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
316 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
317 if (empty($reshook)) {
318 $formconfirm .= $hookmanager->resPrint;
319 } elseif ($reshook > 0) {
320 $formconfirm = $hookmanager->resPrint;
329 $linkback =
'<a href="'.dol_buildpath(
'/mrp/mo_list.php', 1).
'?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
331 $morehtmlref =
'<div class="refidno">';
337 if (is_object(
$object->thirdparty)) {
338 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'customer');
340 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/commande/list.php?socid='.
$object->thirdparty->id.
'&search_societe='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherOrders").
'</a>)';
344 if (isModEnabled(
'project')) {
345 $langs->load(
"projects");
346 if (is_object(
$object->thirdparty)) {
347 $morehtmlref .=
'<br>';
349 if ($permissiontoadd) {
350 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
351 if ($action !=
'classify') {
352 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
354 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
356 if (!empty(
$object->fk_project)) {
358 $proj->fetch(
$object->fk_project);
359 $morehtmlref .= $proj->getNomUrl(1);
361 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
366 $morehtmlref .=
'</div>';
369 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
372 print
'<div class="fichecenter">';
373 print
'<div class="fichehalfleft">';
374 print
'<div class="underbanner clearboth"></div>';
375 print
'<table class="border centpercent tableforfield">'.
"\n";
378 $keyforbreak =
'fk_warehouse';
379 unset(
$object->fields[
'fk_project']);
380 unset(
$object->fields[
'fk_soc']);
381 include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
384 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
390 print
'<div class="clearboth"></div>';
428 $sql =
"SELECT p.rowid, p.ref as product_ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.entity,";
429 $sql .=
" e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu,";
430 $sql .=
" m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
431 $sql .=
" m.batch, m.price,";
432 $sql .=
" m.type_mouvement,";
433 $sql .=
" pl.rowid as lotid, pl.eatby, pl.sellby,";
434 $sql .=
" u.login, u.photo, u.lastname, u.firstname";
436 if (!empty($extrafields->attributes[$objectlist->table_element][
'label'])) {
437 foreach ($extrafields->attributes[$objectlist->table_element][
'label'] as $key => $val) {
438 $sql .= ($extrafields->attributes[$objectlist->table_element][
'type'][$key] !=
'separate' ?
", ef.".$key.
" as options_".$key :
'');
442 $parameters = array();
443 $reshook = $hookmanager->executeHooks(
'printFieldListSelect', $parameters);
444 $sql .= $hookmanager->resPrint;
445 $sql .=
" FROM ".MAIN_DB_PREFIX.
"entrepot as e,";
446 $sql .=
" ".MAIN_DB_PREFIX.
"product as p,";
447 $sql .=
" ".MAIN_DB_PREFIX.
"stock_mouvement as m";
448 if (!empty($extrafields->attributes[$objectlist->table_element]) && is_array($extrafields->attributes[$objectlist->table_element][
'label']) && count($extrafields->attributes[$objectlist->table_element][
'label'])) {
449 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.$objectlist->table_element.
"_extrafields as ef on (m.rowid = ef.fk_object)";
451 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON m.fk_user_author = u.rowid";
452 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
453 $sql .=
" WHERE m.fk_product = p.rowid";
454 $sql .=
" AND m.origintype = 'mo' AND m.fk_origin = ".(int)
$object->id;
456 $sql .=
" AND m.rowid = ".((int) $msid);
458 $sql .=
" AND m.fk_entrepot = e.rowid";
459 $sql .=
" AND e.entity IN (".getEntity(
'stock').
")";
461 $sql .=
" AND p.fk_product_type = 0";
464 if (!empty($search_ref)) {
467 if (!empty($search_movement)) {
470 if (!empty($search_inventorycode)) {
473 if (!empty($search_product_ref)) {
476 if (!empty($search_product)) {
479 if ($search_warehouse !=
'' && $search_warehouse !=
'-1') {
482 if (!empty($search_user)) {
483 $sql .=
natural_search(array(
'u.lastname',
'u.firstname',
'u.login'), $search_user);
485 if (!empty($search_batch)) {
488 if ($search_qty !=
'') {
491 if ($search_type_mouvement !=
'' && $search_type_mouvement !=
'-1') {
492 $sql .=
natural_search(
'm.type_mouvement', $search_type_mouvement, 2);
495 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_sql.tpl.php';
497 $parameters = array();
498 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters);
499 $sql .= $hookmanager->resPrint;
500 $sql .= $db->order($sortfield, $sortorder);
502 $nbtotalofrecords =
'';
504 $result = $db->query($sql);
505 $nbtotalofrecords = $db->num_rows($result);
506 if (($page * $limit) > $nbtotalofrecords) {
511 $sql .= $db->plimit($limit + 1, $offset);
513 $resql = $db->query($sql);
517 $num = $db->num_rows($resql);
520 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
521 $param .=
'&contextpage='.urlencode($contextpage);
523 if ($limit > 0 && $limit != $conf->liste_limit) {
524 $param .=
'&limit='.((int) $limit);
527 $param .=
'&id='.urlencode((
string) ($id));
529 if ($search_movement) {
530 $param .=
'&search_movement='.urlencode($search_movement);
532 if ($search_inventorycode) {
533 $param .=
'&search_inventorycode='.urlencode($search_inventorycode);
535 if ($search_type_mouvement) {
536 $param .=
'&search_type_mouvement='.urlencode($search_type_mouvement);
538 if ($search_product_ref) {
539 $param .=
'&search_product_ref='.urlencode($search_product_ref);
541 if ($search_product) {
542 $param .=
'&search_product='.urlencode($search_product);
545 $param .=
'&search_batch='.urlencode($search_batch);
547 if ($search_warehouse > 0) {
548 $param .=
'&search_warehouse='.urlencode($search_warehouse);
551 $param .=
'&search_user='.urlencode($search_user);
555 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_param.tpl.php';
558 $arrayofmassactions = array(
563 if (in_array($massaction, array(
'presend',
'predelete'))) {
564 $arrayofmassactions = array();
566 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
568 print
'<form method="POST" action="'.$_SERVER[
"PHP_SELF"].
'">';
569 if ($optioncss !=
'') {
570 print
'<input type="hidden" name="optioncss" value="'.$optioncss.
'">';
572 print
'<input type="hidden" name="token" value="'.newToken().
'">';
573 print
'<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
574 print
'<input type="hidden" name="action" value="list">';
575 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
576 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
577 print
'<input type="hidden" name="page" value="'.$page.
'">';
578 print
'<input type="hidden" name="contextpage" value="'.$contextpage.
'">';
580 print
'<input type="hidden" name="id" value="'.$id.
'">';
584 print_barre_liste(
'', $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'', 0,
'',
'', $limit);
586 print_barre_liste(
'', $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords,
'generic', 0,
'',
'', $limit);
591 $parameters = array();
592 $reshook = $hookmanager->executeHooks(
'printFieldPreListTitle', $parameters);
593 if (empty($reshook)) {
594 $moreforfilter .= $hookmanager->resPrint;
596 $moreforfilter = $hookmanager->resPrint;
599 if (!empty($moreforfilter)) {
600 print
'<div class="liste_titre liste_titre_bydiv centpercent">';
601 print $moreforfilter;
605 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
606 $selectedfields = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage,
getDolGlobalString(
'MAIN_CHECKBOX_LEFT_COLUMN'));
607 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
609 print
'<div class="div-table-responsive">';
610 print
'<table class="tagtable liste'.($moreforfilter ?
" listwithfilterbefore" :
"").
'">'.
"\n";
613 print
'<tr class="liste_titre_filter">';
616 print
'<td class="liste_titre maxwidthsearch">';
617 $searchpicto = $form->showFilterAndCheckAddButtons(0);
621 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
623 print
'<td class="liste_titre left">';
624 print
'<input class="flat maxwidth25" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).
'">';
627 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
628 print
'<td class="liste_titre nowraponall">';
629 print
'<input class="flat" type="text" size="2" maxlength="2" placeholder="'.dol_escape_htmltag($langs->trans(
"Month")).
'" name="month" value="'.$month.
'">';
630 if (!isModEnabled(
'productbatch')) {
634 $syear = $year ? $year : -1;
635 print
'<input class="flat maxwidth50" type="text" maxlength="4" placeholder="'.dol_escape_htmltag($langs->trans(
"Year")).
'" name="year" value="'.($syear > 0 ? $syear :
'').
'">';
639 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
641 print
'<td class="liste_titre left">';
642 print
'<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($search_product_ref).
'">';
645 if (!empty($arrayfields[
'p.label'][
'checked'])) {
647 print
'<td class="liste_titre left">';
648 print
'<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($search_product).
'">';
652 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
653 print
'<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).
'"></td>';
655 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
656 print
'<td class="liste_titre left">';
659 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
660 print
'<td class="liste_titre left">';
664 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
665 print
'<td class="liste_titre maxwidthonsmartphone left">';
667 print $formproduct->selectWarehouses($search_warehouse,
'search_warehouse',
'warehouseopen,warehouseinternal', 1, 0, 0,
'', 0, 0,
null,
'maxwidth200');
670 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
672 print
'<td class="liste_titre left">';
673 print
'<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).
'">';
676 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
678 print
'<td class="liste_titre left">';
679 print
'<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).
'">';
682 if (!empty($arrayfields[
'm.label'][
'checked'])) {
684 print
'<td class="liste_titre left">';
685 print
'<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).
'">';
688 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
690 print
'<td class="liste_titre center">';
692 print
'<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
693 print
'<option value="" '.(($search_type_mouvement ==
"") ?
'selected="selected"' :
'').
'> </option>';
694 print
'<option value="0" '.(($search_type_mouvement ==
"0") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</option>';
695 print
'<option value="1" '.(($search_type_mouvement ==
"1") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</option>';
696 print
'<option value="2" '.(($search_type_mouvement ==
"2") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockDecrease').
'</option>';
697 print
'<option value="3" '.(($search_type_mouvement ==
"3") ?
'selected="selected"' :
'').
'>'.$langs->trans(
'StockIncrease').
'</option>';
704 if (!empty($arrayfields[
'origin'][
'checked'])) {
706 print
'<td class="liste_titre left">';
710 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
712 print
'<td class="liste_titre" align="left">';
716 if (!empty($arrayfields[
'm.value'][
'checked'])) {
718 print
'<td class="liste_titre right">';
719 print
'<input class="flat" type="text" size="4" name="search_qty" value="'.dol_escape_htmltag($search_qty).
'">';
722 if (!empty($arrayfields[
'm.price'][
'checked'])) {
724 print
'<td class="liste_titre left">';
731 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_input.tpl.php';
734 $parameters = array(
'arrayfields' => $arrayfields);
735 $reshook = $hookmanager->executeHooks(
'printFieldListOption', $parameters);
736 print $hookmanager->resPrint;
738 if (!empty($arrayfields[
'm.datec'][
'checked'])) {
739 print
'<td class="liste_titre">';
743 if (!empty($arrayfields[
'm.tms'][
'checked'])) {
744 print
'<td class="liste_titre">';
749 print
'<td class="liste_titre maxwidthsearch">';
750 $searchpicto = $form->showFilterAndCheckAddButtons(0);
756 $totalarray = array();
757 $totalarray[
'nbfield'] = 0;
759 print
'<tr class="liste_titre">';
762 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
763 $totalarray[
'nbfield']++;
765 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
766 print_liste_field_titre($arrayfields[
'm.rowid'][
'label'], $_SERVER[
"PHP_SELF"],
'm.rowid',
'', $param,
'', $sortfield, $sortorder);
767 $totalarray[
'nbfield']++;
769 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
770 print_liste_field_titre($arrayfields[
'm.datem'][
'label'], $_SERVER[
"PHP_SELF"],
'm.datem',
'', $param,
'', $sortfield, $sortorder);
771 $totalarray[
'nbfield']++;
773 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
774 print_liste_field_titre($arrayfields[
'p.ref'][
'label'], $_SERVER[
"PHP_SELF"],
'p.ref',
'', $param,
'', $sortfield, $sortorder);
775 $totalarray[
'nbfield']++;
777 if (!empty($arrayfields[
'p.label'][
'checked'])) {
778 print_liste_field_titre($arrayfields[
'p.label'][
'label'], $_SERVER[
"PHP_SELF"],
'p.label',
'', $param,
'', $sortfield, $sortorder);
779 $totalarray[
'nbfield']++;
781 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
782 print_liste_field_titre($arrayfields[
'm.batch'][
'label'], $_SERVER[
"PHP_SELF"],
'm.batch',
'', $param,
'', $sortfield, $sortorder,
'center ');
783 $totalarray[
'nbfield']++;
785 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
786 print_liste_field_titre($arrayfields[
'pl.eatby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.eatby',
'', $param,
'', $sortfield, $sortorder,
'center ');
787 $totalarray[
'nbfield']++;
789 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
790 print_liste_field_titre($arrayfields[
'pl.sellby'][
'label'], $_SERVER[
"PHP_SELF"],
'pl.sellby',
'', $param,
'', $sortfield, $sortorder,
'center ');
791 $totalarray[
'nbfield']++;
793 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
795 print_liste_field_titre($arrayfields[
'e.ref'][
'label'], $_SERVER[
"PHP_SELF"],
"e.ref",
"", $param,
"", $sortfield, $sortorder);
796 $totalarray[
'nbfield']++;
798 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
799 print_liste_field_titre($arrayfields[
'm.fk_user_author'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_user_author",
"", $param,
"", $sortfield, $sortorder);
800 $totalarray[
'nbfield']++;
802 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
803 print_liste_field_titre($arrayfields[
'm.inventorycode'][
'label'], $_SERVER[
"PHP_SELF"],
"m.inventorycode",
"", $param,
"", $sortfield, $sortorder);
804 $totalarray[
'nbfield']++;
806 if (!empty($arrayfields[
'm.label'][
'checked'])) {
807 print_liste_field_titre($arrayfields[
'm.label'][
'label'], $_SERVER[
"PHP_SELF"],
"m.label",
"", $param,
"", $sortfield, $sortorder);
808 $totalarray[
'nbfield']++;
810 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
811 print_liste_field_titre($arrayfields[
'm.type_mouvement'][
'label'], $_SERVER[
"PHP_SELF"],
"m.type_mouvement",
"", $param,
'', $sortfield, $sortorder,
'center ');
812 $totalarray[
'nbfield']++;
814 if (!empty($arrayfields[
'origin'][
'checked'])) {
815 print_liste_field_titre($arrayfields[
'origin'][
'label'], $_SERVER[
"PHP_SELF"],
"",
"", $param,
"", $sortfield, $sortorder);
816 $totalarray[
'nbfield']++;
818 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
819 print_liste_field_titre($arrayfields[
'm.fk_projet'][
'label'], $_SERVER[
"PHP_SELF"],
"m.fk_projet",
"", $param,
'', $sortfield, $sortorder);
820 $totalarray[
'nbfield']++;
822 if (!empty($arrayfields[
'm.value'][
'checked'])) {
823 print_liste_field_titre($arrayfields[
'm.value'][
'label'], $_SERVER[
"PHP_SELF"],
"m.value",
"", $param,
'', $sortfield, $sortorder,
'right ');
824 $totalarray[
'nbfield']++;
826 if (!empty($arrayfields[
'm.price'][
'checked'])) {
827 print_liste_field_titre($arrayfields[
'm.price'][
'label'], $_SERVER[
"PHP_SELF"],
"m.price",
"", $param,
'', $sortfield, $sortorder,
'right ');
828 $totalarray[
'nbfield']++;
832 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_list_search_title.tpl.php';
835 $parameters = array(
'arrayfields' => $arrayfields,
'param' => $param,
'sortfield' => $sortfield,
'sortorder' => $sortorder);
836 $reshook = $hookmanager->executeHooks(
'printFieldListTitle', $parameters);
837 print $hookmanager->resPrint;
838 if (!empty($arrayfields[
'm.datec'][
'checked'])) {
839 print_liste_field_titre($arrayfields[
'p.datec'][
'label'], $_SERVER[
"PHP_SELF"],
"p.datec",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
840 $totalarray[
'nbfield']++;
842 if (!empty($arrayfields[
'm.tms'][
'checked'])) {
843 print_liste_field_titre($arrayfields[
'p.tms'][
'label'], $_SERVER[
"PHP_SELF"],
"p.tms",
"", $param,
'', $sortfield, $sortorder,
'center nowrap ');
844 $totalarray[
'nbfield']++;
848 print_liste_field_titre($selectedfields, $_SERVER[
"PHP_SELF"],
"",
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ');
849 $totalarray[
'nbfield']++;
854 $savnbfield = $totalarray[
'nbfield'];
855 $totalarray = array();
856 $totalarray[
'nbfield'] = 0;
857 $imaxinloop = ($limit ? min($num, $limit) : $num);
858 while ($i < $imaxinloop) {
859 $objp = $db->fetch_object($resql);
864 $sql =
"SELECT label";
865 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_lang";
866 $sql .=
" WHERE fk_product = ".((int) $objp->rowid);
867 $sql .=
" AND lang = '".$db->escape($langs->getDefaultLang()).
"'";
870 $result = $db->query($sql);
872 $objtp = $db->fetch_object($result);
873 if (!empty($objtp->label)) {
874 $objp->produit = $objtp->label;
879 $userstatic->id = $objp->fk_user_author;
880 $userstatic->login = $objp->login;
881 $userstatic->lastname = $objp->lastname;
882 $userstatic->firstname = $objp->firstname;
883 $userstatic->photo = $objp->photo;
885 $productstatic->id = $objp->rowid;
886 $productstatic->ref = $objp->product_ref;
887 $productstatic->label = $objp->produit;
888 $productstatic->type = $objp->type;
889 $productstatic->entity = $objp->entity;
890 $productstatic->status_batch = $objp->tobatch;
892 $productlot->id = $objp->lotid;
893 $productlot->batch = $objp->batch;
894 $productlot->eatby = $objp->eatby;
895 $productlot->sellby = $objp->sellby;
897 $warehousestatic->id = $objp->entrepot_id;
898 $warehousestatic->libelle = $objp->warehouse_ref;
899 $warehousestatic->label = $objp->warehouse_ref;
900 $warehousestatic->lieu = $objp->lieu;
902 if (!empty($objp->fk_origin)) {
903 $origin = $objectlist->get_origin($objp->fk_origin, $objp->origintype);
908 print
'<tr class="oddeven">';
911 print
'<td class="nowrap center">';
912 if ($massactionbutton || $massaction) {
914 if (in_array($objp->rowid, $arrayofselected)) {
917 print
'<input id="cb'.$objp->rowid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->rowid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
921 $totalarray[
'nbfield']++;
925 if (!empty($arrayfields[
'm.rowid'][
'checked'])) {
927 print
'<td>'.dol_escape_htmltag($objp->mid).
'</td>';
929 if (!empty($arrayfields[
'm.datem'][
'checked'])) {
931 print
'<td>'.dol_print_date($db->jdate($objp->datem),
'dayhour').
'</td>';
933 if (!empty($arrayfields[
'p.ref'][
'checked'])) {
935 print
'<td class="nowraponall">';
936 print $productstatic->getNomUrl(1,
'stock', 16);
939 if (!empty($arrayfields[
'p.label'][
'checked'])) {
941 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).
'">';
942 print $productstatic->label;
945 if (!empty($arrayfields[
'm.batch'][
'checked'])) {
946 print
'<td class="center nowraponall">';
947 if ($productlot->id > 0) {
948 print $productlot->getNomUrl(1);
954 if (!empty($arrayfields[
'pl.eatby'][
'checked'])) {
955 print
'<td class="center">'.dol_print_date($objp->eatby,
'day').
'</td>';
957 if (!empty($arrayfields[
'pl.sellby'][
'checked'])) {
958 print
'<td class="center">'.dol_print_date($objp->sellby,
'day').
'</td>';
961 if (!empty($arrayfields[
'e.ref'][
'checked'])) {
963 print $warehousestatic->getNomUrl(1);
967 if (!empty($arrayfields[
'm.fk_user_author'][
'checked'])) {
968 print
'<td class="tdoverflowmax100">';
969 print $userstatic->getNomUrl(-1);
973 if (!empty($arrayfields[
'm.inventorycode'][
'checked'])) {
974 print
'<td class="tdoverflowmax150" title="'.dol_escape_htmltag($objp->inventorycode).
'">';
981 if (!empty($arrayfields[
'm.label'][
'checked'])) {
982 print
'<td class="tdoverflowmax300" title="'.dol_escape_htmltag($objp->label).
'">'.
dol_escape_htmltag($objp->label).
'</td>';
985 if (!empty($arrayfields[
'm.type_mouvement'][
'checked'])) {
986 switch ($objp->type_mouvement) {
988 print
'<td class="center">'.$langs->trans(
'StockIncreaseAfterCorrectTransfer').
'</td>';
991 print
'<td class="center">'.$langs->trans(
'StockDecreaseAfterCorrectTransfer').
'</td>';
994 print
'<td class="center">'.$langs->trans(
'StockDecrease').
'</td>';
997 print
'<td class="center">'.$langs->trans(
'StockIncrease').
'</td>';
1001 if (!empty($arrayfields[
'origin'][
'checked'])) {
1003 print
'<td class="nowraponall">'.$origin.
'</td>';
1005 if (!empty($arrayfields[
'm.fk_projet'][
'checked'])) {
1008 if ($objp->fk_project != 0) {
1009 print $movement->get_origin($objp->fk_project,
'project');
1013 if (!empty($arrayfields[
'm.value'][
'checked'])) {
1015 print
'<td class="right">';
1016 if ($objp->qty > 0) {
1017 print
'<span class="stockmovemententry">+'.$objp->qty.
'</span>';
1019 print
'<span class="stockmovementexit">'.$objp->qty.
'<span>';
1023 if (!empty($arrayfields[
'm.price'][
'checked'])) {
1025 print
'<td class="right">';
1026 if ($objp->price != 0) {
1027 print
'<span class="opacitymedium">'.price($objp->price).
'</span>';
1033 print
'<td class="nowrap center">';
1034 if ($massactionbutton || $massaction) {
1036 if (in_array($objp->rowid, $arrayofselected)) {
1039 print
'<input id="cb'.$objp->rowid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->rowid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
1043 $totalarray[
'nbfield']++;
1051 print
'<tr><td colspan="'.$savnbfield.
'"><span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span></td></tr>';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
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.
Class to manage warehouses.
Class to manage stock movements.
Class to manage products or services.
Class with list of lots and properties.
Class to manage projects.
Class to manage Dolibarr users.
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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_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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.