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