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