dolibarr 25.0.0-alpha
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 {
454 dol_print_error($db);
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) {
472 dol_print_error($db);
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 $objecttmp->getLibStatut();
754
755 if (!getDolGlobalString('FICHINTER_CLASSIFY_BILLED')) {
756 unset($objecttmp->labelStatus[Fichinter::STATUS_BILLED]); // Option deprecated. In a future, billed must be managed with a dedicated field to 0 or 1
757 }
758
759 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
760 print $form->selectarray('search_status', $objecttmp->labelStatus, $search_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status width100 onrightofpage');
761 print '</td>';
762}
763// Signed status
764if (!empty($arrayfields['f.signed_status']['checked'])) {
765 print '<td class="liste_titre center">';
766 $list_signed_status = $object->getSignedStatusLocalisedArray();
767 print $form->selectarray('search_signed_status', $list_signed_status, $search_signed_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status');
768 print '</td>';
769}
770// Fields of detail line
771if (!empty($arrayfields['fd.description']['checked'])) {
772 print '<td class="liste_titre">&nbsp;</td>';
773}
774if (!empty($arrayfields['fd.date']['checked'])) {
775 print '<td class="liste_titre center">';
776 print '<div class="nowrapfordate">';
777 print $form->selectDate($search_date_start ?: -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
778 print '</div>';
779 print '<div class="nowrapfordate">';
780 print $form->selectDate($search_date_end ?: -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
781 print '</div>';
782 print '</td>';
783}
784if (!empty($arrayfields['fd.duree']['checked'])) {
785 print '<td class="liste_titre">&nbsp;</td>';
786}
787// Action column
788if (!$conf->main_checkbox_left_column) {
789 print '<td class="liste_titre center maxwidthsearch">';
790 $searchpicto = $form->showFilterButtons();
791 print $searchpicto;
792 print '</td>';
793}
794print '</tr>'."\n";
795
796$totalarray = array();
797$totalarray['nbfield'] = 0;
798
799// Fields title label
800// --------------------------------------------------------------------
801print '<tr class="liste_titre">';
802// Action column
803if ($conf->main_checkbox_left_column) {
804 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
805 $totalarray['nbfield']++;
806}
807if (!empty($arrayfields['f.ref']['checked'])) {
808 // @phan-suppress-next-line PhanTypeInvalidDimOffset
809 print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER["PHP_SELF"], "f.ref", "", $param, '', $sortfield, $sortorder);
810 $totalarray['nbfield']++;
811}
812if (!empty($arrayfields['f.ref_client']['checked'])) {
813 print_liste_field_titre($arrayfields['f.ref_client']['label'], $_SERVER["PHP_SELF"], "f.ref_client", "", $param, '', $sortfield, $sortorder);
814 $totalarray['nbfield']++;
815}
816if (!empty($arrayfields['s.nom']['checked'])) {
817 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
818 $totalarray['nbfield']++;
819}
820if (!empty($arrayfields['pr.ref']['checked'])) {
821 print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], "pr.ref", "", $param, '', $sortfield, $sortorder);
822 $totalarray['nbfield']++;
823}
824if (!empty($arrayfields['c.ref']['checked'])) {
825 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, '', $sortfield, $sortorder);
826 $totalarray['nbfield']++;
827}
828if (!empty($arrayfields['f.description']['checked'])) {
829 print_liste_field_titre($arrayfields['f.description']['label'], $_SERVER["PHP_SELF"], "f.description", "", $param, '', $sortfield, $sortorder);
830 $totalarray['nbfield']++;
831}
832// Extra fields
833include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
834// Hook fields
835$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
836$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
837print $hookmanager->resPrint;
838if (!empty($arrayfields['f.datec']['checked'])) {
839 print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
840 $totalarray['nbfield']++;
841}
842if (!empty($arrayfields['f.tms']['checked'])) {
843 print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER["PHP_SELF"], "f.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
844 $totalarray['nbfield']++;
845}
846if (!empty($arrayfields['f.note_public']['checked'])) {
847 print_liste_field_titre($arrayfields['f.note_public']['label'], $_SERVER["PHP_SELF"], "f.note_public", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
848 $totalarray['nbfield']++;
849}
850if (!empty($arrayfields['f.note_private']['checked'])) {
851 print_liste_field_titre($arrayfields['f.note_private']['label'], $_SERVER["PHP_SELF"], "f.note_private", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
852 $totalarray['nbfield']++;
853}
854if (!empty($arrayfields['f.fk_statut']['checked'])) {
855 print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "f.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
856 $totalarray['nbfield']++;
857}
858if (!empty($arrayfields['f.signed_status']['checked'])) {
859 print_liste_field_titre($arrayfields['f.signed_status']['label'], $_SERVER["PHP_SELF"], "f.signed_status", "", $param, '', $sortfield, $sortorder, 'center ');
860 $totalarray['nbfield']++;
861}
862if (!empty($arrayfields['fd.description']['checked'])) {
863 print_liste_field_titre($arrayfields['fd.description']['label'], $_SERVER["PHP_SELF"], '');
864 $totalarray['nbfield']++;
865}
866if (!empty($arrayfields['fd.date']['checked'])) {
867 print_liste_field_titre($arrayfields['fd.date']['label'], $_SERVER["PHP_SELF"], "fd.date", "", $param, '', $sortfield, $sortorder, 'center ');
868 $totalarray['nbfield']++;
869}
870if (!empty($arrayfields['fd.duree']['checked'])) {
871 print_liste_field_titre($arrayfields['fd.duree']['label'], $_SERVER["PHP_SELF"], "fd.duree", "", $param, '', $sortfield, $sortorder, 'right ');
872 $totalarray['nbfield']++;
873}
874
875// Action column
876if (!$conf->main_checkbox_left_column) {
877 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
878 $totalarray['nbfield']++;
879}
880print "</tr>\n";
881
882
883// Loop on record
884// --------------------------------------------------------------------
885$i = 0;
886$savnbfield = $totalarray['nbfield'];
887$totalarray = array();
888$totalarray['nbfield'] = 0;
889$totalarray['val'] = array();
890$totalarray['val']['fd.duree'] = 0;
891$total = 0;
892$imaxinloop = ($limit ? min($num, $limit) : $num);
893while ($i < $imaxinloop) {
894 $obj = $db->fetch_object($resql);
895 if (empty($obj)) {
896 break; // Should not happen
897 }
898
899 // Store properties in $object
900 //$object->setVarsFromFetchObj($obj);
901
902 $objectstatic->id = $obj->rowid;
903 $objectstatic->ref = $obj->ref;
904 $objectstatic->ref_client = $obj->ref_client;
905 $objectstatic->statut = $obj->status; // deprecated
906 $objectstatic->status = $obj->status;
907 $objectstatic->signed_status = $obj->signed_status;
908
909 $companystatic->name = $obj->name;
910 $companystatic->id = $obj->socid;
911 $companystatic->client = $obj->client;
912 $companystatic->fournisseur = $obj->fournisseur;
913 $companystatic->email = $obj->email;
914 $companystatic->status = $obj->thirdpartystatus;
915
916 //mode kanban
917 if ($mode == 'kanban') {
918 if ($i == 0) {
919 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
920 print '<div class="box-flex-container kanban">';
921 }
922
923 // Output Kanban
924 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
925 $selected = 0;
926 if (in_array($object->id, $arrayofselected)) {
927 $selected = 1;
928 }
929 }
930
931 $objectstatic->duration = $obj->duree;
932 $arraydata = array();
933 $arraydata['thirdparty'] = $companystatic;
934 print $objectstatic->getKanbanView('', $arraydata);
935 if ($i == ($imaxinloop - 1)) {
936 print '</div>';
937 print '</td></tr>';
938 }
939 } else {
940 // Show here line of result
941 $j = 0;
942 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
943 // Action column
944 if ($conf->main_checkbox_left_column) {
945 print '<td class="nowrap center">';
946 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
947 $selected = 0;
948 if (in_array($obj->rowid, $arrayofselected)) {
949 $selected = 1;
950 }
951 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
952 }
953 print '</td>';
954 if (!$i) {
955 $totalarray['nbfield']++;
956 }
957 }
958
959 // Picto + Ref
960 if (!empty($arrayfields['f.ref']['checked'])) {
961 print "<td>";
962
963 print '<table class="nobordernopadding"><tr class="nocellnopadd">';
964 print '<td class="nobordernopadding nowraponall">';
965 print $objectstatic->getNomUrl(1);
966 print '</td>';
967 // Warning
968 $warnornote = '';
969 //if ($obj->fk_statut == 1 && $db->jdate($obj->dfv) < ($now - $conf->fichinter->warning_delay)) $warnornote.=img_warning($langs->trans("Late"));
970 if (!empty($obj->note_private)) {
971 $warnornote .= ($warnornote ? ' ' : '');
972 $warnornote .= '<span class="note">';
973 $warnornote .= '<a href="note.php?id='.$obj->rowid.'">'.img_picto($langs->trans("ViewPrivateNote"), 'object_generic').'</a>';
974 $warnornote .= '</span>';
975 }
976 if ($warnornote) {
977 print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
978 print $warnornote;
979 print '</td>';
980 }
981
982 // Other picto tool
983 print '<td width="16" class="right nobordernopadding hideonsmartphone">';
984 $filename = dol_sanitizeFileName($obj->ref);
985 $filedir = $conf->ficheinter->dir_output.'/'.dol_sanitizeFileName($obj->ref);
986 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
987 print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
988 print '</td></tr></table>';
989
990 print "</td>\n";
991 if (!$i) {
992 $totalarray['nbfield']++;
993 }
994 }
995
996 // Customer ref
997 if (!empty($arrayfields['f.ref_client']['checked'])) {
998 print '<td class="nowrap tdoverflowmax200">';
999 print dol_escape_htmltag($obj->ref_client);
1000 print '</td>';
1001 if (!$i) {
1002 $totalarray['nbfield']++;
1003 }
1004 }
1005 // Third party
1006 if (!empty($arrayfields['s.nom']['checked'])) {
1007 print '<td class="tdoverflowmax125">';
1008 print $companystatic->getNomUrl(1, '', 44);
1009 print '</td>';
1010 if (!$i) {
1011 $totalarray['nbfield']++;
1012 }
1013 }
1014 // Project ref
1015 if (!empty($arrayfields['pr.ref']['checked']) && $projetstatic !== null) {
1016 print '<td class="tdoverflowmax150">';
1017 $projetstatic->id = $obj->projet_id;
1018 $projetstatic->ref = $obj->projet_ref;
1019 $projetstatic->title = $obj->projet_title;
1020 if ($projetstatic->id > 0) {
1021 print $projetstatic->getNomUrl(1, '');
1022 }
1023 print '</td>';
1024 if (!$i) {
1025 $totalarray['nbfield']++;
1026 }
1027 }
1028 // Contract
1029 if (!empty($arrayfields['c.ref']['checked']) && $contratstatic !== null) {
1030 print '<td class="tdoverflowmax150">';
1031 $contratstatic->id = $obj->contrat_id;
1032 $contratstatic->ref = $obj->contrat_ref;
1033 $contratstatic->ref_customer = $obj->contrat_ref_customer;
1034 $contratstatic->ref_supplier = $obj->contrat_ref_supplier;
1035 if ($contratstatic->id > 0) {
1036 print $contratstatic->getNomUrl(1, 0);
1037 print '</td>';
1038 }
1039 if (!$i) {
1040 $totalarray['nbfield']++;
1041 }
1042 }
1043 if (!empty($arrayfields['f.description']['checked'])) {
1044 print '<td>'.dol_trunc(dolGetFirstLineOfText(dol_string_nohtmltag($obj->description, 1)), 48).'</td>';
1045 if (!$i) {
1046 $totalarray['nbfield']++;
1047 }
1048 }
1049
1050 // Extra fields
1051 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1052 // Fields from hook
1053 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1054 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1055 print $hookmanager->resPrint;
1056 // Date creation
1057 if (!empty($arrayfields['f.datec']['checked'])) {
1058 print '<td class="center nowraponall">';
1059 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1060 print '</td>';
1061 if (!$i) {
1062 $totalarray['nbfield']++;
1063 }
1064 }
1065 // Date modification
1066 if (!empty($arrayfields['f.tms']['checked'])) {
1067 print '<td class="center nowraponall">';
1068 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1069 print '</td>';
1070 if (!$i) {
1071 $totalarray['nbfield']++;
1072 }
1073 }
1074 // Note public
1075 if (!empty($arrayfields['f.note_public']['checked'])) {
1076 print '<td class="sensiblehtmlcontent center">';
1077 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_public, 5)).'</div>';
1078 print '</td>';
1079 if (!$i) {
1080 $totalarray['nbfield']++;
1081 }
1082 }
1083 // Note private
1084 if (!empty($arrayfields['f.note_private']['checked'])) {
1085 print '<td class="sensiblehtmlcontent center">';
1086 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_private, 5)).'</div>';
1087 print '</td>';
1088 if (!$i) {
1089 $totalarray['nbfield']++;
1090 }
1091 }
1092 // Status
1093 if (!empty($arrayfields['f.fk_statut']['checked'])) {
1094 print '<td class="center">'.$objectstatic->getLibStatut(5).'</td>';
1095 if (!$i) {
1096 $totalarray['nbfield']++;
1097 }
1098 }
1099 // Signed Status
1100 if (!empty($arrayfields['f.signed_status']['checked'])) {
1101 print '<td class="center">'.$objectstatic->getLibSignedStatus(5).'</td>';
1102 if (!$i) {
1103 $totalarray['nbfield']++;
1104 }
1105 }
1106 // Fields of detail of line
1107 if (!empty($arrayfields['fd.description']['checked'])) {
1108 $text = dolGetFirstLineOfText(dol_string_nohtmltag($obj->descriptiondetail, 1));
1109 print '<td>';
1110 print '<div class="classfortooltip tdoverflowmax250 small" title="'.dol_escape_htmltag($obj->descriptiondetail, 1, 1).'">';
1111 print dol_escape_htmltag($text);
1112 print '</div>';
1113 print '</td>';
1114 if (!$i) {
1115 $totalarray['nbfield']++;
1116 }
1117 }
1118 // Date line
1119 if (!empty($arrayfields['fd.date']['checked'])) {
1120 print '<td class="center nowraponall" title="'.dol_print_date($db->jdate($obj->dp), 'dayhour').'">'.dol_print_date($db->jdate($obj->dp), 'dayhour')."</td>\n";
1121 if (!$i) {
1122 $totalarray['nbfield']++;
1123 }
1124 }
1125 // Duration line
1126 if (!empty($arrayfields['fd.duree']['checked'])) {
1127 print '<td class="right">'.convertSecondToTime($obj->duree, 'allhourmin').'</td>';
1128 if (!$i) {
1129 $totalarray['nbfield']++;
1130 }
1131 if (!$i) {
1132 $totalarray['type'][$totalarray['nbfield']] = 'duration';
1133 }
1134 if (!$i) {
1135 $totalarray['pos'][$totalarray['nbfield']] = 'fd.duree';
1136 }
1137 $totalarray['val']['fd.duree'] += $obj->duree;
1138 }
1139 // Action column
1140 if (!$conf->main_checkbox_left_column) {
1141 print '<td class="nowrap center">';
1142 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1143 $selected = 0;
1144 if (in_array($obj->rowid, $arrayofselected)) {
1145 $selected = 1;
1146 }
1147 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1148 }
1149 print '</td>';
1150 if (!$i) {
1151 $totalarray['nbfield']++;
1152 }
1153 }
1154
1155 print '</tr>'."\n";
1156
1157 $total += (isset($obj->duree) ? $obj->duree : 0);
1158 }
1159 $i++;
1160}
1161
1162
1163// Show total line
1164include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1165
1166// If no record found
1167if ($num == 0) {
1168 $colspan = 1;
1169 foreach ($arrayfields as $key => $val) {
1170 if (!empty($val['checked'])) {
1171 $colspan++;
1172 }
1173 }
1174 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1175}
1176
1177$db->free($resql);
1178
1179$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1180$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1181print $hookmanager->resPrint;
1182
1183print '</table>'."\n";
1184print '</div>'."\n";
1185
1186print '</form>'."\n";
1187
1188if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
1189 $hidegeneratedfilelistifempty = 1;
1190 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1191 $hidegeneratedfilelistifempty = 0;
1192 }
1193
1194 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
1195 $formfile = new FormFile($db);
1196
1197 // Show list of available documents
1198 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1199 $urlsource .= str_replace('&amp;', '&', $param);
1200
1201 $filedir = $diroutputmassaction;
1202 $genallowed = $permissiontoread;
1203 $delallowed = $permissiontoadd;
1204
1205 print $formfile->showdocuments('massfilesarea_interventions', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1206}
1207
1208// End of page
1209llxFooter();
1210$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
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:346
Class to manage categories.
const STATUS_BILLED
Billed.
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:
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...
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.
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.
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).
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Definition html.lib.php:181
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.