dolibarr 18.0.6
mo_list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
24// Load Dolibarr environment
25require '../main.inc.php';
26
27require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
28require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
29require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
30require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php';
31
32// load mrp libraries
33require_once __DIR__.'/class/mo.class.php';
34
35// for other modules
36//dol_include_once('/othermodule/class/otherobject.class.php');
37
38// Load translation files required by the page
39$langs->loadLangs(array("mrp", "other"));
40
41$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
42$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
43$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
44$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
45$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
46$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
47$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'molist'; // To manage different context of search
48$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
49$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
50$mode = GETPOST('mode', 'alpha');
51
52$id = GETPOST('id', 'int');
53
54// Load variable for pagination
55$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
56$sortfield = GETPOST('sortfield', 'aZ09comma');
57$sortorder = GETPOST('sortorder', 'aZ09comma');
58$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
59if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
60 // If $page is not defined, or '' or -1 or if we click on clear filters
61 $page = 0;
62}
63$offset = $limit * $page;
64$pageprev = $page - 1;
65$pagenext = $page + 1;
66//if (! $sortfield) $sortfield="p.date_fin";
67//if (! $sortorder) $sortorder="DESC";
68
69// Initialize technical objects
70$object = new Mo($db);
71$extrafields = new ExtraFields($db);
72$diroutputmassaction = $conf->mrp->dir_output.'/temp/massgeneration/'.$user->id;
73$hookmanager->initHooks(array('molist')); // Note that conf->hooks_modules contains array
74
75// Fetch optionals attributes and labels
76$extrafields->fetch_name_optionals_label($object->table_element);
77
78$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
79
80// Default sort order (if not yet defined by previous GETPOST)
81if (!$sortfield) {
82 $sortfield = "t.ref"; // Set here default search field. By default 1st field in definition.
83}
84if (!$sortorder) {
85 $sortorder = "ASC";
86}
87
88// Initialize array of search criterias
89$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
90$search = array();
91foreach ($object->fields as $key => $val) {
92 if (GETPOST('search_'.$key, 'alpha') !== '') {
93 $search[$key] = GETPOST('search_'.$key, 'alpha');
94 }
95 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
96 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
97 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
98 }
99}
100
101// List of fields to search into when doing a "search in all"
102$fieldstosearchall = array();
103foreach ($object->fields as $key => $val) {
104 if (!empty($val['searchall'])) {
105 $fieldstosearchall['t.'.$key] = $val['label'];
106 }
107}
108
109// Definition of array of fields for columns
110$arrayfields = array();
111foreach ($object->fields as $key => $val) {
112 // If $val['visible']==0, then we never show the field
113 if (!empty($val['visible'])) {
114 $visible = (int) dol_eval($val['visible'], 1, 1, '1');
115 $arrayfields['t.'.$key] = array(
116 'label'=>$val['label'],
117 'checked'=>(($visible < 0) ? 0 : 1),
118 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1, 1, '1')),
119 'position'=>$val['position'],
120 'help'=> isset($val['help']) ? $val['help'] : ''
121 );
122 }
123
124 if ($key == 'fk_parent_line') {
125 $visible = (int) dol_eval($val['visible'], 1);
126 $arrayfields['t.'.$key] = array(
127 'label'=>$val['label'],
128 'checked'=>(($visible <= 0) ? 0 : 1),
129 'enabled'=>($visible != 3 && dol_eval($val['enabled'], 1)),
130 'position'=>$val['position'],
131 'help'=> isset($val['help']) ? $val['help'] : ''
132 );
133 }
134}
135// Extra fields
136include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
137
138$object->fields = dol_sort_array($object->fields, 'position');
139$arrayfields = dol_sort_array($arrayfields, 'position');
140
141$permissiontoread = $user->rights->mrp->read;
142$permissiontoadd = $user->rights->mrp->write;
143$permissiontodelete = $user->rights->mrp->delete;
144
145// Security check
146if ($user->socid > 0) {
147 // Protection if external user
149}
150$result = restrictedArea($user, 'mrp');
151
152
153/*
154 * Actions
155 */
156
157if (GETPOST('cancel', 'alpha')) {
158 $action = 'list';
159 $massaction = '';
160}
161if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
162 $massaction = '';
163}
164
165$parameters = array();
166$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
167if ($reshook < 0) {
168 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
169}
170
171if (empty($reshook)) {
172 // Selection of new fields
173 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
174
175 // Purge search criteria
176 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
177 foreach ($object->fields as $key => $val) {
178 $search[$key] = '';
179 if ($key == 'status') {
180 $search[$key] = -1;
181 }
182 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
183 $search[$key.'_dtstart'] = '';
184 $search[$key.'_dtend'] = '';
185 }
186 }
187 $toselect = array();
188 $search_array_options = array();
189 }
190 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
191 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
192 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
193 }
194
195 // Mass actions
196 $objectclass = 'Mo';
197 $objectlabel = 'Mo';
198 $uploaddir = $conf->mrp->dir_output;
199 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
200}
201
202
203
204/*
205 * View
206 */
207
208$form = new Form($db);
209
210$now = dol_now();
211
212//$help_url="EN:Module_Mo|FR:Module_Mo_FR|ES:Módulo_Mo";
213$help_url = '';
214$title = $langs->trans('ListOfManufacturingOrders');
215$morejs = array();
216$morecss = array();
217
218
219// Build and execute select
220// --------------------------------------------------------------------
221$sql = 'SELECT ';
222$sql .= $object->getFieldList('t');
223// Add fields from extrafields
224if (!empty($extrafields->attributes[$object->table_element]['label'])) {
225 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
226 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
227 }
228}
229// Add fields from hooks
230$parameters = array();
231$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
232$sql .= $hookmanager->resPrint;
233$sql = preg_replace('/,\s*$/', '', $sql);
234
235$sqlfields = $sql; // $sql fields to remove for count total
236
237$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
238if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
239 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
240}
241$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_production as lineparent ON t.fk_parent_line = lineparent.rowid";
242$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mrp_mo as moparent ON lineparent.fk_mo = moparent.rowid";
243$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON t.fk_product = p.rowid";
244// Add table from hooks
245$parameters = array();
246$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
247$sql .= $hookmanager->resPrint;
248if ($object->ismultientitymanaged == 1) {
249 $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
250} else {
251 $sql .= " WHERE 1 = 1";
252}
253
254foreach ($search as $key => $val) {
255 if (array_key_exists($key, $object->fields)) {
256 if ($key == 'status' && $search[$key] == -1) {
257 continue;
258 }
259 if ($key == 'fk_parent_line' && $search[$key] != '') {
260 $sql .= natural_search('moparent.ref', $search[$key], 0);
261 continue;
262 }
263
264 if ($key == 'status') {
265 $sql .= natural_search('t.status', $search[$key], 0);
266 continue;
267 }
268
269
270 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
271 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
272 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
273 $search[$key] = '';
274 }
275 $mode_search = 2;
276 }
277 if ($search[$key] != '') {
278 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
279 }
280 } else {
281 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
282 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
283 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
284 if (preg_match('/_dtstart$/', $key)) {
285 $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
286 }
287 if (preg_match('/_dtend$/', $key)) {
288 $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
289 }
290 }
291 }
292 }
293}
294if ($search_all) {
295 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
296}
297//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
298// Add where from extra fields
299include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
300// Add where from hooks
301$parameters = array();
302$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
303$sql .= $hookmanager->resPrint;
304
305/* If a group by is required
306$sql.= " GROUP BY ";
307foreach($object->fields as $key => $val) {
308 $sql .= "t.".$key.", ";
309}
310// Add fields from extrafields
311if (!empty($extrafields->attributes[$object->table_element]['label'])) {
312 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
313 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.", " : "");
314 }
315}
316// Add where from hooks
317$parameters=array();
318$reshook=$hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
319$sql.=$hookmanager->resPrint;
320$sql=preg_replace('/,\s*$/','', $sql);
321*/
322
323// Count total nb of records
324$nbtotalofrecords = '';
325if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
326 /* The fast and low memory method to get and count full list converts the sql into a sql count */
327 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
328 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
329 $resql = $db->query($sqlforcount);
330 if ($resql) {
331 $objforcount = $db->fetch_object($resql);
332 $nbtotalofrecords = $objforcount->nbtotalofrecords;
333 } else {
334 dol_print_error($db);
335 }
336
337 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
338 $page = 0;
339 $offset = 0;
340 }
341 $db->free($resql);
342}
343
344// Complete request and execute it with limit
345$sql .= $db->order($sortfield, $sortorder);
346if ($limit) {
347 $sql .= $db->plimit($limit + 1, $offset);
348}
349
350$resql = $db->query($sql);
351if (!$resql) {
352 dol_print_error($db);
353 exit;
354}
355
356$num = $db->num_rows($resql);
357
358// Direct jump if only one record found
359if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
360 $obj = $db->fetch_object($resql);
361 $id = $obj->rowid;
362 header("Location: ".dol_buildpath('/mrp/mo_card.php', 1).'?id='.$id);
363 exit;
364}
365
366
367// Output page
368// --------------------------------------------------------------------
369
370llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
371
372
373$arrayofselected = is_array($toselect) ? $toselect : array();
374
375$param = '';
376if (!empty($mode)) {
377 $param .= '&mode='.urlencode($mode);
378}
379if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
380 $param .= '&contextpage='.urlencode($contextpage);
381}
382if ($limit > 0 && $limit != $conf->liste_limit) {
383 $param .= '&limit='.((int) $limit);
384}
385foreach ($search as $key => $val) {
386 if (is_array($search[$key]) && count($search[$key])) {
387 foreach ($search[$key] as $skey) {
388 if ($skey != '') {
389 $param .= '&search_'.$key.'[]='.urlencode($skey);
390 }
391 }
392 } elseif ($search[$key] != '') {
393 $param .= '&search_'.$key.'='.urlencode($search[$key]);
394 }
395}
396if ($optioncss != '') {
397 $param .= '&optioncss='.urlencode($optioncss);
398}
399// Add $param from extra fields
400include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
401// Add $param from hooks
402$parameters = array();
403$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
404$param .= $hookmanager->resPrint;
405
406// List of mass actions available
407$arrayofmassactions = array(
408 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
409 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
410 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
411 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
412);
413if ($permissiontodelete) {
414 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
415}
416if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
417 $arrayofmassactions = array();
418}
419$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
420
421print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
422if ($optioncss != '') {
423 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
424}
425print '<input type="hidden" name="token" value="'.newToken().'">';
426print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
427print '<input type="hidden" name="action" value="list">';
428print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
429print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
430print '<input type="hidden" name="page" value="'.$page.'">';
431print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
432print '<input type="hidden" name="mode" value="'.$mode.'">';
433
434$newcardbutton = '';
435$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
436$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
437$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/mrp/mo_card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
438
439print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
440
441// Add code for pre mass action (confirmation or email presend form)
442$topicmail = "SendMoRef";
443$modelmail = "mo";
444$objecttmp = new Mo($db);
445$trackid = 'mo'.$object->id;
446include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
447
448if ($search_all) {
449 foreach ($fieldstosearchall as $key => $val) {
450 $fieldstosearchall[$key] = $langs->trans($val);
451 }
452 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'</div>';
453}
454
455$moreforfilter = '';
456/*$moreforfilter.='<div class="divsearchfield">';
457$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
458$moreforfilter.= '</div>';*/
459
460$parameters = array();
461$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
462if (empty($reshook)) {
463 $moreforfilter .= $hookmanager->resPrint;
464} else {
465 $moreforfilter = $hookmanager->resPrint;
466}
467
468if (!empty($moreforfilter)) {
469 print '<div class="liste_titre liste_titre_bydiv centpercent">';
470 print $moreforfilter;
471 print '</div>';
472}
473
474$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
475$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
476$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
477
478print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
479print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
480
481
482// Fields title search
483// --------------------------------------------------------------------
484print '<tr class="liste_titre">';
485// Action column
486if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
487 print '<td class="liste_titre maxwidthsearch">';
488 $searchpicto = $form->showFilterButtons('left');
489 print $searchpicto;
490 print '</td>';
491}
492foreach ($object->fields as $key => $val) {
493 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
494 if ($key == 'status') {
495 $cssforfield .= ($cssforfield ? ' ' : '').'center';
496 } elseif ($key == 'fk_parent_line') {
497 $cssforfield .= ($cssforfield ? ' ' : '').'center';
498 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
499 $cssforfield .= ($cssforfield ? ' ' : '').'center';
500 } elseif (in_array($val['type'], array('timestamp'))) {
501 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
502 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
503 $cssforfield .= ($cssforfield ? ' ' : '').'right';
504 }
505 if (!empty($arrayfields['t.'.$key]['checked'])) {
506 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').'">';
507 if ($key == 'fk_parent_line') {
508 print '<input type="text" class="flat maxwidth75" name="search_fk_parent_line">';
509 print '</td>';
510 continue;
511 }
512 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
513 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
514 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
515 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', 'maxwidth125', 1);
516 } elseif (!preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
517 print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
518 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
519 print '<div class="nowrap">';
520 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
521 print '</div>';
522 print '<div class="nowrap">';
523 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
524 print '</div>';
525 }
526 print '</td>';
527 }
528}
529// Extra fields
530include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
531
532// Fields from hook
533$parameters = array('arrayfields'=>$arrayfields);
534$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
535print $hookmanager->resPrint;
536// Action column
537if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
538 print '<td class="liste_titre maxwidthsearch">';
539 $searchpicto = $form->showFilterButtons();
540 print $searchpicto;
541 print '</td>';
542}
543print '</tr>'."\n";
544
545$totalarray = array();
546$totalarray['nbfield'] = 0;
547
548
549// Fields title label
550// --------------------------------------------------------------------
551print '<tr class="liste_titre">';
552// Action column
553if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
554 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
555 $totalarray['nbfield']++;
556}
557foreach ($object->fields as $key => $val) {
558 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
559 if ($key == 'status') {
560 $cssforfield .= ($cssforfield ? ' ' : '').'center';
561 } elseif ($key == 'fk_parent_line') {
562 $cssforfield .= ($cssforfield ? ' ' : '').'center';
563 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
564 $cssforfield .= ($cssforfield ? ' ' : '').'center';
565 } elseif (in_array($val['type'], array('timestamp'))) {
566 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
567 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
568 $cssforfield .= ($cssforfield ? ' ' : '').'right';
569 }
570 if (!empty($arrayfields['t.'.$key]['checked'])) {
571 if ($key == "fk_product") {
572 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 'p.ref', '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
573 } else {
574 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
575 }
576 $totalarray['nbfield']++;
577 }
578}
579// Extra fields
580include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
581// Hook fields
582$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
583$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
584print $hookmanager->resPrint;
585// Action column
586if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
587 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
588 $totalarray['nbfield']++;
589}
590print '</tr>'."\n";
591
592
593// Detect if we need a fetch on each output line
594$needToFetchEachLine = 0;
595if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
596 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
597 if (!is_null($val) && preg_match('/\$object/', $val)) {
598 $needToFetchEachLine++; // There is at least one compute field that use $object
599 }
600 }
601}
602
603
604$bom = new BOM($db);
605$product = new Product($db);
606
607// Loop on record
608// --------------------------------------------------------------------
609$i = 0;
610$savnbfield = $totalarray['nbfield'];
611$totalarray = array();
612$totalarray['nbfield'] = 0;
613$imaxinloop = ($limit ? min($num, $limit) : $num);
614while ($i < $imaxinloop) {
615 $obj = $db->fetch_object($resql);
616 if (empty($obj)) {
617 break; // Should not happen
618 }
619
620 // Store properties in $object
621 $object->setVarsFromFetchObj($obj);
622
623 //mode Kanban
624 if ($mode == 'kanban') {
625 if ($i == 0) {
626 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
627 print '<div class="box-flex-container kanban">';
628 }
629 $object->id = $obj->type_id;
630
631 // TODO Use a cache on BOM
632 if ($obj->fk_bom > 0) {
633 $bom->fetch($obj->fk_bom);
634 }
635 if ($obj->fk_product > 0) {
636 $product->fetch($obj->fk_product);
637 }
638
639 // Output Kanban
640 print $object->getKanbanView('', array('bom'=>($obj->fk_bom > 0 ? $bom : null), 'product'=>($obj->fk_product > 0 ? $product: null), 'selected' => in_array($object->id, $arrayofselected)));
641 if ($i == ($imaxinloop - 1)) {
642 print '</div>';
643 print '</td></tr>';
644 }
645 } else {
646 // Show here line of result
647 print '<tr class="oddeven">';
648 // Action column
649 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
650 print '<td class="nowrap center">';
651 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
652 $selected = 0;
653 if (in_array($object->id, $arrayofselected)) {
654 $selected = 1;
655 }
656 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
657 }
658 print '</td>';
659 }
660 foreach ($object->fields as $key => $val) {
661 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
662 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
663 $cssforfield .= ($cssforfield ? ' ' : '').'center';
664 } elseif ($key == 'status') {
665 $cssforfield .= ($cssforfield ? ' ' : '').'center';
666 } elseif ($key == 'fk_parent_line') {
667 $cssforfield .= ($cssforfield ? ' ' : '').'center';
668 }
669
670 if (in_array($val['type'], array('timestamp'))) {
671 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
672 } elseif ($key == 'ref') {
673 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
674 }
675
676 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
677 $cssforfield .= ($cssforfield ? ' ' : '').'right';
678 }
679
680 if (!empty($arrayfields['t.'.$key]['checked'])) {
681 print '<td'.($cssforfield ? ' class="'.$cssforfield.'"' : '').'>';
682 if ($key == 'status') {
683 print $object->getLibStatut(5);
684 } elseif ($key == 'fk_parent_line') {
685 $moparent = $object->getMoParent();
686 if (is_object($moparent)) print $moparent->getNomUrl(1);
687 } elseif ($key == 'rowid') {
688 print $object->showOutputField($val, $key, $object->id, '');
689 } else {
690 print $object->showOutputField($val, $key, $object->$key, '');
691 }
692 print '</td>';
693 if (!$i) {
694 $totalarray['nbfield']++;
695 }
696 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
697 if (!$i) {
698 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
699 }
700 if (!isset($totalarray['val'])) {
701 $totalarray['val'] = array();
702 }
703 if (!isset($totalarray['val']['t.'.$key])) {
704 $totalarray['val']['t.'.$key] = 0;
705 }
706 $totalarray['val']['t.'.$key] += $object->$key;
707 }
708 }
709 }
710 // Extra fields
711 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
712 // Fields from hook
713 $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
714 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
715 print $hookmanager->resPrint;
716 // Action column
717 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
718 print '<td class="nowrap center">';
719 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
720 $selected = 0;
721 if (in_array($object->id, $arrayofselected)) {
722 $selected = 1;
723 }
724 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
725 }
726 print '</td>';
727 }
728 if (!$i) {
729 $totalarray['nbfield']++;
730 }
731
732 print '</tr>'."\n";
733 }
734 $i++;
735}
736
737// Show total line
738include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
739
740
741// If no record found
742if ($num == 0) {
743 $colspan = 1;
744 foreach ($arrayfields as $key => $val) {
745 if (!empty($val['checked'])) {
746 $colspan++;
747 }
748 }
749 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
750}
751
752
753$db->free($resql);
754
755$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
756$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
757print $hookmanager->resPrint;
758
759print '</table>'."\n";
760print '</div>'."\n";
761
762print '</form>'."\n";
763
764if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
765 $hidegeneratedfilelistifempty = 1;
766 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
767 $hidegeneratedfilelistifempty = 0;
768 }
769
770 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
771 $formfile = new FormFile($db);
772
773 // Show list of available documents
774 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
775 $urlsource .= str_replace('&amp;', '&', $param);
776
777 $filedir = $diroutputmassaction;
778 $genallowed = $permissiontoread;
779 $delallowed = $permissiontoadd;
780
781 print $formfile->showdocuments('massfilesarea_mrp', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
782}
783
784// End of page
785llxFooter();
786$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:56
llxFooter()
Empty footer.
Definition wrapper.php:70
Class for BOM.
Definition bom.class.php:39
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class for Mo.
Definition mo.class.php:34
Class to manage products or services.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
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...
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
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.
print_barre_liste($titre, $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.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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...
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.