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