dolibarr 19.0.3
services_list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
6 * Copyright (C) 2018 Ferran Marcet <fmarcet@2byte.es>
7 * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
8 * Copyright (C) 2019 Juanjo Menent <jmenent@2byte.es>
9 * Copyright (C) 2023-2024 William Mead <william.mead@manchenumerique.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31require "../main.inc.php";
32require_once DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php";
33require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php";
34require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php";
35
36// Load translation files required by the page
37$langs->loadLangs(array('products', 'contracts', 'companies'));
38
39// Get parameters
40$massaction = GETPOST('massaction', 'alpha');
41$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
42$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : str_replace('_', '', basename(dirname(__FILE__)).basename(__FILE__, '.php')); // To manage different context of search
43$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
44$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
45
46// Load variable for pagination
47$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
48$sortfield = GETPOST('sortfield', 'aZ09comma');
49$sortorder = GETPOST('sortorder', 'aZ09comma');
50$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
51if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
52 // If $page is not defined, or '' or -1 or if we click on clear filters
53 $page = 0;
54}
55$offset = $limit * $page;
56$pageprev = $page - 1;
57$pagenext = $page + 1;
58if (!$sortfield) {
59 $sortfield = "c.rowid";
60}
61if (!$sortorder) {
62 $sortorder = "ASC";
63}
64
65$search_name = GETPOST("search_name", 'alpha');
66$search_subprice = GETPOST("search_subprice", 'alpha');
67$search_qty = GETPOST("search_qty", 'alpha');
68$search_total_ht = GETPOST("search_total_ht", 'alpha');
69$search_total_tva = GETPOST("search_total_tva", 'alpha');
70$search_total_ttc = GETPOST("search_total_ttc", 'alpha');
71$search_contract = GETPOST("search_contract", 'alpha');
72$search_service = GETPOST("search_service", 'alpha');
73$search_status = GETPOST("search_status", 'alpha');
74$search_product_category = GETPOST('search_product_category', 'int');
75$socid = GETPOST('socid', 'int');
76$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'contractservicelist'.$mode;
77
78$opouvertureprevuemonth = GETPOST('opouvertureprevuemonth');
79$opouvertureprevueday = GETPOST('opouvertureprevueday');
80$opouvertureprevueyear = GETPOST('opouvertureprevueyear');
81$filter_opouvertureprevue = GETPOST('filter_opouvertureprevue', 'alphawithlgt');
82
83$op1month = GETPOST('op1month', 'int');
84$op1day = GETPOST('op1day', 'int');
85$op1year = GETPOST('op1year', 'int');
86$filter_op1 = GETPOST('filter_op1', 'alphawithlgt');
87
88$op2month = GETPOST('op2month', 'int');
89$op2day = GETPOST('op2day', 'int');
90$op2year = GETPOST('op2year', 'int');
91$filter_op2 = GETPOST('filter_op2', 'alphawithlgt');
92
93$opcloturemonth = GETPOST('opcloturemonth', 'int');
94$opclotureday = GETPOST('opclotureday', 'int');
95$opclotureyear = GETPOST('opclotureyear', 'int');
96$filter_opcloture = GETPOST('filter_opcloture', 'alphalgt');
97
98
99// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
100$object = new ContratLigne($db);
101$hookmanager->initHooks(array('contractservicelist'));
102$extrafields = new ExtraFields($db);
103
104// fetch optionals attributes and labels
105$extrafields->fetch_name_optionals_label($object->table_element);
106
107$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
108
109// Security check
110$contratid = GETPOST('id', 'int');
111if (!empty($user->socid)) {
112 $socid = $user->socid;
113}
114$result = restrictedArea($user, 'contrat', $contratid);
115
116$staticcontrat = new Contrat($db);
117$staticcontratligne = new ContratLigne($db);
118$companystatic = new Societe($db);
119
120$arrayfields = array(
121 'c.ref'=>array('label'=>"Contract", 'checked'=>1, 'position'=>80),
122 'p.description'=>array('label'=>"Service", 'checked'=>1, 'position'=>80),
123 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1, 'position'=>90),
124 'cd.tva_tx'=>array('label'=>"VATRate", 'checked'=>-1, 'position'=>100),
125 'cd.subprice'=>array('label'=>"PriceUHT", 'checked'=>-1, 'position'=>105),
126 'cd.qty'=>array('label'=>"Qty", 'checked'=>1, 'position'=>108),
127 'cd.total_ht'=>array('label'=>"TotalHT", 'checked'=>-1, 'position'=>109, 'isameasure'=>1),
128 'cd.total_tva'=>array('label'=>"TotalVAT", 'checked'=>-1, 'position'=>110),
129 'cd.date_ouverture_prevue'=>array('label'=>"DateStartPlannedShort", 'checked'=>1, 'position'=>150),
130 'cd.date_ouverture'=>array('label'=>"DateStartRealShort", 'checked'=>1, 'position'=>160),
131 'cd.date_fin_validite'=>array('label'=>"DateEndPlannedShort", 'checked'=>1, 'position'=>170),
132 'cd.date_cloture'=>array('label'=>"DateEndRealShort", 'checked'=>1, 'position'=>180),
133 //'cd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
134 'cd.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500),
135 'status'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000)
136);
137// Extra fields
138include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
139
140$object->fields = dol_sort_array($object->fields, 'position');
141$arrayfields = dol_sort_array($arrayfields, 'position');
142
143$permissiontoread = $user->hasRight('contrat', 'lire');
144$permissiontoadd = $user->hasRight('contrat', 'creer');
145$permissiontodelete = $user->hasRight('contrat', 'supprimer');
146
147$result = restrictedArea($user, 'contrat', 0);
148
149
150/*
151 * Actions
152 */
153
154if (GETPOST('cancel', 'alpha')) {
155 $action = 'list';
156 $massaction = '';
157}
158if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
159 $massaction = '';
160}
161
162$parameters = array('socid'=>$socid);
163$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
164if ($reshook < 0) {
165 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
166}
167
168if (empty($reshook)) {
169 // Selection of new fields
170 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
171
172 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
173 $search_product_category = 0;
174 $search_name = "";
175 $search_subprice = "";
176 $search_qty = "";
177 $search_total_ht = "";
178 $search_total_tva = "";
179 $search_total_ttc = "";
180 $search_contract = "";
181 $search_service = "";
182 $search_status = "";
183 $opouvertureprevuemonth = "";
184 $opouvertureprevueday = "";
185 $opouvertureprevueyear = "";
186 $filter_opouvertureprevue = "";
187 $op1month = "";
188 $op1day = "";
189 $op1year = "";
190 $filter_op1 = "";
191 $op2month = "";
192 $op2day = "";
193 $op2year = "";
194 $filter_op2 = "";
195 $opcloturemonth = "";
196 $opclotureday = "";
197 $opclotureyear = "";
198 $filter_opcloture = "";
199 $toselect = array();
200 $search_array_options = array();
201 }
202}
203
204
205/*
206 * View
207 */
208
209$form = new Form($db);
210
211$now = dol_now();
212
213$title = $langs->trans("ListOfServices");
214if ($search_status == "0") {
215 $title = $langs->trans("ListOfInactiveServices"); // Must use == "0"
216}
217if ($search_status == "4" && $filter != "expired") {
218 $title = $langs->trans("ListOfRunningServices");
219}
220if ($search_status == "4" && $filter == "expired") {
221 $title = $langs->trans("ListOfExpiredServices");
222}
223if ($search_status == "5") {
224 $title = $langs->trans("ListOfClosedServices");
225}
226$help_url = '';
227
228// Build and execute select
229// --------------------------------------------------------------------
230$sql = "SELECT c.rowid as cid, c.ref, c.statut as cstatut, c.ref_customer, c.ref_supplier,";
231$sql .= " s.rowid as socid, s.nom as name, s.email, s.client, s.fournisseur,";
232$sql .= " cd.rowid, cd.description, cd.statut, cd.product_type as type,";
233$sql .= " p.rowid as pid, p.ref as pref, p.label as label, p.fk_product_type as ptype, p.tobuy, p.tosell, p.barcode, p.entity as pentity,";
234if (!$user->hasRight('societe', 'client', 'voir') && !$socid) {
235 $sql .= " sc.fk_soc, sc.fk_user,";
236}
237$sql .= " cd.date_ouverture_prevue,";
238$sql .= " cd.date_ouverture,";
239$sql .= " cd.date_fin_validite,";
240$sql .= " cd.date_cloture,";
241$sql .= " cd.qty,";
242$sql .= " cd.total_ht,";
243$sql .= " cd.total_tva,";
244$sql .= " cd.tva_tx,";
245$sql .= " cd.subprice,";
246//$sql.= " cd.date_c as date_creation,";
247$sql .= " cd.tms as date_update";
248// Add fields from extrafields
249if (!empty($extrafields->attributes[$object->table_element]['label'])) {
250 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
251 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
252 }
253}
254// Add fields from hooks
255$parameters = array();
256$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
257$sql .= $hookmanager->resPrint;
258$sql .= " FROM ".MAIN_DB_PREFIX."contrat as c,";
259$sql .= " ".MAIN_DB_PREFIX."societe as s,";
260if (!$user->hasRight('societe', 'client', 'voir') && !$socid) {
261 $sql .= " ".MAIN_DB_PREFIX."societe_commerciaux as sc,";
262}
263$sql .= " ".MAIN_DB_PREFIX."contratdet as cd";
264if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
265 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (cd.rowid = ef.fk_object)";
266}
267$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid";
268if ($search_product_category > 0) {
269 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=cd.fk_product';
270}
271$sql .= " WHERE c.entity IN (".getEntity($object->element).")";
272$sql .= " AND c.rowid = cd.fk_contrat";
273if ($search_product_category > 0) {
274 $sql .= " AND cp.fk_categorie = ".((int) $search_product_category);
275}
276$sql .= " AND c.fk_soc = s.rowid";
277if (!$user->hasRight('societe', 'client', 'voir') && !$socid) {
278 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
279}
280if ($search_status == "0") {
281 $sql .= " AND cd.statut = 0";
282}
283if ($search_status == "4") {
284 $sql .= " AND cd.statut = 4";
285}
286if ($search_status == "4&filter=expired") {
287 $sql .= " AND cd.statut = 4 AND cd.date_fin_validite < '".$db->idate($now)."'";
288}
289if ($search_status == "4&filter=notexpired") {
290 $sql .= " AND cd.statut = 4 AND cd.date_fin_validite >= '".$db->idate($now)."'";
291}
292if ($search_status == "5") {
293 $sql .= " AND cd.statut = 5";
294}
295if ($search_subprice) {
296 $sql .= natural_search("cd.subprice", $search_subprice, 1);
297}
298if ($search_qty) {
299 $sql .= natural_search("cd.qty", $search_qty, 1);
300}
301if ($search_total_ht) {
302 $sql .= natural_search("cd.total_ht", $search_total_ht, 1);
303}
304if ($search_total_tva) {
305 $sql .= natural_search("cd.total_tva", $search_total_tva, 1);
306}
307if ($search_total_ttc) {
308 $sql .= natural_search("cd.total_ttc", $search_total_ttc, 1);
309}
310if ($search_name) {
311 $sql .= natural_search("s.nom", $search_name);
312}
313if ($search_contract) {
314 $sql .= natural_search("c.ref", $search_contract);
315}
316if ($search_service) {
317 $sql .= natural_search(array("p.ref", "p.description", "cd.description"), $search_service);
318}
319if ($socid > 0) {
320 $sql .= " AND s.rowid = ".((int) $socid);
321}
322
323$filter_dateouvertureprevue = '';
324$filter_date1 = '';
325$filter_date2 = '';
326$filter_opcloture = '';
327
328$filter_dateouvertureprevue_start = dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear);
329$filter_dateouvertureprevue_end = dol_mktime(23, 59, 59, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear);
330if ($filter_dateouvertureprevue_start != '' && $filter_opouvertureprevue == -1) {
331 $filter_opouvertureprevue = ' BETWEEN ';
332}
333
334$filter_date1_start = dol_mktime(0, 0, 0, $op1month, $op1day, $op1year);
335$filter_date1_end = dol_mktime(23, 59, 59, $op1month, $op1day, $op1year);
336if ($filter_date1_start != '' && $filter_op1 == -1) {
337 $filter_op1 = ' BETWEEN ';
338}
339
340$filter_date2_start = dol_mktime(0, 0, 0, $op2month, $op2day, $op2year);
341$filter_date2_end = dol_mktime(23, 59, 59, $op2month, $op2day, $op2year);
342if ($filter_date2_start != '' && $filter_op2 == -1) {
343 $filter_op2 = ' BETWEEN ';
344}
345
346$filter_datecloture_start = dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear);
347$filter_datecloture_end = dol_mktime(23, 59, 59, $opcloturemonth, $opclotureday, $opclotureyear);
348if ($filter_datecloture_start != '' && $filter_opcloture == -1) {
349 $filter_opcloture = ' BETWEEN ';
350}
351
352if (!empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1 && $filter_opouvertureprevue != ' BETWEEN ' && $filter_dateouvertureprevue_start != '') {
353 $sql .= " AND cd.date_ouverture_prevue ".$filter_opouvertureprevue." '".$db->idate($filter_dateouvertureprevue_start)."'";
354}
355if (!empty($filter_opouvertureprevue) && $filter_opouvertureprevue == ' BETWEEN ') {
356 $sql .= " AND cd.date_ouverture_prevue ".$filter_opouvertureprevue." '".$db->idate($filter_dateouvertureprevue_start)."' AND '".$db->idate($filter_dateouvertureprevue_end)."'";
357}
358if (!empty($filter_op1) && $filter_op1 != -1 && $filter_op1 != ' BETWEEN ' && $filter_date1_start != '') {
359 $sql .= " AND cd.date_ouverture ".$filter_op1." '".$db->idate($filter_date1_start)."'";
360}
361if (!empty($filter_op1) && $filter_op1 == ' BETWEEN ') {
362 $sql .= " AND cd.date_ouverture ".$filter_op1." '".$db->idate($filter_date1_start)."' AND '".$db->idate($filter_date1_end)."'";
363}
364if (!empty($filter_op2) && $filter_op2 != -1 && $filter_op2 != ' BETWEEN ' && $filter_date2_start != '') {
365 $sql .= " AND cd.date_fin_validite ".$filter_op2." '".$db->idate($filter_date2_start)."'";
366}
367if (!empty($filter_op2) && $filter_op2 == ' BETWEEN ') {
368 $sql .= " AND cd.date_fin_validite ".$filter_op2." '".$db->idate($filter_date2_start)."' AND '".$db->idate($filter_date2_end)."'";
369}
370if (!empty($filter_opcloture) && $filter_opcloture != ' BETWEEN ' && $filter_opcloture != -1 && $filter_datecloture_start != '') {
371 $sql .= " AND cd.date_cloture ".$filter_opcloture." '".$db->idate($filter_datecloture_start)."'";
372}
373if (!empty($filter_opcloture) && $filter_opcloture == ' BETWEEN ') {
374 $sql .= " AND cd.date_cloture ".$filter_opcloture." '".$db->idate($filter_datecloture_start)."' AND '".$db->idate($filter_datecloture_end)."'";
375}
376// Add where from extra fields
377include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
378
379//print $sql;
380
381// Count total nb of records
382$nbtotalofrecords = '';
383if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
384 $result = $db->query($sql);
385 $nbtotalofrecords = $db->num_rows($result);
386 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
387 $page = 0;
388 $offset = 0;
389 }
390}
391
392// Complete request and execute it with limit
393$sql .= $db->order($sortfield, $sortorder);
394if ($limit) {
395 $sql .= $db->plimit($limit + 1, $offset);
396}
397
398//print $sql;
399dol_syslog("contrat/services_list.php", LOG_DEBUG);
400$resql = $db->query($sql);
401if (!$resql) {
402 dol_print_error($db);
403 exit;
404}
405
406$num = $db->num_rows($resql);
407
408/*
409// Direct jump if only one record found
410if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
411 $obj = $db->fetch_object($resql);
412 $id = $obj->id;
413 header("Location: ".DOL_URL_ROOT.'/projet/tasks/task.php?id='.$id.'&withprojet=1');
414 exit;
415}*/
416
417
418// Output page
419// --------------------------------------------------------------------
420
421llxHeader('', $title, $help_url);
422
423$arrayofselected = is_array($toselect) ? $toselect : array();
424
425$param = '';
426if (!empty($mode)) {
427 $param .= '&mode='.urlencode($mode);
428}
429if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
430 $param .= '&contextpage='.urlencode($contextpage);
431}
432if ($limit > 0 && $limit != $conf->liste_limit) {
433 $param .= '&limit='.((int) $limit);
434}
435if ($optioncss != '') {
436 $param .= '&optioncss='.urlencode($optioncss);
437}
438if ($search_contract) {
439 $param .= '&amp;search_contract='.urlencode($search_contract);
440}
441if ($search_name) {
442 $param .= '&amp;search_name='.urlencode($search_name);
443}
444if ($search_subprice) {
445 $param .= '&amp;search_subprice='.urlencode($search_subprice);
446}
447if ($search_qty) {
448 $param .= '&amp;search_qty='.urlencode($search_qty);
449}
450if ($search_total_ht) {
451 $param .= '&amp;search_total_ht='.urlencode($search_total_ht);
452}
453if ($search_total_tva) {
454 $param .= '&amp;search_total_tva='.urlencode($search_total_tva);
455}
456if ($search_total_ttc) {
457 $param .= '&amp;search_total_ttc='.urlencode($search_total_ttc);
458}
459if ($search_service) {
460 $param .= '&amp;search_service='.urlencode($search_service);
461}
462if ($search_status) {
463 $param .= '&amp;search_status='.urlencode($search_status);
464}
465if (!empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1) {
466 $param .= '&amp;filter_opouvertureprevue='.urlencode($filter_opouvertureprevue);
467}
468if (!empty($filter_op1) && $filter_op1 != -1) {
469 $param .= '&amp;filter_op1='.urlencode($filter_op1);
470}
471if (!empty($filter_op2) && $filter_op2 != -1) {
472 $param .= '&amp;filter_op2='.urlencode($filter_op2);
473}
474if (!empty($filter_opcloture) && $filter_opcloture != -1) {
475 $param .= '&amp;filter_opcloture='.urlencode($filter_opcloture);
476}
477if ($filter_dateouvertureprevue_start != '') {
478 $param .= '&amp;opouvertureprevueday='.((int) $opouvertureprevueday).'&amp;opouvertureprevuemonth='.((int) $opouvertureprevuemonth).'&amp;opouvertureprevueyear='.((int) $opouvertureprevueyear);
479}
480if ($filter_date1_start != '') {
481 $param .= '&amp;op1day='.((int) $op1day).'&amp;op1month='.((int) $op1month).'&amp;op1year='.((int) $op1year);
482}
483if ($filter_date2_start != '') {
484 $param .= '&amp;op2day='.((int) $op2day).'&amp;op2month='.((int) $op2month).'&amp;op2year='.((int) $op2year);
485}
486if ($filter_datecloture_start != '') {
487 $param .= '&amp;opclotureday='.((int) $op2day).'&amp;opcloturemonth='.((int) $op2month).'&amp;opclotureyear='.((int) $op2year);
488}
489// Add $param from extra fields
490include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
491
492// List of mass actions available
493$arrayofmassactions = array(
494 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
495 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
496);
497//if ($user->hasRight('contrat', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
498//if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
499$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
500
501print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
502if ($optioncss != '') {
503 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
504}
505print '<input type="hidden" name="token" value="'.newToken().'">';
506print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
507print '<input type="hidden" name="action" value="list">';
508print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
509print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
510print '<input type="hidden" name="page" value="'.$page.'">';
511print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
512print '<input type="hidden" name="page_y" value="">';
513print '<input type="hidden" name="mode" value="'.$mode.'">';
514
515$newcardbutton = '';
516
517
518print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, '', '', $limit);
519
520if (!empty($sall)) {
521 foreach ($fieldstosearchall as $key => $val) {
522 $fieldstosearchall[$key] = $langs->trans($val);
523 }
524 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'</div>';
525}
526
527$morefilter = '';
528$moreforfilter = '';
529
530// If the user can view categories of products
531if (isModEnabled('categorie') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
532 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
533 $moreforfilter .= '<div class="divsearchfield">';
534 $tmptitle = $langs->trans('IncludingProductWithTag');
535 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
536 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, 'widthcentpercentminusx maxwidth300', 1);
537 $moreforfilter .= '</div>';
538}
539
540$parameters = array();
541$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
542if (empty($reshook)) {
543 $moreforfilter .= $hookmanager->resPrint;
544} else {
545 $moreforfilter = $hookmanager->resPrint;
546}
547
548
549if (!empty($moreforfilter)) {
550 print '<div class="liste_titre liste_titre_bydiv centpercent">';
551 print $moreforfilter;
552 $parameters = array();
553 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
554 print $hookmanager->resPrint;
555 print '</div>';
556}
557
558$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
559$selectedfields = ($mode != 'kanban' ? $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')) : ''); // This also change content of $arrayfields
560$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
561
562
563print '<div class="div-table-responsive">';
564print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
565
566// Fields title search
567// --------------------------------------------------------------------
568print '<tr class="liste_titre_filter">';
569// Action column
570if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
571 print '<td class="liste_titre center maxwidthsearch">';
572 $searchpicto = $form->showFilterButtons('left');
573 print $searchpicto;
574 print '</td>';
575}
576if (!empty($arrayfields['c.ref']['checked'])) {
577 print '<td class="liste_titre">';
578 print '<input type="hidden" name="mode" value="'.$mode.'">';
579 print '<input type="text" class="flat maxwidth75" name="search_contract" value="'.dol_escape_htmltag($search_contract).'">';
580 print '</td>';
581}
582// Service label
583if (!empty($arrayfields['p.description']['checked'])) {
584 print '<td class="liste_titre">';
585 print '<input type="text" class="flat maxwidth100" name="search_service" value="'.dol_escape_htmltag($search_service).'">';
586 print '</td>';
587}
588// detail lines
589if (!empty($arrayfields['cd.tva_tx']['checked'])) {
590 print '<td class="liste_titre">';
591 print '</td>';
592}
593if (!empty($arrayfields['cd.subprice']['checked'])) {
594 print '<td class="liste_titre right">';
595 print '<input type="text" class="flat maxwidth50 right" name="search_subprice" value="'.dol_escape_htmltag($search_subprice).'">';
596 print '</td>';
597}
598if (!empty($arrayfields['cd.qty']['checked'])) {
599 print '<td class="liste_titre right">';
600 print '<input type="text" class="flat maxwidth50 right" name="search_qty" value="'.dol_escape_htmltag($search_qty).'">';
601 print '</td>';
602}
603if (!empty($arrayfields['cd.total_ht']['checked'])) {
604 print '<td class="liste_titre right">';
605 print '<input type="text" class="flat maxwidth50" name="search_total_ht" value="'.dol_escape_htmltag($search_total_ht).'">';
606 print '</td>';
607}
608if (!empty($arrayfields['cd.total_tva']['checked'])) {
609 print '<td class="liste_titre right">';
610 print '<input type="text" class="flat maxwidth50" name="search_total_tva" value="'.dol_escape_htmltag($search_total_tva).'">';
611 print '</td>';
612}
613// Third party
614if (!empty($arrayfields['s.nom']['checked'])) {
615 print '<td class="liste_titre">';
616 print '<input type="text" class="flat maxwidth100" name="search_name" value="'.dol_escape_htmltag($search_name).'">';
617 print '</td>';
618}
619
620if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
621 print '<td class="liste_titre center">';
622 $arrayofoperators = array('<'=>'<', '>'=>'>');
623 print $form->selectarray('filter_opouvertureprevue', $arrayofoperators, $filter_opouvertureprevue, 1, 0, 0, '', 0, 0, 0, '', 'width50');
624 print ' ';
625 $filter_dateouvertureprevue = dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear);
626 print $form->selectDate($filter_dateouvertureprevue, 'opouvertureprevue', 0, 0, 1, '', 1, 0);
627 print '</td>';
628}
629if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
630 print '<td class="liste_titre center">';
631 $arrayofoperators = array('<'=>'<', '>'=>'>');
632 print $form->selectarray('filter_op1', $arrayofoperators, $filter_op1, 1, 0, 0, '', 0, 0, 0, '', 'width50');
633 print ' ';
634 $filter_date1 = dol_mktime(0, 0, 0, $op1month, $op1day, $op1year);
635 print $form->selectDate($filter_date1, 'op1', 0, 0, 1, '', 1, 0);
636 print '</td>';
637}
638if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
639 print '<td class="liste_titre center">';
640 $arrayofoperators = array('<'=>'<', '>'=>'>');
641 print $form->selectarray('filter_op2', $arrayofoperators, $filter_op2, 1, 0, 0, '', 0, 0, 0, '', 'width50');
642 print ' ';
643 $filter_date2 = dol_mktime(0, 0, 0, $op2month, $op2day, $op2year);
644 print $form->selectDate($filter_date2, 'op2', 0, 0, 1, '', 1, 0);
645 print '</td>';
646}
647if (!empty($arrayfields['cd.date_cloture']['checked'])) {
648 print '<td class="liste_titre center">';
649 $arrayofoperators = array('<'=>'<', '>'=>'>');
650 print $form->selectarray('filter_opcloture', $arrayofoperators, $filter_opcloture, 1, 0, 0, '', 0, 0, 0, '', 'width50');
651 print ' ';
652 $filter_date_cloture = dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear);
653 print $form->selectDate($filter_date_cloture, 'opcloture', 0, 0, 1, '', 1, 0);
654 print '</td>';
655}
656// Extra fields
657include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
658
659// Fields from hook
660$parameters = array('arrayfields'=>$arrayfields);
661$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
662print $hookmanager->resPrint;
663if (!empty($arrayfields['cd.datec']['checked'])) {
664 // Date creation
665 print '<td class="liste_titre">';
666 print '</td>';
667}
668if (!empty($arrayfields['cd.tms']['checked'])) {
669 // Date modification
670 print '<td class="liste_titre">';
671 print '</td>';
672}
673if (!empty($arrayfields['status']['checked'])) {
674 // Status
675 print '<td class="liste_titre right parentonrightofpage">';
676 $arrayofstatus = array(
677 '0'=>$langs->trans("ServiceStatusInitial"),
678 '4'=>$langs->trans("ServiceStatusRunning"),
679 '4&filter=notexpired'=>$langs->trans("ServiceStatusNotLate"),
680 '4&filter=expired'=>$langs->trans("ServiceStatusLate"),
681 '5'=>$langs->trans("ServiceStatusClosed")
682 );
683 $search_status_new = GETPOST('search_status', 'alpha');
684 if ($filter == 'expired' && !preg_match('/expired/', $search_status_new)) {
685 $search_status_new .= '&filter=expired';
686 }
687 print $form->selectarray('search_status', $arrayofstatus, (strstr($search_status_new, ',') ? -1 : $search_status_new), 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
688 print '</td>';
689}
690// Action column
691if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
692 print '<td class="liste_titre center maxwidthsearch">';
693 $searchpicto = $form->showFilterButtons();
694 print $searchpicto;
695 print '</td>';
696}
697print '</tr>'."\n";
698
699$totalarray = array();
700$totalarray['nbfield'] = 0;
701
702// Fields title label
703// --------------------------------------------------------------------
704print '<tr class="liste_titre">';
705// Action column
706if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
707 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
708 $totalarray['nbfield']++;
709}
710if (!empty($arrayfields['c.ref']['checked'])) {
711 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, "", $sortfield, $sortorder);
712}
713if (!empty($arrayfields['p.description']['checked'])) {
714 print_liste_field_titre($arrayfields['p.description']['label'], $_SERVER["PHP_SELF"], "p.description", "", $param, "", $sortfield, $sortorder);
715}
716if (!empty($arrayfields['cd.tva_tx']['checked'])) {
717 print_liste_field_titre($arrayfields['cd.tva_tx']['label'], $_SERVER["PHP_SELF"], "cd.tva_tx", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
718}
719if (!empty($arrayfields['cd.subprice']['checked'])) {
720 print_liste_field_titre($arrayfields['cd.subprice']['label'], $_SERVER["PHP_SELF"], "cd.subprice", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
721}
722if (!empty($arrayfields['cd.qty']['checked'])) {
723 print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
724}
725if (!empty($arrayfields['cd.total_ht']['checked'])) {
726 print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
727}
728if (!empty($arrayfields['cd.total_tva']['checked'])) {
729 print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
730}
731if (!empty($arrayfields['s.nom']['checked'])) {
732 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder);
733}
734if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
735 print_liste_field_titre($arrayfields['cd.date_ouverture_prevue']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture_prevue", "", $param, '', $sortfield, $sortorder, 'center ');
736}
737if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
738 print_liste_field_titre($arrayfields['cd.date_ouverture']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture", "", $param, '', $sortfield, $sortorder, 'center ');
739}
740if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
741 print_liste_field_titre($arrayfields['cd.date_fin_validite']['label'], $_SERVER["PHP_SELF"], "cd.date_fin_validite", "", $param, '', $sortfield, $sortorder, 'center ');
742}
743if (!empty($arrayfields['cd.date_cloture']['checked'])) {
744 print_liste_field_titre($arrayfields['cd.date_cloture']['label'], $_SERVER["PHP_SELF"], "cd.date_cloture", "", $param, '', $sortfield, $sortorder, 'center ');
745}
746// Extra fields
747include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
748// Hook fields
749$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
750$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
751print $hookmanager->resPrint;
752if (!empty($arrayfields['cd.datec']['checked'])) {
753 print_liste_field_titre($arrayfields['cd.datec']['label'], $_SERVER["PHP_SELF"], "cd.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
754}
755if (!empty($arrayfields['cd.tms']['checked'])) {
756 print_liste_field_titre($arrayfields['cd.tms']['label'], $_SERVER["PHP_SELF"], "cd.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
757}
758if (!empty($arrayfields['status']['checked'])) {
759 print_liste_field_titre($arrayfields['status']['label'], $_SERVER["PHP_SELF"], "cd.statut,c.statut", "", $param, '', $sortfield, $sortorder, 'right ');
760}
761// Action column
762if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
763 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
764 $totalarray['nbfield']++;
765}
766print '</tr>'."\n";
767
768
769// Loop on record
770// --------------------------------------------------------------------
771
772$contractstatic = new Contrat($db);
773$productstatic = new Product($db);
774
775$i = 0;
776$savnbfield = $totalarray['nbfield'];
777$totalarray = array('nbfield'=>0, 'cd.qty'=>0, 'cd.total_ht'=>0, 'cd.total_tva'=>0);
778$imaxinloop = ($limit ? min($num, $limit) : $num);
779while ($i < $imaxinloop) {
780 $obj = $db->fetch_object($resql);
781 if (empty($obj)) {
782 break; // Should not happen
783 }
784
785 $contractstatic->id = $obj->cid;
786 $contractstatic->ref = $obj->ref ? $obj->ref : $obj->cid;
787 $contractstatic->ref_customer = $obj->ref_customer;
788 $contractstatic->ref_supplier = $obj->ref_supplier;
789
790 $companystatic->id = $obj->socid;
791 $companystatic->name = $obj->name;
792 $companystatic->email = $obj->email;
793 $companystatic->client = $obj->client;
794 $companystatic->fournisseur = $obj->fournisseur;
795
796 $productstatic->id = $obj->pid;
797 $productstatic->type = $obj->ptype;
798 $productstatic->ref = $obj->pref;
799 $productstatic->entity = $obj->pentity;
800 $productstatic->status = $obj->tosell;
801 $productstatic->status_buy = $obj->tobuy;
802 $productstatic->label = $obj->label;
803 $productstatic->description = $obj->description;
804 $productstatic->barcode = $obj->barcode;
805
806 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
807
808 // Action column
809 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
810 print '<td class="nowrap center">';
811 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
812 $selected = 0;
813 if (in_array($obj->rowid, $arrayofselected)) {
814 $selected = 1;
815 }
816 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
817 }
818 print '</td>';
819 if (!$i) {
820 $totalarray['nbfield']++;
821 }
822 }
823 // Ref
824 if (!empty($arrayfields['c.ref']['checked'])) {
825 print '<td class="nowraponall">';
826 print $contractstatic->getNomUrl(1, 16);
827 print '</td>';
828 if (!$i) {
829 $totalarray['nbfield']++;
830 }
831 }
832 // Service
833 if (!empty($arrayfields['p.description']['checked'])) {
834 print '<td class="tdoverflowmax300">';
835 if ($obj->pid > 0) {
836 print $productstatic->getNomUrl(1, '', 24);
837 print $obj->label ? ' - '.dol_trunc($obj->label, 16) : '';
838 if (!empty($obj->description) && getDolGlobalString('PRODUCT_DESC_IN_LIST')) {
839 print '<br><span class="small">'.dol_nl2br($obj->description).'</span>';
840 }
841 } else {
842 if ($obj->type == 0) {
843 print img_object($obj->description, 'product').' '.dol_trunc($obj->description, 24);
844 }
845 if ($obj->type == 1) {
846 print img_object($obj->description, 'service').' '.dol_trunc($obj->description, 24);
847 }
848 }
849 print '</td>';
850 if (!$i) {
851 $totalarray['nbfield']++;
852 }
853 }
854
855 if (!empty($arrayfields['cd.tva_tx']['checked'])) {
856 print '<td class="right nowraponall">';
857 print price2num($obj->tva_tx).'%';
858 print '</td>';
859 if (!$i) {
860 $totalarray['nbfield']++;
861 }
862 }
863 if (!empty($arrayfields['cd.subprice']['checked'])) {
864 print '<td class="right nowraponall">';
865 print price($obj->subprice);
866 print '</td>';
867 if (!$i) {
868 $totalarray['nbfield']++;
869 }
870 }
871 if (!empty($arrayfields['cd.qty']['checked'])) {
872 print '<td class="right nowraponall">';
873 print $obj->qty;
874 print '</td>';
875 if (!$i) {
876 $totalarray['nbfield']++;
877 }
878 if (!$i) {
879 $totalarray['pos'][$totalarray['nbfield']] = 'cd.qty';
880 }
881 $totalarray['val']['cd.qty'] += $obj->qty;
882 }
883 if (!empty($arrayfields['cd.total_ht']['checked'])) {
884 print '<td class="right nowraponall">';
885 print '<span class="amount">'.price($obj->total_ht).'</span>';
886 print '</td>';
887 if (!$i) {
888 $totalarray['nbfield']++;
889 }
890 if (!$i) {
891 $totalarray['pos'][$totalarray['nbfield']] = 'cd.total_ht';
892 }
893 $totalarray['val']['cd.total_ht'] += $obj->total_ht;
894 }
895 if (!empty($arrayfields['cd.total_tva']['checked'])) {
896 print '<td class="right nowraponall">';
897 print '<span class="amount">'.price($obj->total_tva).'</span>';
898 print '</td>';
899 if (!$i) {
900 $totalarray['nbfield']++;
901 }
902 if (!$i) {
903 $totalarray['pos'][$totalarray['nbfield']] = 'cd.total_tva';
904 }
905 $totalarray['val']['cd.total_tva'] += $obj->total_tva;
906 }
907
908 // Third party
909 if (!empty($arrayfields['s.nom']['checked'])) {
910 print '<td class="tdoverflowmax100">';
911 print $companystatic->getNomUrl(1, 'customer', 28);
912 print '</td>';
913 if (!$i) {
914 $totalarray['nbfield']++;
915 }
916 }
917
918 // Start date
919 if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
920 print '<td class="center nowraponall">';
921 print($obj->date_ouverture_prevue ? dol_print_date($db->jdate($obj->date_ouverture_prevue), 'dayhour') : '&nbsp;');
922 if ($db->jdate($obj->date_ouverture_prevue) && ($db->jdate($obj->date_ouverture_prevue) < ($now - $conf->contrat->services->inactifs->warning_delay)) && $obj->statut == 0) {
923 print ' '.img_picto($langs->trans("Late"), "warning");
924 } else {
925 print '&nbsp;&nbsp;&nbsp;&nbsp;';
926 }
927 print '</td>';
928 if (!$i) {
929 $totalarray['nbfield']++;
930 }
931 }
932 if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
933 print '<td class="center nowraponall">'.($obj->date_ouverture ? dol_print_date($db->jdate($obj->date_ouverture), 'dayhour') : '&nbsp;').'</td>';
934 if (!$i) {
935 $totalarray['nbfield']++;
936 }
937 }
938 // End date
939 if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
940 print '<td class="center nowraponall">'.($obj->date_fin_validite ? dol_print_date($db->jdate($obj->date_fin_validite), 'dayhour') : '&nbsp;');
941 if ($obj->date_fin_validite && $db->jdate($obj->date_fin_validite) < ($now - $conf->contrat->services->expires->warning_delay) && $obj->statut < 5) {
942 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
943 $textlate = $langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($warning_delay) >= 0 ? '+' : '').ceil($warning_delay).' '.$langs->trans("days");
944 print img_warning($textlate);
945 } else {
946 print '&nbsp;&nbsp;&nbsp;&nbsp;';
947 }
948 print '</td>';
949 if (!$i) {
950 $totalarray['nbfield']++;
951 }
952 }
953 // Close date (real end date)
954 if (!empty($arrayfields['cd.date_cloture']['checked'])) {
955 print '<td class="center nowraponall">'.dol_print_date($db->jdate($obj->date_cloture), 'dayhour').'</td>';
956 if (!$i) {
957 $totalarray['nbfield']++;
958 }
959 }
960
961 // Extra fields
962 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
963 // Fields from hook
964 $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
965 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
966 print $hookmanager->resPrint;
967 // Date creation
968 if (!empty($arrayfields['cd.datec']['checked'])) {
969 print '<td class="center">';
970 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
971 print '</td>';
972 if (!$i) {
973 $totalarray['nbfield']++;
974 }
975 }
976 // Date modification
977 if (!empty($arrayfields['cd.tms']['checked'])) {
978 print '<td class="center nowraponall">';
979 print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
980 print '</td>';
981 if (!$i) {
982 $totalarray['nbfield']++;
983 }
984 }
985 // Status
986 if (!empty($arrayfields['status']['checked'])) {
987 print '<td class="right">';
988 if ($obj->cstatut == 0) {
989 // If contract is draft, we say line is also draft
990 print $contractstatic->LibStatut(0, 5);
991 } else {
992 print $staticcontratligne->LibStatut($obj->statut, 5, ($obj->date_fin_validite && $db->jdate($obj->date_fin_validite) < $now) ? 1 : 0);
993 }
994 print '</td>';
995 if (!$i) {
996 $totalarray['nbfield']++;
997 }
998 }
999 // Action column
1000 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1001 print '<td class="nowrap center">';
1002 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1003 $selected = 0;
1004 if (in_array($obj->rowid, $arrayofselected)) {
1005 $selected = 1;
1006 }
1007 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1008 }
1009 print '</td>';
1010 if (!$i) {
1011 $totalarray['nbfield']++;
1012 }
1013 }
1014
1015 print '</tr>'."\n";
1016 $i++;
1017}
1018
1019// Show total line
1020include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1021
1022// If no record found
1023if ($num == 0) {
1024 $colspan = 1;
1025 foreach ($arrayfields as $key => $val) {
1026 if (!empty($val['checked'])) {
1027 $colspan++;
1028 }
1029 }
1030 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1031}
1032
1033$db->free($resql);
1034
1035$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1036$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1037print $hookmanager->resPrint;
1038
1039print '</table>'."\n";
1040print '</div>'."\n";
1041
1042print '</form>'."\n";
1043
1044
1045// End of page
1046llxFooter();
1047$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage contracts.
Class to manage lines of contracts.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.