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
25 require '../main.inc.php';
26 
27 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
28 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
29 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
30 require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php';
31 
32 // load mrp libraries
33 require_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');
59 if (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)
81 if (!$sortfield) {
82  $sortfield = "t.ref"; // Set here default search field. By default 1st field in definition.
83 }
84 if (!$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();
91 foreach ($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();
103 foreach ($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();
111 foreach ($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
136 include 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
146 if ($user->socid > 0) {
147  // Protection if external user
148  accessforbidden();
149 }
150 $result = restrictedArea($user, 'mrp');
151 
152 
153 /*
154  * Actions
155  */
156 
157 if (GETPOST('cancel', 'alpha')) {
158  $action = 'list';
159  $massaction = '';
160 }
161 if (!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
167 if ($reshook < 0) {
168  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
169 }
170 
171 if (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
224 if (!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";
238 if (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;
248 if ($object->ismultientitymanaged == 1) {
249  $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
250 } else {
251  $sql .= " WHERE 1 = 1";
252 }
253 
254 foreach ($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 }
294 if ($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
299 include 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 ";
307 foreach($object->fields as $key => $val) {
308  $sql .= "t.".$key.", ";
309 }
310 // Add fields from extrafields
311 if (!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 = '';
325 if (!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);
346 if ($limit) {
347  $sql .= $db->plimit($limit + 1, $offset);
348 }
349 
350 $resql = $db->query($sql);
351 if (!$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
359 if ($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 
370 llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
371 
372 
373 $arrayofselected = is_array($toselect) ? $toselect : array();
374 
375 $param = '';
376 if (!empty($mode)) {
377  $param .= '&mode='.urlencode($mode);
378 }
379 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
380  $param .= '&contextpage='.urlencode($contextpage);
381 }
382 if ($limit > 0 && $limit != $conf->liste_limit) {
383  $param .= '&limit='.((int) $limit);
384 }
385 foreach ($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 }
396 if ($optioncss != '') {
397  $param .= '&optioncss='.urlencode($optioncss);
398 }
399 // Add $param from extra fields
400 include 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 );
413 if ($permissiontodelete) {
414  $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
415 }
416 if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
417  $arrayofmassactions = array();
418 }
419 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
420 
421 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
422 if ($optioncss != '') {
423  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
424 }
425 print '<input type="hidden" name="token" value="'.newToken().'">';
426 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
427 print '<input type="hidden" name="action" value="list">';
428 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
429 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
430 print '<input type="hidden" name="page" value="'.$page.'">';
431 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
432 print '<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 
439 print_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;
446 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
447 
448 if ($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
462 if (empty($reshook)) {
463  $moreforfilter .= $hookmanager->resPrint;
464 } else {
465  $moreforfilter = $hookmanager->resPrint;
466 }
467 
468 if (!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 
478 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
479 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
480 
481 
482 // Fields title search
483 // --------------------------------------------------------------------
484 print '<tr class="liste_titre">';
485 // Action column
486 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
487  print '<td class="liste_titre maxwidthsearch">';
488  $searchpicto = $form->showFilterButtons('left');
489  print $searchpicto;
490  print '</td>';
491 }
492 foreach ($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
530 include 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
535 print $hookmanager->resPrint;
536 // Action column
537 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
538  print '<td class="liste_titre maxwidthsearch">';
539  $searchpicto = $form->showFilterButtons();
540  print $searchpicto;
541  print '</td>';
542 }
543 print '</tr>'."\n";
544 
545 $totalarray = array();
546 $totalarray['nbfield'] = 0;
547 
548 
549 // Fields title label
550 // --------------------------------------------------------------------
551 print '<tr class="liste_titre">';
552 // Action column
553 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
554  print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
555  $totalarray['nbfield']++;
556 }
557 foreach ($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
580 include 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
584 print $hookmanager->resPrint;
585 // Action column
586 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
587  print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
588  $totalarray['nbfield']++;
589 }
590 print '</tr>'."\n";
591 
592 
593 // Detect if we need a fetch on each output line
594 $needToFetchEachLine = 0;
595 if (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);
614 while ($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
738 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
739 
740 
741 // If no record found
742 if ($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
757 print $hookmanager->resPrint;
758 
759 print '</table>'."\n";
760 print '</div>'."\n";
761 
762 print '</form>'."\n";
763 
764 if (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
785 llxFooter();
786 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
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.
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.