dolibarr 24.0.2
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2011-2012 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
7 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8 * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
9 * Copyright (C) 2021-2026 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2022-2026 Charlène Benke <charlene@patas-monkey.com>
11 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
12 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
13 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
14 * Copyright (C) 2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 3 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program. If not, see <https://www.gnu.org/licenses/>.
28 */
29
36// Load Dolibarr environment
37require '../main.inc.php';
46require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
47require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
48require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
50if (isModEnabled('project')) {
51 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
52}
53if (isModEnabled('category')) {
54 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
55 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
56}
57if (isModEnabled('contract')) {
58 require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
59}
60
61
62// Load translation files required by the page
63$langs->loadLangs(array('companies', 'bills', 'interventions'));
64if (isModEnabled('project')) {
65 $langs->load("projects");
66}
67if (isModEnabled('contract')) {
68 $langs->load("contracts");
69}
70if (isModEnabled('category')) {
71 $langs->load("categories");
72}
73
74$action = GETPOST('action', 'aZ09');
75$massaction = GETPOST('massaction', 'alpha');
76$show_files = GETPOSTINT('show_files');
77$confirm = GETPOST('confirm', 'alpha');
78$toselect = GETPOST('toselect', 'array:int');
79$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'interventionlist';
80$mode = GETPOST('mode', 'alpha');
81
82if (getDolGlobalInt('MAIN_SEE_SUBORDINATES')) {
83 $userschilds = $user->getAllChildIds();
84} else {
85 $userschilds = array();
86}
87
88$search_ref = GETPOST('search_ref') ? GETPOST('search_ref', 'alpha') : GETPOST('search_inter', 'alpha');
89$search_ref_client = GETPOST('search_ref_client', 'alpha');
90$search_company = GETPOST('search_company', 'alpha');
91$search_desc = GETPOST('search_desc', 'alpha');
92$search_projet_ref = GETPOST('search_projet_ref', 'alpha');
93$search_contrat_ref = GETPOST('search_contrat_ref', 'alpha');
94$search_status = GETPOST('search_status', 'alpha');
95$search_signed_status = GETPOST('search_signed_status', 'alpha');
96$search_all = trim(GETPOST('search_all', 'alphanohtml'));
97$search_date_startday = GETPOSTINT('search_date_startday');
98$search_date_startmonth = GETPOSTINT('search_date_startmonth');
99$search_date_startyear = GETPOSTINT('search_date_startyear');
100$search_date_endday = GETPOSTINT('search_date_endday');
101$search_date_endmonth = GETPOSTINT('search_date_endmonth');
102$search_date_endyear = GETPOSTINT('search_date_endyear');
103$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
104$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
105$optioncss = GETPOST('optioncss', 'alpha');
106$socid = GETPOSTINT('socid');
107
108$searchCategoryFichinterOperator = 0;
109if (GETPOSTISSET('formfilteraction')) {
110 $searchCategoryFichinterOperator = GETPOSTINT('search_category_fichinter_operator');
111} elseif (getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT')) {
112 $searchCategoryFichinterOperator = getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT');
113}
114$searchCategoryFichinterList = GETPOST('search_category_fichinter_list', 'array');
115$catid = GETPOST('catid', 'int');
116if (!empty($catid) && empty($searchCategoryFichinterList)) {
117 $searchCategoryFichinterList = array($catid);
118}
119
120$diroutputmassaction = $conf->ficheinter->dir_output.'/temp/massgeneration/'.$user->id;
121
122// Load variable for pagination
123$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
124$sortfield = GETPOST('sortfield', 'aZ09comma');
125$sortorder = GETPOST('sortorder', 'aZ09comma');
126$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
127if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
128 // If $page is not defined, or '' or -1 or if we click on clear filters
129 $page = 0;
130}
131$offset = $limit * $page;
132$pageprev = $page - 1;
133$pagenext = $page + 1;
134if (!$sortorder) {
135 $sortorder = "DESC";
136}
137if (!$sortfield) {
138 $sortfield = "f.ref";
139}
140
141// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
142$object = new Fichinter($db);
143$hookmanager->initHooks(array($contextpage)); // Note that conf->hooks_modules contains array of activated contexes
144
145// Fetch optionals attributes and labels
146$extrafields->fetch_name_optionals_label($object->table_element);
147
148$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
149
150// List of fields to search into when doing a "search in all"
151$fieldstosearchall = array(
152 'f.ref' => 'Ref',
153 's.nom' => "ThirdParty",
154 'f.description' => 'Description',
155 'f.note_public' => 'NotePublic',
156 'fd.description' => 'DescriptionOfLine',
157);
158if (empty($user->socid)) {
159 $fieldstosearchall["f.note_private"] = "NotePrivate";
160}
161if (getDolGlobalString('FICHINTER_DISABLE_DETAILS')) {
162 unset($fieldstosearchall['fd.description']);
163}
164
165// Definition of fields for list
166$arrayfields = array(
167 'f.ref' => array('label' => 'Ref', 'checked' => '1'),
168 'f.ref_client' => array('label' => 'RefCustomer', 'checked' => '1'),
169 's.nom' => array('label' => 'ThirdParty', 'checked' => '1'),
170 'pr.ref' => array('label' => 'Project', 'checked' => '1', 'enabled' => (!isModEnabled('project') ? '0' : '1')),
171 'c.ref' => array('label' => 'Contract', 'checked' => '1', 'enabled' => (empty($conf->contrat->enabled) ? '0' : '1')),
172 'f.description' => array('label' => 'Description', 'checked' => '1'),
173 'f.datec' => array('label' => 'DateCreation', 'checked' => '0', 'position' => 500),
174 'f.tms' => array('label' => 'DateModificationShort', 'checked' => '0', 'position' => 500),
175 'f.note_public' => array('label' => 'NotePublic', 'checked' => '0', 'position' => 510, 'enabled' => (string) (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
176 'f.note_private' => array('label' => 'NotePrivate', 'checked' => '0', 'position' => 511, 'enabled' => (string) (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
177 'f.fk_statut' => array('label' => 'Status', 'checked' => '1', 'position' => 1000),
178 'f.signed_status' => array('label' => 'SignedStatus', 'checked' => '0', 'position' => 1001),
179 'fd.description' => array('label' => "DescriptionOfLine", 'checked' => '1', 'enabled' => getDolGlobalString('FICHINTER_DISABLE_DETAILS') != '1' ? '1' : '0'),
180 'fd.date' => array('label' => 'DateOfLine', 'checked' => '1', 'enabled' => getDolGlobalString('FICHINTER_DISABLE_DETAILS') != '1' ? '1' : '0'),
181 'fd.duree' => array('label' => 'DurationOfLine', 'type' => 'duration', 'checked' => '1', 'enabled' => !getDolGlobalString('FICHINTER_DISABLE_DETAILS') ? '1' : '0'), //type duration is here because in database, column 'duree' is double
182);
183// Extra fields
184include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
185
186// Add hook to complete $arrayfields
187$parameters = array('arrayfields' => &$arrayfields);
188$reshook = $hookmanager->executeHooks('completeArrayFields', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
189
190$object->fields = dol_sort_array($object->fields, 'position');
191$arrayfields = dol_sort_array($arrayfields, 'position');
192
193// Security check
194$id = GETPOSTINT('id');
195if ($user->socid) {
196 $socid = $user->socid;
197}
198$result = restrictedArea($user, 'ficheinter', $id, 'fichinter');
199
200$permissiontoreadallthirdparty = $user->hasRight('societe', 'client', 'voir');
201$permissiontoread = $user->hasRight('ficheinter', 'lire');
202$permissiontoadd = $user->hasRight('ficheinter', 'creer');
203$permissiontodelete = $user->hasRight('ficheinter', 'supprimer');
204
205
206/*
207 * Actions
208 */
209
210if (GETPOST('cancel', 'alpha')) {
211 $action = 'list';
212 $massaction = '';
213}
214if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
215 $massaction = '';
216}
217
218$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
219$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
220if ($reshook < 0) {
221 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
222}
223
224if (empty($reshook)) {
225 // Selection of new fields
226 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
227
228 // Purge search criteria
229 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
230 $search_ref = "";
231 $search_ref_client = "";
232 $searchCategoryFichinterList = array();
233 $search_company = "";
234 $search_projet_ref = "";
235 $search_contrat_ref = "";
236 $search_desc = "";
237 $search_status = "";
238 $search_signed_status = '';
239 $search_date_startday = '';
240 $search_date_startmonth = '';
241 $search_date_startyear = '';
242 $search_date_endday = '';
243 $search_date_endmonth = '';
244 $search_date_endyear = '';
245 $search_date_start = '';
246 $search_date_end = '';
247 $toselect = array();
248 $search_array_options = array();
249 }
250
251 // Mass actions
252 $objectclass = 'Fichinter';
253 $objectlabel = 'Interventions';
254 $uploaddir = $conf->ficheinter->dir_output;
255 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
256}
257
258
259
260/*
261 * View
262 */
263
264
265$form = new Form($db);
266$formfile = new FormFile($db);
267$objectstatic = new Fichinter($db);
268$companystatic = new Societe($db);
269$projetstatic = null;
270$contratstatic = null;
271if (isModEnabled('project')) {
272 $projetstatic = new Project($db);
273}
274if (isModEnabled('contract')) {
275 $contratstatic = new Contrat($db);
276}
277
278$now = dol_now();
279
280$title = $langs->trans("Interventions");
281$help_url = '';
282$morejs = array();
283$morecss = array();
284
285
286$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
287$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
288
289$atleastonefieldinlines = 0;
290foreach ($arrayfields as $tmpkey => $tmpval) {
291 if (preg_match('/^fd\./', $tmpkey) && !empty($arrayfields[$tmpkey]['checked'])) {
292 $atleastonefieldinlines++;
293 break;
294 }
295}
296
297$sql = "SELECT";
298$sql .= " f.ref, f.ref_client, f.rowid, f.fk_statut as status, f.signed_status as signed_status, f.description, f.datec as date_creation, f.tms as date_modification, f.note_public, f.note_private,";
299if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') && $atleastonefieldinlines) {
300 $sql .= " fd.rowid as lineid, fd.description as descriptiondetail, fd.date as dp, fd.duree,";
301}
302$sql .= " s.nom as name, s.rowid as socid, s.client, s.fournisseur, s.email, s.status as thirdpartystatus";
303if (isModEnabled('project')) {
304 $sql .= ", pr.rowid as projet_id, pr.ref as projet_ref, pr.title as projet_title";
305}
306if (isModEnabled('contract')) {
307 $sql .= ", c.rowid as contrat_id, c.ref as contrat_ref, c.ref_customer as contrat_ref_customer, c.ref_supplier as contrat_ref_supplier";
308}
309// Add fields from extrafields
310if (!empty($extrafields->attributes[$object->table_element]['label'])) {
311 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
312 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
313 }
314}
315// Add fields from hooks
316$parameters = array();
317$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
318$sql .= $hookmanager->resPrint;
319
320$sqlfields = $sql; // $sql fields to remove for count total
321
322$sql .= " FROM ".MAIN_DB_PREFIX."fichinter as f";
323if (isModEnabled('project')) {
324 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as pr on f.fk_projet = pr.rowid";
325}
326if (isModEnabled('contract')) {
327 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."contrat as c on f.fk_contrat = c.rowid";
328}
329if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
330 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (f.rowid = ef.fk_object)";
331}
332if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') && $atleastonefieldinlines) {
333 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."fichinterdet as fd ON fd.fk_fichinter = f.rowid";
334}
335
336// Add table from hooks
337$parameters = array();
338$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
339$sql .= $hookmanager->resPrint;
340
341$sql .= ", ".MAIN_DB_PREFIX."societe as s";
342$sql .= " WHERE f.entity IN (".getEntity('intervention').")";
343$sql .= " AND f.fk_soc = s.rowid";
344if ($search_ref) {
345 $sql .= natural_search('f.ref', $search_ref);
346}
347if ($search_ref_client) {
348 $sql .= natural_search('f.ref_client', $search_ref_client);
349}
350if ($search_company) {
351 $sql .= natural_search('s.nom', $search_company);
352}
353if ($search_projet_ref) {
354 $sql .= natural_search('pr.ref', $search_projet_ref);
355}
356if ($search_contrat_ref) {
357 $sql .= natural_search('c.ref', $search_contrat_ref);
358}
359if ($search_desc) {
360 if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') && $atleastonefieldinlines) {
361 $sql .= natural_search(array('f.description', 'fd.description'), $search_desc);
362 } else {
363 $sql .= natural_search(array('f.description'), $search_desc);
364 }
365}
366// Search for tag/category ($searchCategoryFichinterList is an array of ID)
367if (!empty($searchCategoryFichinterList)) {
368 $searchCategoryFichinterSqlList = array();
369 $listofcategoryid = '';
370 foreach ($searchCategoryFichinterList as $searchCategoryFichinter) {
371 if (intval($searchCategoryFichinter) == -2) {
372 $searchCategoryFichinterSqlList[] = "NOT EXISTS (SELECT ck.fk_fichinter FROM ".MAIN_DB_PREFIX."categorie_fichinter as ck WHERE f.rowid = ck.fk_fichinter)";
373 } elseif (intval($searchCategoryFichinter) > 0) {
374 if ($searchCategoryFichinterOperator == 0) {
375 $searchCategoryFichinterSqlList[] = " EXISTS (SELECT ck.fk_fichinter FROM ".MAIN_DB_PREFIX."categorie_fichinter as ck WHERE f.rowid = ck.fk_fichinter AND ck.fk_categorie = ".((int) $searchCategoryFichinter).")";
376 } else {
377 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryFichinter);
378 }
379 }
380 }
381 if ($listofcategoryid) {
382 $searchCategoryFichinterSqlList[] = " EXISTS (SELECT ck.fk_fichinter FROM ".MAIN_DB_PREFIX."categorie_fichinter as ck WHERE f.rowid = ck.fk_fichinter AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
383 }
384 if ($searchCategoryFichinterOperator == 1) {
385 if (!empty($searchCategoryFichinterSqlList)) {
386 $sql .= " AND (".implode(' OR ', $searchCategoryFichinterSqlList).")";
387 }
388 } else {
389 if (!empty($searchCategoryFichinterSqlList)) {
390 $sql .= " AND (".implode(' AND ', $searchCategoryFichinterSqlList).")";
391 }
392 }
393}
394if ($search_status != '' && $search_status >= 0) {
395 $sql .= ' AND f.fk_statut = '.((int) ($search_status));
396}
397if ($search_signed_status != '' && $search_signed_status >= 0) {
398 $sql .= ' AND f.signed_status = '.((int) $search_signed_status);
399}
400if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') && $atleastonefieldinlines) {
401 if ($search_date_start) {
402 $sql .= " AND fd.date >= '".$db->idate($search_date_start)."'";
403 }
404 if ($search_date_end) {
405 $sql .= " AND fd.date <= '".$db->idate($search_date_end)."'";
406 }
407}
408if ($socid > 0) {
409 $sql .= " AND s.rowid = ".((int) $socid);
410}
411// Restriction on sale representative
412if (empty($user->socid) && !$permissiontoreadallthirdparty) {
413 $sql .= " AND (EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc AND sc.fk_user = ".((int) $user->id).")";
414 if (getDolGlobalInt('MAIN_SEE_SUBORDINATES') && $userschilds) {
415 $sql .= " OR EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc AND sc.fk_user IN (".$db->sanitize(implode(',', $userschilds))."))";
416 }
417 $sql .= ")";
418}
419
420if ($search_all) {
421 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
422}
423// Search on sale representative
424/*
425if ($search_sale && $search_sale != '-1') {
426 if ($search_sale == -2) {
427 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc)";
428 } elseif ($search_sale > 0) {
429 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
430 }
431}*/
432// Add where from extra fields
433include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
434// Add where from hooks
435$parameters = array();
436$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
437$sql .= $hookmanager->resPrint;
438// Add GroupBy from hooks
439$parameters = array('search_all' => $search_all, 'fieldstosearchall' => $fieldstosearchall);
440$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
441$sql .= $hookmanager->resPrint;
442
443// Count total nb of records
444$nbtotalofrecords = '';
445if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
446 /* The fast and low memory method to get and count full list converts the sql into a sql count */
447 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
448 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
449 $resql = $db->query($sqlforcount);
450 if ($resql) {
451 $objforcount = $db->fetch_object($resql);
452 $nbtotalofrecords = $objforcount->nbtotalofrecords;
453 } else {
455 }
456
457 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
458 $page = 0;
459 $offset = 0;
460 }
461 $db->free($resql);
462}
463
464// Complete request and execute it with limit
465$sql .= $db->order($sortfield, $sortorder);
466if ($limit) {
467 $sql .= $db->plimit($limit + 1, $offset);
468}
469
470$resql = $db->query($sql);
471if (!$resql) {
473 exit;
474}
475
476$num = $db->num_rows($resql);
477
478
479// Direct jump if only one record found
480if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
481 $obj = $db->fetch_object($resql);
482 $id = $obj->rowid;
483 header("Location: ".dol_buildpath('/fichinter/card.php', 1).'?id='.$id);
484 exit;
485}
486
487
488// Output page
489// --------------------------------------------------------------------
490$paramsCat = '';
491foreach ($searchCategoryFichinterList as $searchCategoryFichinter) {
492 $paramsCat .= "&search_category_fichinter_list[]=".urlencode($searchCategoryFichinter);
493}
494
495llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist mod-fichinter page-list'); // Can use also classforhorizontalscrolloftabs instead of bodyforlist for no horizontal scroll
496
497
498$arrayofselected = is_array($toselect) ? $toselect : array();
499
500if ($socid > 0) {
501 $soc = new Societe($db);
502 $soc->fetch($socid);
503 if (empty($search_company)) {
504 $search_company = $soc->name;
505 }
506}
507
508$param = '';
509if (!empty($mode)) {
510 $param .= '&mode='.urlencode($mode);
511}
512if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
513 $param .= '&contextpage='.urlencode($contextpage);
514}
515if ($limit > 0 && $limit != $conf->liste_limit) {
516 $param .= '&limit='.((int) $limit);
517}
518if ($search_all) {
519 $param .= "&search_all=".urlencode($search_all);
520}
521if ($socid) {
522 $param .= "&socid=".urlencode((string) ($socid));
523}
524if ($searchCategoryFichinterOperator == 1) {
525 $param .= "&search_category_fichinter_operator=".urlencode((string) $searchCategoryFichinterOperator);
526}
527foreach ($searchCategoryFichinterList as $searchCategoryFichinter) {
528 $param .= "&search_category_fichinter_list[]=".urlencode($searchCategoryFichinter);
529}
530if ($search_ref) {
531 $param .= "&search_ref=".urlencode($search_ref);
532}
533if ($search_ref_client) {
534 $param .= "&search_ref_client=".urlencode($search_ref_client);
535}
536if ($search_company) {
537 $param .= "&search_company=".urlencode($search_company);
538}
539if ($search_desc) {
540 $param .= "&search_desc=".urlencode($search_desc);
541}
542if ($search_projet_ref) {
543 $param .= "&search_projet_ref=".urlencode($search_projet_ref);
544}
545if ($search_contrat_ref) {
546 $param .= "&search_contrat_ref=".urlencode($search_contrat_ref);
547}
548if ($search_status != '' && $search_status > -1) {
549 $param .= "&search_status=".urlencode($search_status);
550}
551if ($search_signed_status != '' && $search_signed_status >= 0) {
552 $param .= '&search_signed_status='.urlencode($search_signed_status);
553}
554if ($search_date_startday > 0) {
555 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
556}
557if ($search_date_startmonth > 0) {
558 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
559}
560if ($search_date_startyear > 0) {
561 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
562}
563if ($search_date_endday > 0) {
564 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
565}
566if ($search_date_endmonth > 0) {
567 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
568}
569if ($search_date_endyear > 0) {
570 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
571}
572if ($show_files) {
573 $param .= '&show_files='.urlencode((string) ($show_files));
574}
575if ($optioncss != '') {
576 $param .= '&optioncss='.urlencode($optioncss);
577}
578// Add $param from extra fields
579include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
580// Add $param from hooks
581$parameters = array('param' => &$param);
582$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
583$param .= $hookmanager->resPrint;
584
585// List of mass actions available
586$arrayofmassactions = array(
587 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
588 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
589 //'presend'=>$langs->trans("SendByMail"),
590);
591if (!empty($permissiontodelete)) {
592 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
593}
594if (isModEnabled('category') && $user->hasRight('categorie', 'creer')) {
595 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
596}
597if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
598 $arrayofmassactions = array();
599}
600$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
601
602
603print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
604if ($optioncss != '') {
605 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
606}
607print '<input type="hidden" name="token" value="'.newToken().'">';
608print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
609print '<input type="hidden" name="action" value="list">';
610print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
611print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
612print '<input type="hidden" name="page" value="'.$page.'">';
613print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
614print '<input type="hidden" name="page_y" value="">';
615print '<input type="hidden" name="mode" value="'.$mode.'">';
616
617$newcardbutton = '';
618$url = DOL_URL_ROOT.'/fichinter/card.php?action=create';
619if (!empty($socid)) {
620 $url .= '&socid='.$socid;
621}
622$newcardbutton = '';
623$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'));
624$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'));
625$newcardbutton .= dolGetButtonTitle($langs->trans('Statistics'), '', 'fa fa-chart-bar imgforviewmode', DOL_URL_ROOT.'/fichinter/stats/index.php?'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', ($mode == 'statistics' ? 2 : 1), array('morecss' => 'reposition'));
626$newcardbutton .= dolGetButtonTitleSeparator();
627$newcardbutton .= dolGetButtonTitle($langs->trans('NewIntervention'), '', 'fa fa-plus-circle', $url, '', $user->hasRight('ficheinter', 'creer'));
628
629print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
630
631$topicmail = "Information";
632$modelmail = "intervention";
633$objecttmp = new Fichinter($db);
634$trackid = 'int'.$object->id;
635include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
636
637if (!empty($catid)) {
638 print "<div id='ways'>";
639 $c = new Categorie($db);
640 $ways = $c->print_all_ways(' &gt; ', 'fichinter/list.php');
641 print " &gt; ".$ways[0]."<br>\n";
642 print "</div><br>";
643}
644
645if ($search_all) {
646 $setupstring = '';
647 foreach ($fieldstosearchall as $key => $val) {
648 $fieldstosearchall[$key] = $langs->trans($val);
649 $setupstring .= $key."=".$val.";";
650 }
651 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
652 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
653}
654
655// Filter on categories
656$moreforfilter = '';
657if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
658 $formcategory = new FormCategory($db);
659 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_FICHINTER, $searchCategoryFichinterList, 'minwidth300', $searchCategoryFichinterOperator ? $searchCategoryFichinterOperator : 0);
660}
661$parameters = array();
662$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
663if (empty($reshook)) {
664 $moreforfilter .= $hookmanager->resPrint;
665} else {
666 $moreforfilter = $hookmanager->resPrint;
667}
668
669if (!empty($moreforfilter)) {
670 print '<div class="liste_titre liste_titre_bydiv centpercent">';
671 print $moreforfilter;
672 print '</div>';
673}
674
675$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
676$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields with user setup
677$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
678$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
679
680print '<div class="div-table-responsive">';
681print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
682
683// Fields title search
684// --------------------------------------------------------------------
685print '<tr class="liste_titre_filter">';
686// Action column
687if ($conf->main_checkbox_left_column) {
688 print '<td class="liste_titre center maxwidthsearch">';
689 $searchpicto = $form->showFilterButtons('left');
690 print $searchpicto;
691 print '</td>';
692}
693if (!empty($arrayfields['f.ref']['checked'])) {
694 print '<td class="liste_titre">';
695 print '<input type="text" class="flat" name="search_ref" value="'.$search_ref.'" size="8">';
696 print '</td>';
697}
698if (!empty($arrayfields['f.ref_client']['checked'])) {
699 print '<td class="liste_titre">';
700 print '<input type="text" class="flat" name="search_ref_client" value="'.$search_ref_client.'" size="8">';
701 print '</td>';
702}
703if (!empty($arrayfields['s.nom']['checked'])) {
704 print '<td class="liste_titre">';
705 print '<input type="text" class="flat" name="search_company" value="'.$search_company.'" size="10">';
706 print '</td>';
707}
708if (!empty($arrayfields['pr.ref']['checked'])) {
709 print '<td class="liste_titre">';
710 print '<input type="text" class="flat" name="search_projet_ref" value="'.$search_projet_ref.'" size="8">';
711 print '</td>';
712}
713if (!empty($arrayfields['c.ref']['checked'])) {
714 print '<td class="liste_titre">';
715 print '<input type="text" class="flat" name="search_contrat_ref" value="'.$search_contrat_ref.'" size="8">';
716 print '</td>';
717}
718if (!empty($arrayfields['f.description']['checked'])) {
719 print '<td class="liste_titre">';
720 print '<input type="text" class="flat" name="search_desc" value="'.$search_desc.'" size="12">';
721 print '</td>';
722}
723// Extra fields
724include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
725
726// Fields from hook
727$parameters = array('arrayfields' => $arrayfields);
728$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
729print $hookmanager->resPrint;
730if (!empty($arrayfields['f.datec']['checked'])) {
731 // Date creation
732 print '<td class="liste_titre">';
733 print '</td>';
734}
735if (!empty($arrayfields['f.tms']['checked'])) {
736 // Date modification
737 print '<td class="liste_titre">';
738 print '</td>';
739}
740if (!empty($arrayfields['f.note_public']['checked'])) {
741 // Note public
742 print '<td class="liste_titre">';
743 print '</td>';
744}
745if (!empty($arrayfields['f.note_private']['checked'])) {
746 // Note private
747 print '<td class="liste_titre">';
748 print '</td>';
749}
750// Status
751if (!empty($arrayfields['f.fk_statut']['checked'])) {
752 print '<td class="liste_titre right parentonrightofpage">';
753 $liststatus = [
754 $object::STATUS_DRAFT => $langs->transnoentitiesnoconv('Draft'),
755 $object::STATUS_VALIDATED => $langs->transnoentitiesnoconv('Validated'),
756 $object::STATUS_BILLED => $langs->transnoentitiesnoconv('StatusInterInvoiced'),
757 $object::STATUS_CLOSED => $langs->transnoentitiesnoconv('Done'),
758 ];
759 if (!getDolGlobalString('FICHINTER_CLASSIFY_BILLED')) {
760 unset($liststatus[2]); // Option deprecated. In a future, billed must be managed with a dedicated field to 0 or 1
761 }
762 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
763 print $form->selectarray('search_status', $liststatus, $search_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status width100 onrightofpage');
764 print '</td>';
765}
766// Signed status
767if (!empty($arrayfields['f.signed_status']['checked'])) {
768 print '<td class="liste_titre center">';
769 $list_signed_status = $object->getSignedStatusLocalisedArray();
770 print $form->selectarray('search_signed_status', $list_signed_status, $search_signed_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status');
771 print '</td>';
772}
773// Fields of detail line
774if (!empty($arrayfields['fd.description']['checked'])) {
775 print '<td class="liste_titre">&nbsp;</td>';
776}
777if (!empty($arrayfields['fd.date']['checked'])) {
778 print '<td class="liste_titre center">';
779 print '<div class="nowrapfordate">';
780 print $form->selectDate($search_date_start ?: -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
781 print '</div>';
782 print '<div class="nowrapfordate">';
783 print $form->selectDate($search_date_end ?: -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
784 print '</div>';
785 print '</td>';
786}
787if (!empty($arrayfields['fd.duree']['checked'])) {
788 print '<td class="liste_titre">&nbsp;</td>';
789}
790// Action column
791if (!$conf->main_checkbox_left_column) {
792 print '<td class="liste_titre center maxwidthsearch">';
793 $searchpicto = $form->showFilterButtons();
794 print $searchpicto;
795 print '</td>';
796}
797print '</tr>'."\n";
798
799$totalarray = array();
800$totalarray['nbfield'] = 0;
801
802// Fields title label
803// --------------------------------------------------------------------
804print '<tr class="liste_titre">';
805// Action column
806if ($conf->main_checkbox_left_column) {
807 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
808 $totalarray['nbfield']++;
809}
810if (!empty($arrayfields['f.ref']['checked'])) {
811 // @phan-suppress-next-line PhanTypeInvalidDimOffset
812 print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
813 $totalarray['nbfield']++;
814}
815if (!empty($arrayfields['f.ref_client']['checked'])) {
816 print_liste_field_titre($arrayfields['f.ref_client']['label'], $_SERVER["PHP_SELF"], "f.ref_client", "", $param, '', $sortfield, $sortorder);
817 $totalarray['nbfield']++;
818}
819if (!empty($arrayfields['s.nom']['checked'])) {
820 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
821 $totalarray['nbfield']++;
822}
823if (!empty($arrayfields['pr.ref']['checked'])) {
824 print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], "pr.ref", "", $param, '', $sortfield, $sortorder);
825 $totalarray['nbfield']++;
826}
827if (!empty($arrayfields['c.ref']['checked'])) {
828 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, '', $sortfield, $sortorder);
829 $totalarray['nbfield']++;
830}
831if (!empty($arrayfields['f.description']['checked'])) {
832 print_liste_field_titre($arrayfields['f.description']['label'], $_SERVER["PHP_SELF"], "f.description", "", $param, '', $sortfield, $sortorder);
833 $totalarray['nbfield']++;
834}
835// Extra fields
836include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
837// Hook fields
838$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
839$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
840print $hookmanager->resPrint;
841if (!empty($arrayfields['f.datec']['checked'])) {
842 print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
843 $totalarray['nbfield']++;
844}
845if (!empty($arrayfields['f.tms']['checked'])) {
846 print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER["PHP_SELF"], "f.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
847 $totalarray['nbfield']++;
848}
849if (!empty($arrayfields['f.note_public']['checked'])) {
850 print_liste_field_titre($arrayfields['f.note_public']['label'], $_SERVER["PHP_SELF"], "f.note_public", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
851 $totalarray['nbfield']++;
852}
853if (!empty($arrayfields['f.note_private']['checked'])) {
854 print_liste_field_titre($arrayfields['f.note_private']['label'], $_SERVER["PHP_SELF"], "f.note_private", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
855 $totalarray['nbfield']++;
856}
857if (!empty($arrayfields['f.fk_statut']['checked'])) {
858 print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "f.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
859 $totalarray['nbfield']++;
860}
861if (!empty($arrayfields['f.signed_status']['checked'])) {
862 print_liste_field_titre($arrayfields['f.signed_status']['label'], $_SERVER["PHP_SELF"], "f.signed_status", "", $param, '', $sortfield, $sortorder, 'center ');
863 $totalarray['nbfield']++;
864}
865if (!empty($arrayfields['fd.description']['checked'])) {
866 print_liste_field_titre($arrayfields['fd.description']['label'], $_SERVER["PHP_SELF"], '');
867 $totalarray['nbfield']++;
868}
869if (!empty($arrayfields['fd.date']['checked'])) {
870 print_liste_field_titre($arrayfields['fd.date']['label'], $_SERVER["PHP_SELF"], "fd.date", "", $param, '', $sortfield, $sortorder, 'center ');
871 $totalarray['nbfield']++;
872}
873if (!empty($arrayfields['fd.duree']['checked'])) {
874 print_liste_field_titre($arrayfields['fd.duree']['label'], $_SERVER["PHP_SELF"], "fd.duree", "", $param, '', $sortfield, $sortorder, 'right ');
875 $totalarray['nbfield']++;
876}
877
878// Action column
879if (!$conf->main_checkbox_left_column) {
880 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
881 $totalarray['nbfield']++;
882}
883print "</tr>\n";
884
885
886// Loop on record
887// --------------------------------------------------------------------
888$i = 0;
889$savnbfield = $totalarray['nbfield'];
890$totalarray = array();
891$totalarray['nbfield'] = 0;
892$totalarray['val'] = array();
893$totalarray['val']['fd.duree'] = 0;
894$total = 0;
895$imaxinloop = ($limit ? min($num, $limit) : $num);
896while ($i < $imaxinloop) {
897 $obj = $db->fetch_object($resql);
898 if (empty($obj)) {
899 break; // Should not happen
900 }
901
902 // Store properties in $object
903 //$object->setVarsFromFetchObj($obj);
904
905 $objectstatic->id = $obj->rowid;
906 $objectstatic->ref = $obj->ref;
907 $objectstatic->ref_client = $obj->ref_client;
908 $objectstatic->statut = $obj->status; // deprecated
909 $objectstatic->status = $obj->status;
910 $objectstatic->signed_status = $obj->signed_status;
911
912 $companystatic->name = $obj->name;
913 $companystatic->id = $obj->socid;
914 $companystatic->client = $obj->client;
915 $companystatic->fournisseur = $obj->fournisseur;
916 $companystatic->email = $obj->email;
917 $companystatic->status = $obj->thirdpartystatus;
918
919 //mode kanban
920 if ($mode == 'kanban') {
921 if ($i == 0) {
922 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
923 print '<div class="box-flex-container kanban">';
924 }
925
926 // Output Kanban
927 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
928 $selected = 0;
929 if (in_array($object->id, $arrayofselected)) {
930 $selected = 1;
931 }
932 }
933
934 $objectstatic->duration = $obj->duree;
935 $arraydata = array();
936 $arraydata['thirdparty'] = $companystatic;
937 print $objectstatic->getKanbanView('', $arraydata);
938 if ($i == ($imaxinloop - 1)) {
939 print '</div>';
940 print '</td></tr>';
941 }
942 } else {
943 // Show here line of result
944 $j = 0;
945 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
946 // Action column
947 if ($conf->main_checkbox_left_column) {
948 print '<td class="nowrap center">';
949 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
950 $selected = 0;
951 if (in_array($obj->rowid, $arrayofselected)) {
952 $selected = 1;
953 }
954 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
955 }
956 print '</td>';
957 if (!$i) {
958 $totalarray['nbfield']++;
959 }
960 }
961
962 // Picto + Ref
963 if (!empty($arrayfields['f.ref']['checked'])) {
964 print "<td>";
965
966 print '<table class="nobordernopadding"><tr class="nocellnopadd">';
967 print '<td class="nobordernopadding nowraponall">';
968 print $objectstatic->getNomUrl(1);
969 print '</td>';
970 // Warning
971 $warnornote = '';
972 //if ($obj->fk_statut == 1 && $db->jdate($obj->dfv) < ($now - $conf->fichinter->warning_delay)) $warnornote.=img_warning($langs->trans("Late"));
973 if (!empty($obj->note_private)) {
974 $warnornote .= ($warnornote ? ' ' : '');
975 $warnornote .= '<span class="note">';
976 $warnornote .= '<a href="note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"), 'object_generic').'</a>';
977 $warnornote .= '</span>';
978 }
979 if ($warnornote) {
980 print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
981 print $warnornote;
982 print '</td>';
983 }
984
985 // Other picto tool
986 print '<td width="16" class="right nobordernopadding hideonsmartphone">';
987 $filename = dol_sanitizeFileName($obj->ref);
988 $filedir = $conf->ficheinter->dir_output.'/'.dol_sanitizeFileName($obj->ref);
989 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
990 print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
991 print '</td></tr></table>';
992
993 print "</td>\n";
994 if (!$i) {
995 $totalarray['nbfield']++;
996 }
997 }
998
999 // Customer ref
1000 if (!empty($arrayfields['f.ref_client']['checked'])) {
1001 print '<td class="nowrap tdoverflowmax200">';
1002 print dol_escape_htmltag($obj->ref_client);
1003 print '</td>';
1004 if (!$i) {
1005 $totalarray['nbfield']++;
1006 }
1007 }
1008 // Third party
1009 if (!empty($arrayfields['s.nom']['checked'])) {
1010 print '<td class="tdoverflowmax125">';
1011 print $companystatic->getNomUrl(1, '', 44);
1012 print '</td>';
1013 if (!$i) {
1014 $totalarray['nbfield']++;
1015 }
1016 }
1017 // Project ref
1018 if (!empty($arrayfields['pr.ref']['checked']) && $projetstatic !== null) {
1019 print '<td class="tdoverflowmax150">';
1020 $projetstatic->id = $obj->projet_id;
1021 $projetstatic->ref = $obj->projet_ref;
1022 $projetstatic->title = $obj->projet_title;
1023 if ($projetstatic->id > 0) {
1024 print $projetstatic->getNomUrl(1, '');
1025 }
1026 print '</td>';
1027 if (!$i) {
1028 $totalarray['nbfield']++;
1029 }
1030 }
1031 // Contract
1032 if (!empty($arrayfields['c.ref']['checked']) && $contratstatic !== null) {
1033 print '<td class="tdoverflowmax150">';
1034 $contratstatic->id = $obj->contrat_id;
1035 $contratstatic->ref = $obj->contrat_ref;
1036 $contratstatic->ref_customer = $obj->contrat_ref_customer;
1037 $contratstatic->ref_supplier = $obj->contrat_ref_supplier;
1038 if ($contratstatic->id > 0) {
1039 print $contratstatic->getNomUrl(1, 0);
1040 print '</td>';
1041 }
1042 if (!$i) {
1043 $totalarray['nbfield']++;
1044 }
1045 }
1046 if (!empty($arrayfields['f.description']['checked'])) {
1047 print '<td>'.dol_trunc(dolGetFirstLineOfText(dol_string_nohtmltag($obj->description, 1)), 48).'</td>';
1048 if (!$i) {
1049 $totalarray['nbfield']++;
1050 }
1051 }
1052
1053 // Extra fields
1054 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1055 // Fields from hook
1056 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1057 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1058 print $hookmanager->resPrint;
1059 // Date creation
1060 if (!empty($arrayfields['f.datec']['checked'])) {
1061 print '<td class="center nowraponall">';
1062 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1063 print '</td>';
1064 if (!$i) {
1065 $totalarray['nbfield']++;
1066 }
1067 }
1068 // Date modification
1069 if (!empty($arrayfields['f.tms']['checked'])) {
1070 print '<td class="center nowraponall">';
1071 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1072 print '</td>';
1073 if (!$i) {
1074 $totalarray['nbfield']++;
1075 }
1076 }
1077 // Note public
1078 if (!empty($arrayfields['f.note_public']['checked'])) {
1079 print '<td class="sensiblehtmlcontent center">';
1080 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_public, 5)).'</div>';
1081 print '</td>';
1082 if (!$i) {
1083 $totalarray['nbfield']++;
1084 }
1085 }
1086 // Note private
1087 if (!empty($arrayfields['f.note_private']['checked'])) {
1088 print '<td class="sensiblehtmlcontent center">';
1089 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_private, 5)).'</div>';
1090 print '</td>';
1091 if (!$i) {
1092 $totalarray['nbfield']++;
1093 }
1094 }
1095 // Status
1096 if (!empty($arrayfields['f.fk_statut']['checked'])) {
1097 print '<td class="center">'.$objectstatic->getLibStatut(5).'</td>';
1098 if (!$i) {
1099 $totalarray['nbfield']++;
1100 }
1101 }
1102 // Signed Status
1103 if (!empty($arrayfields['f.signed_status']['checked'])) {
1104 print '<td class="center">'.$objectstatic->getLibSignedStatus(5).'</td>';
1105 if (!$i) {
1106 $totalarray['nbfield']++;
1107 }
1108 }
1109 // Fields of detail of line
1110 if (!empty($arrayfields['fd.description']['checked'])) {
1111 $text = dolGetFirstLineOfText(dol_string_nohtmltag($obj->descriptiondetail, 1));
1112 print '<td>';
1113 print '<div class="classfortooltip tdoverflowmax250 small" title="'.dol_escape_htmltag($obj->descriptiondetail, 1, 1).'">';
1114 print dol_escape_htmltag($text);
1115 print '</div>';
1116 print '</td>';
1117 if (!$i) {
1118 $totalarray['nbfield']++;
1119 }
1120 }
1121 // Date line
1122 if (!empty($arrayfields['fd.date']['checked'])) {
1123 print '<td class="center nowraponall" title="'.dol_print_date($db->jdate($obj->dp), 'dayhour').'">'.dol_print_date($db->jdate($obj->dp), 'dayhour')."</td>\n";
1124 if (!$i) {
1125 $totalarray['nbfield']++;
1126 }
1127 }
1128 // Duration line
1129 if (!empty($arrayfields['fd.duree']['checked'])) {
1130 print '<td class="right">'.convertSecondToTime($obj->duree, 'allhourmin').'</td>';
1131 if (!$i) {
1132 $totalarray['nbfield']++;
1133 }
1134 if (!$i) {
1135 $totalarray['type'][$totalarray['nbfield']] = 'duration';
1136 }
1137 if (!$i) {
1138 $totalarray['pos'][$totalarray['nbfield']] = 'fd.duree';
1139 }
1140 $totalarray['val']['fd.duree'] += $obj->duree;
1141 }
1142 // Action column
1143 if (!$conf->main_checkbox_left_column) {
1144 print '<td class="nowrap center">';
1145 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1146 $selected = 0;
1147 if (in_array($obj->rowid, $arrayofselected)) {
1148 $selected = 1;
1149 }
1150 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1151 }
1152 print '</td>';
1153 if (!$i) {
1154 $totalarray['nbfield']++;
1155 }
1156 }
1157
1158 print '</tr>'."\n";
1159
1160 $total += (isset($obj->duree) ? $obj->duree : 0);
1161 }
1162 $i++;
1163}
1164
1165
1166// Show total line
1167include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1168
1169// If no record found
1170if ($num == 0) {
1171 $colspan = 1;
1172 foreach ($arrayfields as $key => $val) {
1173 if (!empty($val['checked'])) {
1174 $colspan++;
1175 }
1176 }
1177 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1178}
1179
1180$db->free($resql);
1181
1182$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1183$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1184print $hookmanager->resPrint;
1185
1186print '</table>'."\n";
1187print '</div>'."\n";
1188
1189print '</form>'."\n";
1190
1191if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
1192 $hidegeneratedfilelistifempty = 1;
1193 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1194 $hidegeneratedfilelistifempty = 0;
1195 }
1196
1197 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
1198 $formfile = new FormFile($db);
1199
1200 // Show list of available documents
1201 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1202 $urlsource .= str_replace('&amp;', '&', $param);
1203
1204 $filedir = $diroutputmassaction;
1205 $genallowed = $permissiontoread;
1206 $delallowed = $permissiontoadd;
1207
1208 print $formfile->showdocuments('massfilesarea_interventions', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1209}
1210
1211// End of page
1212llxFooter();
1213$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:501
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
$c
Definition line.php:334
Class to manage categories.
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.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
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_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
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_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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 a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.