dolibarr 20.0.0
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2014 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2020 Tobias Sekan <tobias.sekan@startmail.com>
7 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Load Dolibarr environment
30require '../../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
32if (isModEnabled('category')) {
33 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
35}
36
37// Load translation files required by the page
38$langs->loadLangs(array("stocks", "other"));
39
40$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ...
41$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
42$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
43$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
44$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
45$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
46$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'stocklist'; // To manage different context of search
47$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
48$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
49$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
50
51$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
52$search_ref = GETPOST("sref", "alpha") ? GETPOST("sref", "alpha") : GETPOST("search_ref", "alpha");
53$search_label = GETPOST("snom", "alpha") ? GETPOST("snom", "alpha") : GETPOST("search_label", "alpha");
54$search_status = GETPOST("search_status", "intcomma");
55
56$search_category_list = array();
57if (isModEnabled('category')) {
58 $search_category_list = GETPOST("search_category_".Categorie::TYPE_WAREHOUSE."_list", "array");
59}
60
61// Load variable for pagination
62$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
63$sortfield = GETPOST('sortfield', 'aZ09comma');
64$sortorder = GETPOST('sortorder', 'aZ09comma');
65$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
66if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
67 // If $page is not defined, or '' or -1 or if we click on clear filters
68 $page = 0;
69}
70// Initialize technical objects
71$offset = $limit * $page;
72$pageprev = $page - 1;
73$pagenext = $page + 1;
74if (!$sortfield) {
75 $sortfield = "t.ref";
76}
77if (!$sortorder) {
78 $sortorder = "ASC";
79}
80
81// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
82$object = new Entrepot($db);
83$extrafields = new ExtraFields($db);
84$diroutputmassaction = $conf->stock->dir_output.'/temp/massgeneration/'.$user->id;
85$hookmanager->initHooks(array($contextpage));
86
87// Fetch optionals attributes and labels
88$extrafields->fetch_name_optionals_label($object->table_element);
89
90$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
91
92// Initialize array of search criteria
93$search_all = GETPOST("search_all", 'alphanohtml');
94$search = array();
95foreach ($object->fields as $key => $val) {
96 $search_key = $key;
97 if ($search_key == 'statut') {
98 $search_key = 'status'; // remove this after refactor entrepot.class property statut to status
99 }
100 if (GETPOST('search_'.$search_key, 'alpha') !== '') {
101 $search[$search_key] = GETPOST('search_'.$search_key, 'alpha');
102 }
103}
104
105// List of fields to search into when doing a "search in all"
106$fieldstosearchall = array();
107foreach ($object->fields as $key => $val) {
108 if (!empty($val['searchall'])) {
109 $fieldstosearchall['t.'.$key] = $val['label'];
110 }
111}
112
113// Definition of array of fields for columns
114$arrayfields = array(
115 'stockqty' => array('type' => 'float', 'label' => 'PhysicalStock', 'enabled' => 1, 'visible' => -2, 'checked' => 0, 'position' => 170),
116 'estimatedvalue' => array('type' => 'float', 'label' => 'EstimatedStockValue', 'enabled' => 1, 'visible' => 1, 'checked' => 1, 'position' => 171),
117 'estimatedstockvaluesell' => array('type' => 'float', 'label' => 'EstimatedStockValueSell', 'enabled' => 1, 'checked' => 1, 'visible' => 2, 'position' => 172),
118);
119foreach ($object->fields as $key => $val) {
120 // If $val['visible']==0, then we never show the field
121 if (!empty($val['visible'])) {
122 $visible = (int) dol_eval($val['visible'], 1);
123 $arrayfields['t.'.$key] = array(
124 'label' => $val['label'],
125 'checked' => (($visible < 0) ? 0 : 1),
126 'enabled' => (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
127 'position' => $val['position'],
128 'help' => isset($val['help']) ? $val['help'] : ''
129 );
130 }
131}
132// Extra fields
133include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
134
135$object->fields = dol_sort_array($object->fields, 'position');
136$arrayfields = dol_sort_array($arrayfields, 'position');
137
138$permissiontoread = $user->hasRight('stock', 'lire');
139$permissiontodelete = $user->hasRight('stock', 'supprimer');
140$permissiontoadd = $user->hasRight('stock', 'creer');
141
142// Security check
143$result = restrictedArea($user, 'stock');
144
145
146/*
147 * Actions
148 */
149
150if (GETPOST('cancel', 'alpha')) {
151 $action = 'list';
152 $massaction = '';
153}
154if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
155 $massaction = '';
156}
157
158$parameters = array();
159$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
160if ($reshook < 0) {
161 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
162}
163
164if (empty($reshook)) {
165 // Selection of new fields
166 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
167
168 // Purge search criteria
169 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
170 foreach ($object->fields as $key => $val) {
171 $search[$key] = '';
172 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
173 $search[$key.'_dtstart'] = '';
174 $search[$key.'_dtend'] = '';
175 }
176 }
177 $toselect = array();
178 $search_array_options = array();
179 $search_category_list = array();
180 }
181 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
182 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
183 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
184 }
185
186 // Mass actions
187 $objectclass = 'Entrepot';
188 $objectlabel = 'Warehouse';
189 $uploaddir = $conf->stock->dir_output;
190 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
191}
192
193
194/*
195 * View
196 */
197
198$form = new Form($db);
199$warehouse = new Entrepot($db);
200
201$now = dol_now();
202
203$title = $langs->trans("Warehouses");
204$help_url = 'EN:Module_Stocks_En|FR:Module_Stock|ES:M&oacute;dulo_Stocks';
205
206
207// Build and execute select
208// --------------------------------------------------------------------
209$sql = 'SELECT ';
210$sql .= $object->getFieldList('t');
211// Add fields from extrafields
212if (!empty($extrafields->attributes[$object->table_element]['label'])) {
213 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
214 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
215 }
216}
217
218//For Multicompany PMP per entity
219$separatedPMP = false;
220if (getDolGlobalString('MULTICOMPANY_PRODUCT_SHARING_ENABLED') && getDolGlobalString('MULTICOMPANY_PMP_PER_ENTITY_ENABLED')) {
221 $separatedPMP = true;
222 $sql .= ", SUM(pa.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue, SUM(ps.reel) as stockqty";
223} else {
224 $sql .= ", SUM(p.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue, SUM(ps.reel) as stockqty";
225}
226
227
228// Add fields from hooks
229$parameters = array();
230$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
231$sql .= $hookmanager->resPrint;
232$sql = preg_replace('/,\s*$/', '', $sql);
233
234$sqlfields = $sql; // $sql fields to remove for count total
235
236$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
237if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
238 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
239}
240$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps ON t.rowid = ps.fk_entrepot";
241$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON ps.fk_product = p.rowid";
242$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as c_dep ON c_dep.rowid = t.fk_departement";
243$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as ccount ON ccount.rowid = t.fk_pays";
244if ($separatedPMP) {
245 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_perentity as pa ON pa.fk_product = p.rowid AND pa.fk_product = ps.fk_product AND pa.entity = ". (int) $conf->entity;
246}
247$sql .= " WHERE t.entity IN (".getEntity('stock').")";
248foreach ($search as $key => $val) {
249 if (array_key_exists($key, $object->fields)) {
250 $class_key = $key;
251 if ($class_key == 'status') {
252 $class_key = 'statut'; // remove this after refactoring entrepot.class property statut to status
253 }
254 if (($key == 'status' && $search[$key] == -1) || $key == 'entity') {
255 continue;
256 }
257 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
258 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
259 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
260 $search[$key] = '';
261 }
262 $mode_search = 2;
263 }
264 if ($search[$key] != '') {
265 $sql .= natural_search((($key == "ref") ? "t.ref" : "t.".$class_key), $search[$key], (($key == 'status') ? 2 : $mode_search));
266 }
267 } else {
268 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
269 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
270 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
271 if (preg_match('/_dtstart$/', $key)) {
272 $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
273 }
274 if (preg_match('/_dtend$/', $key)) {
275 $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
276 }
277 }
278 }
279 }
280}
281if ($search_all) {
282 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
283}
284// Search for tag/category ($searchCategoryWarehouseList is an array of ID)
285$searchCategoryWarehouseList = $search_category_list;
286$searchCategoryWarehouseOperator = 0;
287if (!empty($searchCategoryWarehouseList)) {
288 $searchCategoryWarehouseSqlList = array();
289 $listofcategoryid = '';
290 foreach ($searchCategoryWarehouseList as $searchCategoryWarehouse) {
291 if (intval($searchCategoryWarehouse) == -2) {
292 $searchCategoryWarehouseSqlList[] = " NOT EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE t.rowid = ck.fk_warehouse)";
293 } elseif (intval($searchCategoryWarehouse) > 0) {
294 if ($searchCategoryWarehouseOperator == 0) {
295 $searchCategoryWarehouseSqlList[] = " EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE t.rowid = ck.fk_warehouse AND ck.fk_categorie = ".((int) $searchCategoryWarehouse).")";
296 } else {
297 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryWarehouse);
298 }
299 }
300 }
301 if ($listofcategoryid) {
302 $searchCategoryWarehouseSqlList[] = " EXISTS (SELECT ck.fk_warehouse FROM ".MAIN_DB_PREFIX."categorie_warehouse as ck WHERE t.rowid = ck.fk_warehouse AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
303 }
304 if ($searchCategoryWarehouseOperator == 1) {
305 if (!empty($searchCategoryWarehouseSqlList)) {
306 $sql .= " AND (".implode(' OR ', $searchCategoryWarehouseSqlList).")";
307 }
308 } else {
309 if (!empty($searchCategoryWarehouseSqlList)) {
310 $sql .= " AND (".implode(' AND ', $searchCategoryWarehouseSqlList).")";
311 }
312 }
313}
314
315// Add where from extra fields
316include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
317// Add where from hooks
318$parameters = array();
319$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
320$sql .= $hookmanager->resPrint;
321
322$sql .= " GROUP BY ";
323foreach ($object->fields as $key => $val) {
324 $sql .= "t.".$db->escape($key).", ";
325}
326// Add fields from extrafields
327if (!empty($extrafields->attributes[$object->table_element]['label'])) {
328 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
329 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
330 }
331}
332// Add groupby from hooks
333$parameters = array();
334$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters); // Note that $action and $object may have been modified by hook
335$sql .= $hookmanager->resPrint;
336$sql = preg_replace('/,\s*$/', '', $sql);
337//print $sql;
338
339$result = $db->query($sql);
340if ($result) {
341 $totalnboflines = $db->num_rows($result);
342 // fetch totals
343 $line = $total = $totalsell = $totalStock = 0;
344 while ($line < $totalnboflines) {
345 $objp = $db->fetch_object($result);
346 $total += $objp->estimatedvalue;
347 $totalsell += $objp->sellvalue;
348 $totalStock += $objp->stockqty;
349 $line++;
350 }
351 $totalarray['val']['stockqty'] = price2num($totalStock, 'MS');
352 $totalarray['val']['estimatedvalue'] = price2num($total, 'MT');
353 $totalarray['val']['estimatedstockvaluesell'] = price2num($totalsell, 'MT');
354}
355
356// Count total nb of records
357$nbtotalofrecords = '';
358if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
359 /* The fast and low memory method to get and count full list converts the sql into a sql count */
360 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
361 $sqlforcount = preg_replace('/LEFT JOIN [a-z]+_product_stock as ps ON t.rowid = ps.fk_entrepot LEFT JOIN [a-z]+_product as p ON ps.fk_product = p.rowid/', '', $sqlforcount);
362 $sqlforcount = preg_replace('/LEFT JOIN [a-z]+_product_perentity as pa ON pa.fk_product = p.rowid AND pa.fk_product = ps.fk_product AND pa.entity = -?[0-9]+/', '', $sqlforcount);
363 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
364
365 $resql = $db->query($sqlforcount);
366 if ($resql) {
367 $objforcount = $db->fetch_object($resql);
368 $nbtotalofrecords = $objforcount->nbtotalofrecords;
369 } else {
370 dol_print_error($db);
371 }
372
373 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
374 $page = 0;
375 $offset = 0;
376 }
377 $db->free($resql);
378}
379
380// Complete request and execute it with limit
381$sql .= $db->order($sortfield, $sortorder);
382if ($limit) {
383 $sql .= $db->plimit($limit + 1, $offset);
384}
385
386$resql = $db->query($sql);
387if (!$resql) {
388 dol_print_error($db);
389 exit;
390}
391
392$num = $db->num_rows($resql);
393
394// Direct jump if only one record found
395if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
396 $obj = $db->fetch_object($resql);
397 $id = $obj->rowid;
398 header("Location: ".DOL_URL_ROOT.'/product/stock/card.php?id='.$id);
399 exit;
400}
401
402
403// Output page
404// --------------------------------------------------------------------
405
406llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-product page-stock_list');
407
408$arrayofselected = is_array($toselect) ? $toselect : array();
409
410$param = '';
411if (!empty($mode)) {
412 $param .= '&mode='.urlencode($mode);
413}
414if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
415 $param .= '&contextpage='.urlencode($contextpage);
416}
417if ($limit > 0 && $limit != $conf->liste_limit) {
418 $param .= '&limit='.((int) $limit);
419}
420if ($optioncss != '') {
421 $param .= '&optioncss='.urlencode($optioncss);
422}
423foreach ($search as $key => $val) {
424 if (is_array($search[$key])) {
425 foreach ($search[$key] as $skey) {
426 if ($skey != '') {
427 $param .= '&search_'.$key.'[]='.urlencode($skey);
428 }
429 }
430 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
431 $param .= '&search_'.$key.'month='.(GETPOSTINT('search_'.$key.'month'));
432 $param .= '&search_'.$key.'day='.(GETPOSTINT('search_'.$key.'day'));
433 $param .= '&search_'.$key.'year='.(GETPOSTINT('search_'.$key.'year'));
434 } elseif ($search[$key] != '') {
435 $param .= '&search_'.$key.'='.urlencode($search[$key]);
436 }
437}
438// Add $param from extra fields
439include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
440// Add $param from hooks
441$parameters = array('param' => &$param);
442$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
443$param .= $hookmanager->resPrint;
444
445// List of mass actions available
446$arrayofmassactions = array(
447 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
448 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
449);
450//if ($user->rights->stock->supprimer) $arrayofmassactions['predelete']=img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
451if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete','preaffecttag'))) {
452 $arrayofmassactions = array();
453}
454if (isModEnabled('category') && $user->hasRight('stock', 'creer')) {
455 $arrayofmassactions['preaffecttag'] = img_picto('', 'label', 'class="pictofixedwidth"').$langs->trans("AffectTag");
456}
457$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
458
459print '<form action="'.$_SERVER["PHP_SELF"].'" id="searchFormList" method="POST" name="formulaire">';
460if ($optioncss != '') {
461 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
462}
463print '<input type="hidden" name="token" value="'.newToken().'">';
464print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
465print '<input type="hidden" name="action" value="list">';
466print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
467print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
468print '<input type="hidden" name="page" value="'.$page.'">';
469print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
470print '<input type="hidden" name="page_y" value="">';
471print '<input type="hidden" name="mode" value="'.$mode.'">';
472
473
474$newcardbutton = '';
475$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'));
476$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'));
477$newcardbutton .= dolGetButtonTitleSeparator();
478$newcardbutton .= dolGetButtonTitle($langs->trans('MenuNewWarehouse'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/stock/card.php?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $user->hasRight('stock', 'creer'));
479
480print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'stock', 0, $newcardbutton, '', $limit, 0, 0, 1);
481
482// Add code for pre mass action (confirmation or email presend form)
483$topicmail = "Information";
484$modelmail = "warehouse";
485$objecttmp = new Entrepot($db);
486$trackid = 'ware'.$object->id;
487include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
488
489
490if ($search_all) {
491 $setupstring = '';
492 foreach ($fieldstosearchall as $key => $val) {
493 $fieldstosearchall[$key] = $langs->trans($val);
494 $setupstring .= $key."=".$val.";";
495 }
496 print '<!-- Search done like if STOCK_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
497 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $sall).implode(', ', $fieldstosearchall).'</div>';
498}
499
500$moreforfilter = '';
501
502if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
503 $formcategory = new FormCategory($db);
504 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_WAREHOUSE, $search_category_list);
505}
506
507/*$moreforfilter.='<div class="divsearchfield">';
508 $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
509 $moreforfilter.= '</div>';*/
510
511$parameters = array();
512$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
513if (empty($reshook)) {
514 $moreforfilter .= $hookmanager->resPrint;
515} else {
516 $moreforfilter = $hookmanager->resPrint;
517}
518
519if (!empty($moreforfilter)) {
520 print '<div class="liste_titre liste_titre_bydiv centpercent">';
521 print $moreforfilter;
522 $parameters = array();
523 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
524 print $hookmanager->resPrint;
525 print '</div>';
526}
527
528$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
529$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
530$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
531$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
532
533print '<div class="div-table-responsive">';
534print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
535
536// Fields title search
537// --------------------------------------------------------------------
538print '<tr class="liste_titre_filter">';
539// Action column
540if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
541 print '<td class="liste_titre center maxwidthsearch">';
542 $searchpicto = $form->showFilterButtons('left');
543 print $searchpicto;
544 print '</td>';
545}
546foreach ($object->fields as $key => $val) {
547 if ($key == 'statut') {
548 continue;
549 }
550 $searchkey = empty($search[$key]) ? '' : $search[$key];
551 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
552 if ($key == 'status') {
553 $cssforfield .= ($cssforfield ? ' ' : '').'center';
554 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
555 $cssforfield .= ($cssforfield ? ' ' : '').'center';
556 } elseif (in_array($val['type'], array('timestamp'))) {
557 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
558 } 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'])) {
559 $cssforfield .= ($cssforfield ? ' ' : '').'right';
560 }
561 if (!empty($arrayfields['t.'.$key]['checked'])) {
562 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
563 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
564 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);
565 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
566 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
567 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
568 print '<div class="nowrap">';
569 print $form->selectDate(isset($search[$key.'_dtstart']) ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
570 print '</div>';
571 print '<div class="nowrap">';
572 print $form->selectDate(isset($search[$key.'_dtend']) ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
573 print '</div>';
574 } elseif ($key == 'lang') {
575 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
576 $formadmin = new FormAdmin($db);
577 print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth100imp maxwidth125', 2);
578 } else {
579 print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
580 }
581 print '</td>';
582 }
583}
584
585if (!empty($arrayfields["stockqty"]['checked'])) {
586 print '<td class="liste_titre"></td>';
587}
588
589if (!empty($arrayfields["estimatedvalue"]['checked'])) {
590 print '<td class="liste_titre"></td>';
591}
592
593if (!empty($arrayfields["estimatedstockvaluesell"]['checked'])) {
594 print '<td class="liste_titre"></td>';
595}
596
597// Extra fields
598include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
599
600// Fields from hook
601$parameters = array('arrayfields' => $arrayfields);
602$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
603print $hookmanager->resPrint;
604
605// Status
606if (!empty($arrayfields['t.statut']['checked'])) {
607 print '<td class="liste_titre center parentonrightofpage">';
608 print $form->selectarray('search_status', $warehouse->labelStatus, $search_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status width100 onrightofpage');
609 print '</td>';
610}
611
612// Action column
613if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
614 print '<td class="liste_titre center maxwidthsearch">';
615 $searchpicto = $form->showFilterButtons();
616 print $searchpicto;
617 print '</td>';
618}
619print '</tr>'."\n";
620
621$totalarray = array();
622$totalarray['nbfield'] = 0;
623
624// Fields title label
625// --------------------------------------------------------------------
626print '<tr class="liste_titre">';
627// Action column
628if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
629 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
630 $totalarray['nbfield']++;
631}
632foreach ($object->fields as $key => $val) {
633 if ($key == 'statut') {
634 continue;
635 }
636 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
637 if ($key == 'status') {
638 $cssforfield .= ($cssforfield ? ' ' : '').'center';
639 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
640 $cssforfield .= ($cssforfield ? ' ' : '').'center';
641 } elseif (in_array($val['type'], array('timestamp'))) {
642 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
643 } 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'])) {
644 $cssforfield .= ($cssforfield ? ' ' : '').'right';
645 }
646 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
647 if (!empty($arrayfields['t.'.$key]['checked'])) {
648 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n";
649 $totalarray['nbfield']++;
650 }
651}
652
653if (!empty($arrayfields["stockqty"]['checked'])) {
654 print_liste_field_titre("PhysicalStock", $_SERVER["PHP_SELF"], "stockqty", '', $param, '', $sortfield, $sortorder, 'right ');
655 $totalarray['nbfield']++;
656 $totalarray['type'][$totalarray['nbfield']] = 'stock';
657}
658
659if (!empty($arrayfields["estimatedvalue"]['checked'])) {
660 print_liste_field_titre("EstimatedStockValue", $_SERVER["PHP_SELF"], "estimatedvalue", '', $param, '', $sortfield, $sortorder, 'right ');
661 $totalarray['nbfield']++;
662 $totalarray['type'][$totalarray['nbfield']] = 'price';
663}
664
665if (!empty($arrayfields["estimatedstockvaluesell"]['checked'])) {
666 print_liste_field_titre("EstimatedStockValueSell", $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'right ');
667 $totalarray['nbfield']++;
668 $totalarray['type'][$totalarray['nbfield']] = 'price';
669}
670
671// Extra fields
672include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
673
674// Hook fields
675$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
676$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
677print $hookmanager->resPrint;
678
679if (!empty($arrayfields['t.statut']['checked'])) {
680 print_liste_field_titre($arrayfields['t.statut']['label'], $_SERVER["PHP_SELF"], "t.statut", '', $param, '', $sortfield, $sortorder, 'center ');
681 $totalarray['nbfield']++;
682}
683
684// Action column
685if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
686 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
687 $totalarray['nbfield']++;
688}
689print '</tr>'."\n";
690
691$warehouse = new Entrepot($db);
692
693// Loop on record
694// --------------------------------------------------------------------
695$i = 0;
696$savnbfield = $totalarray['nbfield'];
697$totalarray['nbfield'] = 0;
698$imaxinloop = ($limit ? min($num, $limit) : $num);
699while ($i < $imaxinloop) {
700 $obj = $db->fetch_object($resql);
701 if (empty($obj)) {
702 break; // Should not happen
703 }
704
705 // Store properties in $object
706 $warehouse->setVarsFromFetchObj($obj);
707
708 $warehouse->label = $warehouse->ref;
709 $warehouse->sellvalue = $obj->sellvalue;
710
711 $object = $warehouse;
712
713 if ($mode == 'kanban') {
714 if ($i == 0) {
715 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
716 print '<div class="box-flex-container kanban">';
717 }
718 // Output Kanban
719 $selected = -1;
720 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
721 $selected = 0;
722 if (in_array($object->id, $arrayofselected)) {
723 $selected = 1;
724 }
725 }
726 print $object->getKanbanView('', array('selected' => $selected));
727 if ($i == ($imaxinloop - 1)) {
728 print '</div>';
729 print '</td></tr>';
730 }
731 } else {
732 // Show line of result
733 $j = 0;
734 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
735
736 // Action column
737 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
738 print '<td class="nowrap center">';
739 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
740 $selected = 0;
741 if (in_array($object->id, $arrayofselected)) {
742 $selected = 1;
743 }
744 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
745 }
746 print '</td>';
747 if (!$i) {
748 $totalarray['nbfield']++;
749 }
750 }
751 foreach ($object->fields as $key => $val) {
752 if ($key == 'statut') {
753 continue;
754 }
755 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
756 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
757 $cssforfield .= ($cssforfield ? ' ' : '').'center';
758 } elseif ($key == 'status') {
759 $cssforfield .= ($cssforfield ? ' ' : '').'center';
760 }
761
762 if (in_array($val['type'], array('timestamp'))) {
763 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
764 } elseif ($key == 'ref') {
765 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
766 }
767
768 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && empty($val['arrayofkeyval'])) {
769 $cssforfield .= ($cssforfield ? ' ' : '').'right';
770 }
771 if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) {
772 $cssforfield = 'tdoverflowmax100';
773 }
774
775 if (!empty($arrayfields['t.'.$key]['checked'])) {
776 print '<td'.($cssforfield ? ' class="'.$cssforfield.(preg_match('/tdoverflow/', $cssforfield) ? ' classfortooltip' : '').'"' : '');
777 if (preg_match('/tdoverflow/', $cssforfield) && !is_numeric($object->$key)) {
778 print ' title="'.dol_escape_htmltag($object->$key).'"';
779 }
780 print '>';
781 if ($key == 'statut') {
782 print $object->getLibStatut(5);
783 }
784 if ($key == 'phone') {
785 print dol_print_phone($object->phone, '', 0, $object->id, 'AC_TEL');
786 } elseif ($key == 'fax') {
787 print dol_print_phone($object->fax, '', 0, $object->id, 'AC_FAX');
788 } else {
789 print $warehouse->showOutputField($val, $key, $object->$key, '');
790 }
791 print '</td>';
792 if (!$i) {
793 $totalarray['nbfield']++;
794 }
795 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
796 if (!$i) {
797 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
798 }
799 if (!isset($totalarray['val'])) {
800 $totalarray['val'] = array();
801 }
802 if (!isset($totalarray['val']['t.'.$key])) {
803 $totalarray['val']['t.'.$key] = 0;
804 }
805 $totalarray['val']['t.'.$key] += $object->$key;
806 }
807 }
808 }
809
810 // Stock qty
811 if (!empty($arrayfields["stockqty"]['checked'])) {
812 print '<td class="right">'.price(price2num($obj->stockqty, 'MS')).'</td>';
813 if (!$i) {
814 $totalarray['nbfield']++;
815 }
816 if (!$i) {
817 $totalarray['pos'][$totalarray['nbfield']] = 'stockqty';
818 }
819 }
820
821 // PMP value
822 if (!empty($arrayfields["estimatedvalue"]['checked'])) {
823 print '<td class="right">';
824 if (price2num($obj->estimatedvalue, 'MT')) {
825 print '<span class="amount">'.price(price2num($obj->estimatedvalue, 'MT'), 1).'</span>';
826 } else {
827 print '';
828 }
829 print '</td>';
830 if (!$i) {
831 $totalarray['nbfield']++;
832 }
833 if (!$i) {
834 $totalarray['pos'][$totalarray['nbfield']] = 'estimatedvalue';
835 }
836 }
837
838 // Selling value
839 if (!empty($arrayfields["estimatedstockvaluesell"]['checked'])) {
840 print '<td class="right">';
841 if (!getDolGlobalString('PRODUIT_MULTIPRICES')) {
842 if ($obj->sellvalue) {
843 print '<span class="amount">'.price(price2num($obj->sellvalue, 'MT'), 1).'</span>';
844 }
845 } else {
846 $htmltext = $langs->trans("OptionMULTIPRICESIsOn");
847 print $form->textwithtooltip('<span class="opacitymedium">'.$langs->trans("Variable").'</span>', $htmltext);
848 }
849 print '</td>';
850 if (!$i) {
851 $totalarray['nbfield']++;
852 }
853 if (!$i) {
854 $totalarray['pos'][$totalarray['nbfield']] = 'estimatedstockvaluesell';
855 }
856 }
857
858 // Extra fields
859 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
860 // Fields from hook
861 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
862 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
863 print $hookmanager->resPrint;
864
865 // Status
866 if (!empty($arrayfields['t.statut']['checked'])) {
867 print '<td class="center">'.$warehouse->LibStatut($obj->statut, 5).'</td>';
868 if (!$i) {
869 $totalarray['nbfield']++;
870 }
871 }
872
873 // Action column
874 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
875 print '<td class="nowrap center">';
876 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
877 $selected = 0;
878 if (in_array($object->id, $arrayofselected)) {
879 $selected = 1;
880 }
881 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
882 }
883 print '</td>';
884 if (!$i) {
885 $totalarray['nbfield']++;
886 }
887 }
888
889 print '</tr>'."\n";
890 }
891
892 $i++;
893}
894
895if ($totalnboflines - $offset <= $limit) {
896 // Show total line
897 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
898}
899
900// If no record found
901if ($num == 0) {
902 $colspan = 1;
903 foreach ($arrayfields as $key => $val) {
904 if (!empty($val['checked'])) {
905 $colspan++;
906 }
907 }
908 print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
909}
910
911$db->free($resql);
912
913$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
914$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object); // Note that $action and $object may have been modified by hook
915print $hookmanager->resPrint;
916
917print '</table>'."\n";
918print '</div>'."\n";
919
920print '</form>'."\n";
921
922if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
923 $hidegeneratedfilelistifempty = 1;
924 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
925 $hidegeneratedfilelistifempty = 0;
926 }
927
928 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
929 $formfile = new FormFile($db);
930
931 // Show list of available documents
932 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
933 $urlsource .= str_replace('&amp;', '&', $param);
934
935 $filedir = $diroutputmassaction;
936 $genallowed = $user->hasRight('stock', 'lire');
937 $delallowed = $user->hasRight('stock', 'creer');
938
939 print $formfile->showdocuments('massfilesarea_stock', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
940}
941
942// End of page
943llxFooter();
944$db->close();
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()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage warehouses.
Class to manage standard extra fields.
Class to generate html code for admin pages.
Class to manage forms for categories.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ="&nbsp;", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='')
Format phone numbers according to country.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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.