dolibarr 23.0.3
mo_movements.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2019 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2022 Ferran Marcet <fmarcet@2byte.es>
4 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
5 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
6 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
33require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
35require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
36require_once DOL_DOCUMENT_ROOT.'/product/stock/class/mouvementstock.class.php';
37require_once DOL_DOCUMENT_ROOT.'/product/stock/class/productlot.class.php';
38
39require_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
40require_once DOL_DOCUMENT_ROOT.'/mrp/lib/mrp_mo.lib.php';
41
50// Load translation files required by the page
51$langs->loadLangs(array("mrp", "stocks", "other"));
52
53// Get parameters
54$id = GETPOSTINT('id');
55$ref = GETPOST('ref', 'alpha');
56$action = GETPOST('action', 'aZ09');
57$confirm = GETPOST('confirm', 'alpha');
58$cancel = GETPOST('cancel');
59$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'mostockmovement'; // To manage different context of search
60$backtopage = GETPOST('backtopage', 'alpha');
61$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
62$massaction = GETPOST('massaction', 'aZ09');
63$lineid = GETPOSTINT('lineid');
64
65$msid = GETPOSTINT('msid');
66
67$year = GETPOST("year"); // TODO Rename into search_year
68$month = GETPOST("month"); // TODO Rename into search_month
69
70$search_ref = GETPOST('search_ref', 'alpha');
71$search_movement = GETPOST("search_movement", 'alpha');
72$search_product_ref = trim(GETPOST("search_product_ref", 'alpha'));
73$search_product = trim(GETPOST("search_product", 'alpha'));
74$search_warehouse = trim(GETPOST("search_warehouse", 'alpha'));
75$search_inventorycode = trim(GETPOST("search_inventorycode", 'alpha'));
76$search_user = trim(GETPOST("search_user", 'alpha'));
77$search_batch = trim(GETPOST("search_batch", 'alpha'));
78$search_qty = trim(GETPOST("search_qty", 'alpha'));
79$search_type_mouvement = GETPOST('search_type_mouvement', "intcomma");
80
81$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
82$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
83$sortfield = GETPOST('sortfield', 'aZ09comma');
84$sortorder = GETPOST('sortorder', 'aZ09comma');
85if (empty($page) || $page == -1) {
86 $page = 0;
87} // If $page is not defined, or '' or -1
88$offset = $limit * $page;
89if (!$sortfield) {
90 $sortfield = "m.datem";
91}
92if (!$sortorder) {
93 $sortorder = "DESC";
94}
95
96// Initialize a technical objects
97$object = new Mo($db);
98$extrafields = new ExtraFields($db);
99$diroutputmassaction = $conf->mrp->dir_output.'/temp/massgeneration/'.$user->id;
100$hookmanager->initHooks(array('mocard', 'globalcard', 'mocardmovelist' )); // Note that conf->hooks_modules contains array
101
102// Fetch optionals attributes and labels
103$extrafields->fetch_name_optionals_label($object->table_element);
104
105$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
106
107// Initialize array of search criteria
108$search_all = trim(GETPOST("search_all", 'alpha'));
109$search = array();
110foreach ($object->fields as $key => $val) {
111 if (GETPOST('search_'.$key, 'alpha')) {
112 $search[$key] = GETPOST('search_'.$key, 'alpha');
113 }
114}
115
116if (empty($action) && empty($id) && empty($ref)) {
117 $action = 'view';
118}
119
120// Load object
121include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
122
123// Security check - Protection if external user
124//if ($user->socid > 0) accessforbidden();
125//if ($user->socid > 0) $socid = $user->socid;
126$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
127$result = restrictedArea($user, 'mrp', $object->id, 'mrp_mo', '', 'fk_soc', 'rowid', $isdraft);
128
129$objectlist = new MouvementStock($db);
130
131// Definition of fields for list
132$arrayfields = array(
133 'm.rowid' => array('label' => "Ref", 'checked' => '1', 'position' => 1),
134 'm.datem' => array('label' => "Date", 'checked' => '1', 'position' => 2),
135 'p.ref' => array('label' => "ProductRef", 'checked' => '1', 'css' => 'maxwidth100', 'position' => 3),
136 'p.label' => array('label' => "ProductLabel", 'checked' => '0', 'position' => 5),
137 'm.batch' => array('label' => "BatchNumberShort", 'checked' => '1', 'position' => 8, 'enabled' => (string) (int) (isModEnabled('productbatch'))),
138 'pl.eatby' => array('label' => "EatByDate", 'checked' => '0', 'position' => 9, 'enabled' => (string) (int) (isModEnabled('productbatch'))),
139 'pl.sellby' => array('label' => "SellByDate", 'checked' => '0', 'position' => 10, 'enabled' => (string) (int) (isModEnabled('productbatch'))),
140 'e.ref' => array('label' => "Warehouse", 'checked' => '1', 'position' => 100, 'enabled' => (string) (int) (!($id > 0))), // If we are on specific warehouse, we hide it
141 'm.fk_user_author' => array('label' => "Author", 'checked' => '0', 'position' => 120),
142 'm.inventorycode' => array('label' => "InventoryCodeShort", 'checked' => '1', 'position' => 130),
143 'm.label' => array('label' => "MovementLabel", 'checked' => '1', 'position' => 140),
144 'm.type_mouvement' => array('label' => "TypeMovement", 'checked' => '0', 'position' => 150),
145 'origin' => array('label' => "Origin", 'checked' => '1', 'position' => 155),
146 'm.fk_projet' => array('label' => 'Project', 'checked' => '0', 'position' => 180),
147 'm.value' => array('label' => "Qty", 'checked' => '1', 'position' => 200),
148 'm.price' => array('label' => "UnitPurchaseValue", 'checked' => '0', 'position' => 210)
149 //'m.datec'=>array('label'=>"DateCreation", 'checked'=>'0', 'position'=>500),
150 //'m.tms'=>array('label'=>"DateModificationShort", 'checked'=>'0', 'position'=>500)
151);
152if (getDolGlobalString('PRODUCT_DISABLE_SELLBY')) {
153 unset($arrayfields['pl.sellby']);
154}
155if (getDolGlobalString('PRODUCT_DISABLE_EATBY')) {
156 unset($arrayfields['pl.eatby']);
157}
158$objectlist->fields = dol_sort_array($objectlist->fields, 'position');
159$arrayfields = dol_sort_array($arrayfields, 'position');
160
161// Permissions
162$permissionnote = $user->hasRight('mrp', 'write'); // Used by the include of actions_setnotes.inc.php
163$permissiondellink = $user->hasRight('mrp', 'write'); // Used by the include of actions_dellink.inc.php
164$permissiontoadd = $user->hasRight('mrp', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
165$permissiontodelete = $user->hasRight('mrp', 'delete') || ($permissiontoadd && isset($object->status) && $object->status == $object::STATUS_DRAFT);
166$upload_dir = $conf->mrp->multidir_output[isset($object->entity) ? $object->entity : 1];
167
168$permissiontoproduce = $permissiontoadd;
169$permissiontoupdatecost = $user->hasRight('bom', 'write'); // User who can define cost must have knowledge of pricing
170
171if ($permissiontoupdatecost) {
172 $arrayfields['m.price']['enabled'] = '1';
173}
174
175$arrayofselected = array();
176
177
178/*
179 * Actions
180 */
181
182if (GETPOST('cancel', 'alpha')) {
183 $action = 'list';
184 $massaction = '';
185}
186if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
187 $massaction = '';
188}
189
190$parameters = array();
191$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
192if ($reshook < 0) {
193 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
194}
195
196include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
197
198// Do we click on purge search criteria ?
199if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // Both test are required to be compatible with all browsers
200 $year = '';
201 $month = '';
202 $search_ref = '';
203 $search_movement = "";
204 $search_type_mouvement = "";
205 $search_inventorycode = "";
206 $search_product_ref = "";
207 $search_product = "";
208 $search_warehouse = "";
209 $search_user = "";
210 $search_batch = "";
211 $search_qty = '';
212 $search_all = "";
213 $toselect = array();
214 $search_array_options = array();
215}
216
217if (empty($reshook)) {
218 $error = 0;
219
220 $backurlforlist = dol_buildpath('/mrp/mo_list.php', 1);
221
222 if (empty($backtopage) || ($cancel && empty($id))) {
223 //var_dump($backurlforlist);exit;
224 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
225 $backtopage = $backurlforlist;
226 } else {
227 $backtopage = DOL_URL_ROOT.'/mrp/mo_production.php?id='.($id > 0 ? $id : '__ID__');
228 }
229 }
230 $triggermodname = 'MO_MODIFY'; // Name of trigger action code to execute when we modify record
231
232 // Actions cancel, add, update, delete or clone
233 include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
234
235 // Actions when linking object each other
236 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php';
237
238 // Actions when printing a doc from card
239 include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
240
241 // Actions to send emails
242 $triggersendname = 'MO_SENTBYMAIL';
243 $autocopy = 'MAIN_MAIL_AUTOCOPY_MO_TO';
244 $trackid = 'mo'.$object->id;
245 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
246
247 // Action to move up and down lines of object
248 //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be 'include', not 'include_once'
249
250 if ($action == 'set_thirdparty' && $permissiontoadd) {
251 $object->setValueFrom('fk_soc', GETPOSTINT('fk_soc'), '', null, 'date', '', $user, $triggermodname);
252 }
253 if ($action == 'classin' && $permissiontoadd) {
254 $object->setProject(GETPOSTINT('projectid'));
255 }
256
257 if ($action == 'confirm_reopen' && $permissiontoadd) {
258 $result = $object->setStatut($object::STATUS_INPROGRESS, 0, '', 'MRP_REOPEN');
259 }
260}
261
262
263
264/*
265 * View
266 */
267
268$form = new Form($db);
269$formproject = new FormProjets($db);
270$formproduct = new FormProduct($db);
271$productstatic = new Product($db);
272$productlot = new Productlot($db);
273$warehousestatic = new Entrepot($db);
274$userstatic = new User($db);
275
276$title = $langs->trans('Mo');
277$help_url = 'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication|DE:Modul_Fertigungsauftrag';
278
279llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-mrp page-card_movements');
280
281// Part to show record
282if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
283 $res = $object->fetch_thirdparty();
284 $res = $object->fetch_optionals();
285
286 $head = moPrepareHead($object);
287
288 print dol_get_fiche_head($head, 'stockmovement', $langs->trans("ManufacturingOrder"), -1, $object->picto);
289
290 $formconfirm = '';
291
292 // Confirmation to delete
293 if ($action == 'delete') {
294 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteMo'), $langs->trans('ConfirmDeleteMo'), 'confirm_delete', '', 0, 1);
295 }
296 // Confirmation to delete line
297 if ($action == 'deleteline') {
298 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&lineid='.$lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
299 }
300 // Clone confirmation
301 if ($action == 'clone') {
302 // Create an array for form
303 $formquestion = array();
304 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneMo', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
305 }
306
307 // Call Hook formConfirm
308 $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
309 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
310 if (empty($reshook)) {
311 $formconfirm .= $hookmanager->resPrint;
312 } elseif ($reshook > 0) {
313 $formconfirm = $hookmanager->resPrint;
314 }
315
316 // Print form confirm
317 print $formconfirm;
318
319
320 // Object card
321 // ------------------------------------------------------------
322 $linkback = '<a href="'.dol_buildpath('/mrp/mo_list.php', 1).'?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
323
324 $morehtmlref = '<div class="refidno">';
325 /*
326 // Ref bis
327 $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', 0, 1);
328 $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mrp->creer, 'string', '', null, null, '', 1);*/
329 // Thirdparty
330 if (is_object($object->thirdparty)) {
331 $morehtmlref .= $object->thirdparty->getNomUrl(1, 'customer');
332 if (!getDolGlobalString('MAIN_DISABLE_OTHER_LINK') && $object->thirdparty->id > 0) {
333 $morehtmlref .= ' (<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$object->thirdparty->id.'&search_societe='.urlencode($object->thirdparty->name).'">'.$langs->trans("OtherOrders").'</a>)';
334 }
335 }
336 // Project
337 if (isModEnabled('project')) {
338 $langs->load("projects");
339 if (is_object($object->thirdparty)) {
340 $morehtmlref .= '<br>';
341 }
342 if ($permissiontoadd) {
343 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
344 if ($action != 'classify') {
345 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
346 }
347 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, (string) $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
348 } else {
349 if (!empty($object->fk_project)) {
350 $proj = new Project($db);
351 $proj->fetch($object->fk_project);
352 $morehtmlref .= $proj->getNomUrl(1);
353 if ($proj->title) {
354 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
355 }
356 }
357 }
358 }
359 $morehtmlref .= '</div>';
360
361
362 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
363
364
365 print '<div class="fichecenter">';
366 print '<div class="fichehalfleft">';
367 print '<div class="underbanner clearboth"></div>';
368 print '<table class="border centpercent tableforfield">'."\n";
369
370 // Common attributes
371 $keyforbreak = 'fk_warehouse';
372 unset($object->fields['fk_project']);
373 unset($object->fields['fk_soc']);
374 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
375
376 // Other attributes
377 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
378
379 print '</table>';
380 print '</div>';
381 print '</div>';
382
383 print '<div class="clearboth"></div>';
384
385 print dol_get_fiche_end();
386
387 /*
388 print '<div class="tabsAction">';
389
390 $parameters = array();
391 // Note that $action and $object may be modified by hook
392 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action);
393 if (empty($reshook)) {
394 // Cancel - Reopen
395 if ($permissiontoadd)
396 {
397 if ($object->status == $object::STATUS_VALIDATED || $object->status == $object::STATUS_INPROGRESS)
398 {
399 print '<a class="butActionDelete" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_close&confirm=yes">'.$langs->trans("Cancel").'</a>'."\n";
400 }
401
402 if ($object->status == $object::STATUS_CANCELED)
403 {
404 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen&confirm=yes">'.$langs->trans("Re-Open").'</a>'."\n";
405 }
406
407 if ($object->status == $object::STATUS_PRODUCED) {
408 if ($permissiontoproduce) {
409 print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=confirm_reopen">'.$langs->trans('ReOpen').'</a>';
410 } else {
411 print '<a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('ReOpen').'</a>';
412 }
413 }
414 }
415 }
416
417 print '</div>';
418 */
419
420
421 $sql = "SELECT p.rowid, p.ref as product_ref, p.label as produit, p.tobatch, p.fk_product_type as type, p.entity,";
422 $sql .= " e.ref as warehouse_ref, e.rowid as entrepot_id, e.lieu,";
423 $sql .= " m.rowid as mid, m.value as qty, m.datem, m.fk_user_author, m.label, m.inventorycode, m.fk_origin, m.origintype,";
424 $sql .= " m.batch, m.price,";
425 $sql .= " m.type_mouvement,";
426 $sql .= " pl.rowid as lotid, pl.eatby, pl.sellby,";
427 $sql .= " u.login, u.photo, u.lastname, u.firstname";
428 // Add fields from extrafields
429 if (!empty($extrafields->attributes[$objectlist->table_element]['label'])) {
430 foreach ($extrafields->attributes[$objectlist->table_element]['label'] as $key => $val) {
431 $sql .= ($extrafields->attributes[$objectlist->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
432 }
433 }
434 // Add fields from hooks
435 $parameters = array();
436 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $objectlist may have been modified by hook
437 $sql .= $hookmanager->resPrint;
438 $sql .= " FROM ".MAIN_DB_PREFIX."entrepot as e,";
439 $sql .= " ".MAIN_DB_PREFIX."product as p,";
440 $sql .= " ".MAIN_DB_PREFIX."stock_mouvement as m";
441 if (!empty($extrafields->attributes[$objectlist->table_element]) && is_array($extrafields->attributes[$objectlist->table_element]['label']) && count($extrafields->attributes[$objectlist->table_element]['label'])) {
442 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$objectlist->table_element."_extrafields as ef on (m.rowid = ef.fk_object)";
443 }
444 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON m.fk_user_author = u.rowid";
445 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_lot as pl ON m.batch = pl.batch AND m.fk_product = pl.fk_product";
446 $sql .= " WHERE m.fk_product = p.rowid";
447 $sql .= " AND m.origintype = 'mo' AND m.fk_origin = ".(int) $object->id;
448 if ($msid > 0) {
449 $sql .= " AND m.rowid = ".((int) $msid);
450 }
451 $sql .= " AND m.fk_entrepot = e.rowid";
452 $sql .= " AND e.entity IN (".getEntity('stock').")";
453 if (!getDolGlobalString('STOCK_SUPPORTS_SERVICES')) {
454 $sql .= " AND p.fk_product_type = 0";
455 }
456 $sql .= dolSqlDateFilter('m.datem', 0, $month, $year);
457 if (!empty($search_ref)) {
458 $sql .= natural_search('m.rowid', $search_ref, 1);
459 }
460 if (!empty($search_movement)) {
461 $sql .= natural_search('m.label', $search_movement);
462 }
463 if (!empty($search_inventorycode)) {
464 $sql .= natural_search('m.inventorycode', $search_inventorycode);
465 }
466 if (!empty($search_product_ref)) {
467 $sql .= natural_search('p.ref', $search_product_ref);
468 }
469 if (!empty($search_product)) {
470 $sql .= natural_search('p.label', $search_product);
471 }
472 if ($search_warehouse != '' && $search_warehouse != '-1') {
473 $sql .= natural_search('e.rowid', $search_warehouse, 2);
474 }
475 if (!empty($search_user)) {
476 $sql .= natural_search(array('u.lastname', 'u.firstname', 'u.login'), $search_user);
477 }
478 if (!empty($search_batch)) {
479 $sql .= natural_search('m.batch', $search_batch);
480 }
481 if ($search_qty != '') {
482 $sql .= natural_search('m.value', $search_qty, 1);
483 }
484 if ($search_type_mouvement != '' && $search_type_mouvement != '-1') {
485 $sql .= natural_search('m.type_mouvement', $search_type_mouvement, 2);
486 }
487 // Add where from extra fields
488 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
489 // Add where from hooks
490 $parameters = array();
491 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $objectlist may have been modified by hook
492 $sql .= $hookmanager->resPrint;
493 $sql .= $db->order($sortfield, $sortorder);
494
495 $nbtotalofrecords = '';
496 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
497 $result = $db->query($sql);
498 $nbtotalofrecords = $db->num_rows($result);
499 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
500 $page = 0;
501 $offset = 0;
502 }
503 }
504 $sql .= $db->plimit($limit + 1, $offset);
505
506 $resql = $db->query($sql);
507 if (!$resql) {
508 dol_print_error($db);
509 }
510 $num = $db->num_rows($resql);
511
512 $param = '';
513 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
514 $param .= '&contextpage='.urlencode($contextpage);
515 }
516 if ($limit > 0 && $limit != $conf->liste_limit) {
517 $param .= '&limit='.((int) $limit);
518 }
519 if ($id > 0) {
520 $param .= '&id='.urlencode((string) ($id));
521 }
522 if ($search_movement) {
523 $param .= '&search_movement='.urlencode($search_movement);
524 }
525 if ($search_inventorycode) {
526 $param .= '&search_inventorycode='.urlencode($search_inventorycode);
527 }
528 if ($search_type_mouvement) {
529 $param .= '&search_type_mouvement='.urlencode($search_type_mouvement);
530 }
531 if ($search_product_ref) {
532 $param .= '&search_product_ref='.urlencode($search_product_ref);
533 }
534 if ($search_product) {
535 $param .= '&search_product='.urlencode($search_product);
536 }
537 if ($search_batch) {
538 $param .= '&search_batch='.urlencode($search_batch);
539 }
540 if ($search_warehouse > 0) {
541 $param .= '&search_warehouse='.urlencode($search_warehouse);
542 }
543 if ($search_user) {
544 $param .= '&search_user='.urlencode($search_user);
545 }
546
547 // Add $param from extra fields
548 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
549
550 // List of mass actions available
551 $arrayofmassactions = array(
552 // 'presend'=>$langs->trans("SendByMail"),
553 // 'builddoc'=>$langs->trans("PDFMerge"),
554 );
555 //if ($user->rights->stock->supprimer) $arrayofmassactions['predelete']='<span class="fa fa-trash paddingrightonly"></span>'.$langs->trans("Delete");
556 if (in_array($massaction, array('presend', 'predelete'))) {
557 $arrayofmassactions = array();
558 }
559 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
560
561 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
562 if ($optioncss != '') {
563 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
564 }
565 print '<input type="hidden" name="token" value="'.newToken().'">';
566 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
567 print '<input type="hidden" name="action" value="list">';
568 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
569 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
570 print '<input type="hidden" name="page" value="'.$page.'">';
571 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
572 if ($id > 0) {
573 print '<input type="hidden" name="id" value="'.$id.'">';
574 }
575
576 if ($id > 0) {
577 print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, '', 0, '', '', $limit);
578 } else {
579 print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'generic', 0, '', '', $limit);
580 }
581
582 $moreforfilter = '';
583
584 $parameters = array();
585 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
586 if (empty($reshook)) {
587 $moreforfilter .= $hookmanager->resPrint;
588 } else {
589 $moreforfilter = $hookmanager->resPrint;
590 }
591
592 if (!empty($moreforfilter)) {
593 print '<div class="liste_titre liste_titre_bydiv centpercent">';
594 print $moreforfilter;
595 print '</div>';
596 }
597
598 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
599 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
600 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
601
602 print '<div class="div-table-responsive">';
603 print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
604
605 // Fields title search
606 print '<tr class="liste_titre_filter">';
607 // Actions
608 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
609 print '<td class="liste_titre maxwidthsearch">';
610 $searchpicto = $form->showFilterAndCheckAddButtons(0);
611 print $searchpicto;
612 print '</td>';
613 }
614 if (!empty($arrayfields['m.rowid']['checked'])) {
615 // Ref
616 print '<td class="liste_titre left">';
617 print '<input class="flat maxwidth25" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
618 print '</td>';
619 }
620 if (!empty($arrayfields['m.datem']['checked'])) {
621 print '<td class="liste_titre nowraponall">';
622 print '<input class="flat" type="text" size="2" maxlength="2" placeholder="'.dol_escape_htmltag($langs->trans("Month")).'" name="month" value="'.$month.'">';
623 if (!isModEnabled('productbatch')) {
624 print '&nbsp;';
625 }
626 //else print '<br>';
627 $syear = $year ? $year : -1;
628 print '<input class="flat maxwidth50" type="text" maxlength="4" placeholder="'.dol_escape_htmltag($langs->trans("Year")).'" name="year" value="'.($syear > 0 ? $syear : '').'">';
629 //print $formother->selectyear($syear,'year',1, 20, 5);
630 print '</td>';
631 }
632 if (!empty($arrayfields['p.ref']['checked'])) {
633 // Product Ref
634 print '<td class="liste_titre left">';
635 print '<input class="flat maxwidth75" type="text" name="search_product_ref" value="'.dol_escape_htmltag($search_product_ref).'">';
636 print '</td>';
637 }
638 if (!empty($arrayfields['p.label']['checked'])) {
639 // Product label
640 print '<td class="liste_titre left">';
641 print '<input class="flat maxwidth100" type="text" name="search_product" value="'.dol_escape_htmltag($search_product).'">';
642 print '</td>';
643 }
644 // Batch
645 if (!empty($arrayfields['m.batch']['checked'])) {
646 print '<td class="liste_titre center"><input class="flat maxwidth75" type="text" name="search_batch" value="'.dol_escape_htmltag($search_batch).'"></td>';
647 }
648 if (!empty($arrayfields['pl.eatby']['checked'])) {
649 print '<td class="liste_titre left">';
650 print '</td>';
651 }
652 if (!empty($arrayfields['pl.sellby']['checked'])) {
653 print '<td class="liste_titre left">';
654 print '</td>';
655 }
656 // Warehouse
657 if (!empty($arrayfields['e.ref']['checked'])) {
658 print '<td class="liste_titre maxwidthonsmartphone left">';
659 //print '<input class="flat" type="text" size="8" name="search_warehouse" value="'.($search_warehouse).'">';
660 print $formproduct->selectWarehouses($search_warehouse, 'search_warehouse', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, array(), 'maxwidth200');
661 print '</td>';
662 }
663 if (!empty($arrayfields['m.fk_user_author']['checked'])) {
664 // Author
665 print '<td class="liste_titre left">';
666 print '<input class="flat" type="text" size="6" name="search_user" value="'.dol_escape_htmltag($search_user).'">';
667 print '</td>';
668 }
669 if (!empty($arrayfields['m.inventorycode']['checked'])) {
670 // Inventory code
671 print '<td class="liste_titre left">';
672 print '<input class="flat" type="text" size="4" name="search_inventorycode" value="'.dol_escape_htmltag($search_inventorycode).'">';
673 print '</td>';
674 }
675 if (!empty($arrayfields['m.label']['checked'])) {
676 // Label of movement
677 print '<td class="liste_titre left">';
678 print '<input class="flat" type="text" size="8" name="search_movement" value="'.dol_escape_htmltag($search_movement).'">';
679 print '</td>';
680 }
681 if (!empty($arrayfields['m.type_mouvement']['checked'])) {
682 // Type of movement
683 print '<td class="liste_titre center">';
684 //print '<input class="flat" type="text" size="3" name="search_type_mouvement" value="'.dol_escape_htmltag($search_type_mouvement).'">';
685 print '<select id="search_type_mouvement" name="search_type_mouvement" class="maxwidth150">';
686 print '<option value="" '.(($search_type_mouvement == "") ? 'selected="selected"' : '').'>&nbsp;</option>';
687 print '<option value="0" '.(($search_type_mouvement == "0") ? 'selected="selected"' : '').'>'.$langs->trans('StockIncreaseAfterCorrectTransfer').'</option>';
688 print '<option value="1" '.(($search_type_mouvement == "1") ? 'selected="selected"' : '').'>'.$langs->trans('StockDecreaseAfterCorrectTransfer').'</option>';
689 print '<option value="2" '.(($search_type_mouvement == "2") ? 'selected="selected"' : '').'>'.$langs->trans('StockDecrease').'</option>';
690 print '<option value="3" '.(($search_type_mouvement == "3") ? 'selected="selected"' : '').'>'.$langs->trans('StockIncrease').'</option>';
691 print '</select>';
692 print ajax_combobox('search_type_mouvement');
693 // TODO: add new function $formentrepot->selectTypeOfMovement(...) like
694 // print $formproduct->selectWarehouses($search_warehouse, 'search_warehouse', 'warehouseopen,warehouseinternal', 1, 0, 0, '', 0, 0, null, 'maxwidth200');
695 print '</td>';
696 }
697 if (!empty($arrayfields['origin']['checked'])) {
698 // Origin of movement
699 print '<td class="liste_titre left">';
700 print '&nbsp; ';
701 print '</td>';
702 }
703 if (!empty($arrayfields['m.fk_projet']['checked'])) {
704 // fk_project
705 print '<td class="liste_titre" align="left">';
706 print '&nbsp; ';
707 print '</td>';
708 }
709 if (!empty($arrayfields['m.value']['checked'])) {
710 // Qty
711 print '<td class="liste_titre right">';
712 print '<input class="flat" type="text" size="4" name="search_qty" value="'.dol_escape_htmltag($search_qty).'">';
713 print '</td>';
714 }
715 if (!empty($arrayfields['m.price']['checked'])) {
716 // Price
717 print '<td class="liste_titre left">';
718 print '&nbsp; ';
719 print '</td>';
720 }
721
722
723 // Extra fields
724 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
725
726 // Fields from hook
727 $parameters = array('arrayfields' => $arrayfields);
728 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
729 print $hookmanager->resPrint;
730 // Date creation
731 if (!empty($arrayfields['m.datec']['checked'])) {
732 print '<td class="liste_titre">';
733 print '</td>';
734 }
735 // Date modification
736 if (!empty($arrayfields['m.tms']['checked'])) {
737 print '<td class="liste_titre">';
738 print '</td>';
739 }
740 // Actions
741 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
742 print '<td class="liste_titre maxwidthsearch">';
743 $searchpicto = $form->showFilterAndCheckAddButtons(0);
744 print $searchpicto;
745 print '</td>';
746 }
747 print "</tr>\n";
748
749 $totalarray = array();
750 $totalarray['nbfield'] = 0;
751
752 print '<tr class="liste_titre">';
753 // Action column
754 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
755 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
756 $totalarray['nbfield']++;
757 }
758 if (!empty($arrayfields['m.rowid']['checked'])) {
759 print_liste_field_titre($arrayfields['m.rowid']['label'], $_SERVER["PHP_SELF"], 'm.rowid', '', $param, '', $sortfield, $sortorder);
760 $totalarray['nbfield']++;
761 }
762 if (!empty($arrayfields['m.datem']['checked'])) {
763 print_liste_field_titre($arrayfields['m.datem']['label'], $_SERVER["PHP_SELF"], 'm.datem', '', $param, '', $sortfield, $sortorder);
764 $totalarray['nbfield']++;
765 }
766 if (!empty($arrayfields['p.ref']['checked'])) {
767 print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], 'p.ref', '', $param, '', $sortfield, $sortorder);
768 $totalarray['nbfield']++;
769 }
770 if (!empty($arrayfields['p.label']['checked'])) {
771 print_liste_field_titre($arrayfields['p.label']['label'], $_SERVER["PHP_SELF"], 'p.label', '', $param, '', $sortfield, $sortorder);
772 $totalarray['nbfield']++;
773 }
774 if (!empty($arrayfields['m.batch']['checked'])) {
775 print_liste_field_titre($arrayfields['m.batch']['label'], $_SERVER["PHP_SELF"], 'm.batch', '', $param, '', $sortfield, $sortorder, 'center ');
776 $totalarray['nbfield']++;
777 }
778 if (!empty($arrayfields['pl.eatby']['checked'])) {
779 print_liste_field_titre($arrayfields['pl.eatby']['label'], $_SERVER["PHP_SELF"], 'pl.eatby', '', $param, '', $sortfield, $sortorder, 'center ');
780 $totalarray['nbfield']++;
781 }
782 if (!empty($arrayfields['pl.sellby']['checked'])) {
783 print_liste_field_titre($arrayfields['pl.sellby']['label'], $_SERVER["PHP_SELF"], 'pl.sellby', '', $param, '', $sortfield, $sortorder, 'center ');
784 $totalarray['nbfield']++;
785 }
786 if (!empty($arrayfields['e.ref']['checked'])) {
787 // We are on a specific warehouse card, no filter on other should be possible
788 print_liste_field_titre($arrayfields['e.ref']['label'], $_SERVER["PHP_SELF"], "e.ref", "", $param, "", $sortfield, $sortorder);
789 $totalarray['nbfield']++;
790 }
791 if (!empty($arrayfields['m.fk_user_author']['checked'])) {
792 print_liste_field_titre($arrayfields['m.fk_user_author']['label'], $_SERVER["PHP_SELF"], "m.fk_user_author", "", $param, "", $sortfield, $sortorder);
793 $totalarray['nbfield']++;
794 }
795 if (!empty($arrayfields['m.inventorycode']['checked'])) {
796 print_liste_field_titre($arrayfields['m.inventorycode']['label'], $_SERVER["PHP_SELF"], "m.inventorycode", "", $param, "", $sortfield, $sortorder);
797 $totalarray['nbfield']++;
798 }
799 if (!empty($arrayfields['m.label']['checked'])) {
800 print_liste_field_titre($arrayfields['m.label']['label'], $_SERVER["PHP_SELF"], "m.label", "", $param, "", $sortfield, $sortorder);
801 $totalarray['nbfield']++;
802 }
803 if (!empty($arrayfields['m.type_mouvement']['checked'])) {
804 print_liste_field_titre($arrayfields['m.type_mouvement']['label'], $_SERVER["PHP_SELF"], "m.type_mouvement", "", $param, '', $sortfield, $sortorder, 'center ');
805 $totalarray['nbfield']++;
806 }
807 if (!empty($arrayfields['origin']['checked'])) {
808 print_liste_field_titre($arrayfields['origin']['label'], $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder);
809 $totalarray['nbfield']++;
810 }
811 if (!empty($arrayfields['m.fk_projet']['checked'])) {
812 print_liste_field_titre($arrayfields['m.fk_projet']['label'], $_SERVER["PHP_SELF"], "m.fk_projet", "", $param, '', $sortfield, $sortorder);
813 $totalarray['nbfield']++;
814 }
815 if (!empty($arrayfields['m.value']['checked'])) {
816 print_liste_field_titre($arrayfields['m.value']['label'], $_SERVER["PHP_SELF"], "m.value", "", $param, '', $sortfield, $sortorder, 'right ');
817 $totalarray['nbfield']++;
818 }
819 if (!empty($arrayfields['m.price']['checked'])) {
820 // @phan-suppress-next-line PhanTypeInvalidDimOffset
821 print_liste_field_titre($arrayfields['m.price']['label'], $_SERVER["PHP_SELF"], "m.price", "", $param, '', $sortfield, $sortorder, 'right ');
822 $totalarray['nbfield']++;
823 }
824
825 // Extra fields
826 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
827
828 // Hook fields
829 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
830 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
831 print $hookmanager->resPrint;
832 if (!empty($arrayfields['m.datec']['checked'])) {
833 print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
834 $totalarray['nbfield']++;
835 }
836 if (!empty($arrayfields['m.tms']['checked'])) {
837 print_liste_field_titre($arrayfields['p.tms']['label'], $_SERVER["PHP_SELF"], "p.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
838 $totalarray['nbfield']++;
839 }
840 // Action column
841 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
842 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
843 $totalarray['nbfield']++;
844 }
845 print "</tr>\n";
846
847 $i = 0;
848 $savnbfield = $totalarray['nbfield'];
849 $totalarray = array();
850 $totalarray['nbfield'] = 0;
851 $imaxinloop = ($limit ? min($num, $limit) : $num);
852 while ($i < $imaxinloop) {
853 $objp = $db->fetch_object($resql);
854
855 // Multilangs
856 if (getDolGlobalInt('MAIN_MULTILANGS')) { // If multilang is enabled
857 // TODO Use a cache here
858 $sql = "SELECT label";
859 $sql .= " FROM ".MAIN_DB_PREFIX."product_lang";
860 $sql .= " WHERE fk_product = ".((int) $objp->rowid);
861 $sql .= " AND lang = '".$db->escape($langs->getDefaultLang())."'";
862 $sql .= " LIMIT 1";
863
864 $result = $db->query($sql);
865 if ($result) {
866 $objtp = $db->fetch_object($result);
867 if (!empty($objtp->label)) {
868 $objp->produit = $objtp->label;
869 }
870 }
871 }
872
873 $userstatic->id = $objp->fk_user_author;
874 $userstatic->login = $objp->login;
875 $userstatic->lastname = $objp->lastname;
876 $userstatic->firstname = $objp->firstname;
877 $userstatic->photo = $objp->photo;
878
879 $productstatic->id = $objp->rowid;
880 $productstatic->ref = $objp->product_ref;
881 $productstatic->label = $objp->produit;
882 $productstatic->type = $objp->type;
883 $productstatic->entity = $objp->entity;
884 $productstatic->status_batch = $objp->tobatch;
885
886 $productlot->id = $objp->lotid;
887 $productlot->batch = $objp->batch;
888 $productlot->eatby = $objp->eatby;
889 $productlot->sellby = $objp->sellby;
890
891 $warehousestatic->id = $objp->entrepot_id;
892 $warehousestatic->libelle = $objp->warehouse_ref; // deprecated
893 $warehousestatic->label = $objp->warehouse_ref;
894 $warehousestatic->lieu = $objp->lieu;
895
896 if (!empty($objp->fk_origin)) {
897 $origin = $objectlist->get_origin($objp->fk_origin, $objp->origintype);
898 } else {
899 $origin = '';
900 }
901
902 print '<tr class="oddeven">';
903 // Action column
904 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
905 print '<td class="nowrap center">';
906 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
907 $selected = 0;
908 if (in_array($objp->rowid, $arrayofselected)) {
909 $selected = 1;
910 }
911 print '<input id="cb'.$objp->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
912 }
913 print '</td>';
914 if (!$i) {
915 $totalarray['nbfield']++;
916 }
917 }
918 // Id movement
919 if (!empty($arrayfields['m.rowid']['checked'])) {
920 // This is primary not movement id
921 print '<td>'.dol_escape_htmltag($objp->mid).'</td>';
922 }
923 if (!empty($arrayfields['m.datem']['checked'])) {
924 // Date
925 print '<td>'.dol_print_date($db->jdate($objp->datem), 'dayhour').'</td>';
926 }
927 if (!empty($arrayfields['p.ref']['checked'])) {
928 // Product ref
929 print '<td class="nowraponall">';
930 print $productstatic->getNomUrl(1, 'stock', 16);
931 print "</td>\n";
932 }
933 if (!empty($arrayfields['p.label']['checked'])) {
934 // Product label
935 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($productstatic->label).'">';
936 print $productstatic->label;
937 print "</td>\n";
938 }
939 if (!empty($arrayfields['m.batch']['checked'])) {
940 print '<td class="center nowraponall">';
941 if ($productlot->id > 0) {
942 print $productlot->getNomUrl(1);
943 } else {
944 print dol_escape_htmltag($productlot->batch); // the id may not be defined if movement was entered when lot was not saved or if lot was removed after movement.
945 }
946 print '</td>';
947 }
948 if (!empty($arrayfields['pl.eatby']['checked'])) {
949 print '<td class="center">'.dol_print_date($objp->eatby, 'day').'</td>';
950 }
951 if (!empty($arrayfields['pl.sellby']['checked'])) {
952 print '<td class="center">'.dol_print_date($objp->sellby, 'day').'</td>';
953 }
954 // Warehouse
955 if (!empty($arrayfields['e.ref']['checked'])) {
956 print '<td>';
957 print $warehousestatic->getNomUrl(1);
958 print "</td>\n";
959 }
960 // Author
961 if (!empty($arrayfields['m.fk_user_author']['checked'])) {
962 print '<td class="tdoverflowmax100">';
963 print $userstatic->getNomUrl(-1);
964 print "</td>\n";
965 }
966 // Inventory code
967 if (!empty($arrayfields['m.inventorycode']['checked'])) {
968 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($objp->inventorycode).'">';
969 //print '<a href="' . DOL_URL_ROOT . '/product/stock/movement_list.php' . '?id=' . ((int) $objp->entrepot_id) . '&search_inventorycode=' . urlencode($objp->inventorycode) . '&search_type_mouvement=' . urlencode($objp->type_mouvement) . '">';
970 print dol_escape_htmltag($objp->inventorycode);
971 //print '</a>';
972 print '</td>';
973 }
974 // Label of movement
975 if (!empty($arrayfields['m.label']['checked'])) {
976 print '<td class="tdoverflowmax300" title="'.dol_escape_htmltag($objp->label).'">'.dol_escape_htmltag($objp->label).'</td>';
977 }
978 // Type of movement
979 if (!empty($arrayfields['m.type_mouvement']['checked'])) {
980 switch ($objp->type_mouvement) {
981 case "0":
982 print '<td class="center">'.$langs->trans('StockIncreaseAfterCorrectTransfer').'</td>';
983 break;
984 case "1":
985 print '<td class="center">'.$langs->trans('StockDecreaseAfterCorrectTransfer').'</td>';
986 break;
987 case "2":
988 print '<td class="center">'.$langs->trans('StockDecrease').'</td>';
989 break;
990 case "3":
991 print '<td class="center">'.$langs->trans('StockIncrease').'</td>';
992 break;
993 }
994 }
995 if (!empty($arrayfields['origin']['checked'])) {
996 // Origin of movement
997 print '<td class="nowraponall">'.$origin.'</td>';
998 }
999 if (!empty($arrayfields['m.fk_projet']['checked'])) {
1000 // fk_project
1001 print '<td>';
1002 if ($objp->fk_project != 0) {
1003 print $objectlist->get_origin($objp->fk_project, 'project');
1004 }
1005 print '</td>';
1006 }
1007 if (!empty($arrayfields['m.value']['checked'])) {
1008 // Qty
1009 print '<td class="right">';
1010 if ($objp->qty > 0) {
1011 print '<span class="stockmovemententry">+'.$objp->qty.'</span>';
1012 } else {
1013 print '<span class="stockmovementexit">'.$objp->qty.'<span>';
1014 }
1015 print '</td>';
1016 }
1017 if (!empty($arrayfields['m.price']['checked'])) {
1018 // Price
1019 print '<td class="right">';
1020 if ($objp->price != 0) {
1021 print '<span class="opacitymedium">'.price($objp->price).'</span>';
1022 }
1023 print '</td>';
1024 }
1025 // Action column
1026 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1027 print '<td class="nowrap center">';
1028 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1029 $selected = 0;
1030 if (in_array($objp->rowid, $arrayofselected)) {
1031 $selected = 1;
1032 }
1033 print '<input id="cb'.$objp->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$objp->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1034 }
1035 print '</td>';
1036 if (!$i) {
1037 $totalarray['nbfield']++;
1038 }
1039 }
1040
1041 print "</tr>\n";
1042 $i++;
1043 }
1044 if (empty($num)) {
1045 print '<tr><td colspan="'.$savnbfield.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1046 }
1047
1048 $db->free($resql);
1049
1050 print "</table>";
1051 print '</div>';
1052 print "</form>";
1053}
1054
1055// End of page
1056llxFooter();
1057$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:475
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to manage warehouses.
Class to manage standard extra fields.
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:35
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).
Definition date.lib.php:385
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $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, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
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, $morecssdiv='')
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, $sqltoadd='')
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...
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_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.
isModEnabled($module)
Is Dolibarr module enabled.
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.