dolibarr 20.0.0
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//print $sql;
394
395// Count total nb of records
396$nbtotalofrecords = '';
397if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
398 $result = $db->query($sql);
399 $nbtotalofrecords = $db->num_rows($result);
400 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
401 $page = 0;
402 $offset = 0;
403 }
404}
405
406// Complete request and execute it with limit
407$sql .= $db->order($sortfield, $sortorder);
408if ($limit) {
409 $sql .= $db->plimit($limit + 1, $offset);
410}
411
412//print $sql;
413dol_syslog("contrat/services_list.php", LOG_DEBUG);
414$resql = $db->query($sql);
415if (!$resql) {
416 dol_print_error($db);
417 exit;
418}
419
420$num = $db->num_rows($resql);
421
422/*
423// Direct jump if only one record found
424if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
425 $obj = $db->fetch_object($resql);
426 $id = $obj->id;
427 header("Location: ".DOL_URL_ROOT.'/projet/tasks/task.php?id='.$id.'&withprojet=1');
428 exit;
429}*/
430
431
432// Output page
433// --------------------------------------------------------------------
434
435llxHeader('', $title, $help_url);
436
437$arrayofselected = is_array($toselect) ? $toselect : array();
438
439$param = '';
440if (!empty($mode)) {
441 $param .= '&mode='.urlencode($mode);
442}
443if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
444 $param .= '&contextpage='.urlencode($contextpage);
445}
446if ($limit > 0 && $limit != $conf->liste_limit) {
447 $param .= '&limit='.((int) $limit);
448}
449if ($optioncss != '') {
450 $param .= '&optioncss='.urlencode($optioncss);
451}
452if ($search_contract) {
453 $param .= '&amp;search_contract='.urlencode($search_contract);
454}
455if ($search_name) {
456 $param .= '&amp;search_name='.urlencode($search_name);
457}
458if ($search_subprice) {
459 $param .= '&amp;search_subprice='.urlencode($search_subprice);
460}
461if ($search_qty) {
462 $param .= '&amp;search_qty='.urlencode($search_qty);
463}
464if ($search_total_ht) {
465 $param .= '&amp;search_total_ht='.urlencode($search_total_ht);
466}
467if ($search_total_tva) {
468 $param .= '&amp;search_total_tva='.urlencode($search_total_tva);
469}
470if ($search_total_ttc) {
471 $param .= '&amp;search_total_ttc='.urlencode($search_total_ttc);
472}
473if ($search_service) {
474 $param .= '&amp;search_service='.urlencode($search_service);
475}
476if ($search_status) {
477 $param .= '&amp;search_status='.urlencode($search_status);
478}
479if (!empty($filter_opouvertureprevue) && $filter_opouvertureprevue != -1) {
480 $param .= '&amp;filter_opouvertureprevue='.urlencode($filter_opouvertureprevue);
481}
482if (!empty($filter_op1) && $filter_op1 != -1) {
483 $param .= '&amp;filter_op1='.urlencode($filter_op1);
484}
485if (!empty($filter_op2) && $filter_op2 != -1) {
486 $param .= '&amp;filter_op2='.urlencode($filter_op2);
487}
488if (!empty($filter_opcloture) && $filter_opcloture != -1) {
489 $param .= '&amp;filter_opcloture='.urlencode($filter_opcloture);
490}
491if ($filter_dateouvertureprevue_start != '') {
492 $param .= '&amp;opouvertureprevueday='.((int) $opouvertureprevueday).'&amp;opouvertureprevuemonth='.((int) $opouvertureprevuemonth).'&amp;opouvertureprevueyear='.((int) $opouvertureprevueyear);
493}
494if ($filter_date1_start != '') {
495 $param .= '&amp;op1day='.((int) $op1day).'&amp;op1month='.((int) $op1month).'&amp;op1year='.((int) $op1year);
496}
497if ($filter_date2_start != '') {
498 $param .= '&amp;op2day='.((int) $op2day).'&amp;op2month='.((int) $op2month).'&amp;op2year='.((int) $op2year);
499}
500if ($filter_datecloture_start != '') {
501 $param .= '&amp;opclotureday='.((int) $op2day).'&amp;opcloturemonth='.((int) $op2month).'&amp;opclotureyear='.((int) $op2year);
502}
503// Add $param from extra fields
504include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
505
506// List of mass actions available
507$arrayofmassactions = array(
508 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
509 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
510);
511//if ($user->hasRight('contrat', 'supprimer')) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
512//if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array();
513$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
514
515print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
516if ($optioncss != '') {
517 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
518}
519print '<input type="hidden" name="token" value="'.newToken().'">';
520print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
521print '<input type="hidden" name="action" value="list">';
522print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
523print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
524print '<input type="hidden" name="page" value="'.$page.'">';
525print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
526print '<input type="hidden" name="page_y" value="">';
527print '<input type="hidden" name="mode" value="'.$mode.'">';
528
529$newcardbutton = '';
530
531
532print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, '', '', $limit);
533
534if (!empty($sall)) {
535 $fieldstosearchall = array();
536 foreach ($fieldstosearchall as $key => $val) {
537 $fieldstosearchall[$key] = $langs->trans($val);
538 }
539 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $sall).implode(', ', $fieldstosearchall).'</div>';
540}
541
542$morefilter = '';
543$moreforfilter = '';
544
545// If the user can view categories of products
546if (isModEnabled('category') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
547 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
548 $moreforfilter .= '<div class="divsearchfield">';
549 $tmptitle = $langs->trans('IncludingProductWithTag');
550 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
551 $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);
552 $moreforfilter .= '</div>';
553}
554
555$parameters = array();
556$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
557if (empty($reshook)) {
558 $moreforfilter .= $hookmanager->resPrint;
559} else {
560 $moreforfilter = $hookmanager->resPrint;
561}
562
563
564if (!empty($moreforfilter)) {
565 print '<div class="liste_titre liste_titre_bydiv centpercent">';
566 print $moreforfilter;
567 print '</div>';
568}
569
570$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
571$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
572$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
573$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
574
575
576print '<div class="div-table-responsive">';
577print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
578
579// Fields title search
580// --------------------------------------------------------------------
581print '<tr class="liste_titre_filter">';
582// Action column
583if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
584 print '<td class="liste_titre center maxwidthsearch">';
585 $searchpicto = $form->showFilterButtons('left');
586 print $searchpicto;
587 print '</td>';
588}
589if (!empty($arrayfields['c.ref']['checked'])) {
590 print '<td class="liste_titre">';
591 print '<input type="hidden" name="mode" value="'.$mode.'">';
592 print '<input type="text" class="flat maxwidth75" name="search_contract" value="'.dol_escape_htmltag($search_contract).'">';
593 print '</td>';
594}
595// Service label
596if (!empty($arrayfields['p.description']['checked'])) {
597 print '<td class="liste_titre">';
598 print '<input type="text" class="flat maxwidth100" name="search_service" value="'.dol_escape_htmltag($search_service).'">';
599 print '</td>';
600}
601// detail lines
602if (!empty($arrayfields['cd.tva_tx']['checked'])) {
603 print '<td class="liste_titre">';
604 print '</td>';
605}
606if (!empty($arrayfields['cd.subprice']['checked'])) {
607 print '<td class="liste_titre right">';
608 print '<input type="text" class="flat maxwidth50 right" name="search_subprice" value="'.dol_escape_htmltag($search_subprice).'">';
609 print '</td>';
610}
611if (!empty($arrayfields['cd.qty']['checked'])) {
612 print '<td class="liste_titre right">';
613 print '<input type="text" class="flat maxwidth50 right" name="search_qty" value="'.dol_escape_htmltag($search_qty).'">';
614 print '</td>';
615}
616if (!empty($arrayfields['cd.total_ht']['checked'])) {
617 print '<td class="liste_titre right">';
618 print '<input type="text" class="flat maxwidth50" name="search_total_ht" value="'.dol_escape_htmltag($search_total_ht).'">';
619 print '</td>';
620}
621if (!empty($arrayfields['cd.total_tva']['checked'])) {
622 print '<td class="liste_titre right">';
623 print '<input type="text" class="flat maxwidth50" name="search_total_tva" value="'.dol_escape_htmltag($search_total_tva).'">';
624 print '</td>';
625}
626// Third party
627if (!empty($arrayfields['s.nom']['checked'])) {
628 print '<td class="liste_titre">';
629 print '<input type="text" class="flat maxwidth100" name="search_name" value="'.dol_escape_htmltag($search_name).'">';
630 print '</td>';
631}
632
633if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
634 print '<td class="liste_titre center">';
635 $arrayofoperators = array('<' => '<', '>' => '>');
636 print $form->selectarray('filter_opouvertureprevue', $arrayofoperators, $filter_opouvertureprevue, 1, 0, 0, '', 0, 0, 0, '', 'width50');
637 print ' ';
638 $filter_dateouvertureprevue = dol_mktime(0, 0, 0, $opouvertureprevuemonth, $opouvertureprevueday, $opouvertureprevueyear);
639 print $form->selectDate($filter_dateouvertureprevue, 'opouvertureprevue', 0, 0, 1, '', 1, 0);
640 print '</td>';
641}
642if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
643 print '<td class="liste_titre center">';
644 $arrayofoperators = array('<' => '<', '>' => '>');
645 print $form->selectarray('filter_op1', $arrayofoperators, $filter_op1, 1, 0, 0, '', 0, 0, 0, '', 'width50');
646 print ' ';
647 $filter_date1 = dol_mktime(0, 0, 0, $op1month, $op1day, $op1year);
648 print $form->selectDate($filter_date1, 'op1', 0, 0, 1, '', 1, 0);
649 print '</td>';
650}
651if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
652 print '<td class="liste_titre center">';
653 $arrayofoperators = array('<' => '<', '>' => '>');
654 print $form->selectarray('filter_op2', $arrayofoperators, $filter_op2, 1, 0, 0, '', 0, 0, 0, '', 'width50');
655 print ' ';
656 $filter_date2 = dol_mktime(0, 0, 0, $op2month, $op2day, $op2year);
657 print $form->selectDate($filter_date2, 'op2', 0, 0, 1, '', 1, 0);
658 print '</td>';
659}
660if (!empty($arrayfields['cd.date_cloture']['checked'])) {
661 print '<td class="liste_titre center">';
662 $arrayofoperators = array('<' => '<', '>' => '>');
663 print $form->selectarray('filter_opcloture', $arrayofoperators, $filter_opcloture, 1, 0, 0, '', 0, 0, 0, '', 'width50');
664 print ' ';
665 $filter_date_cloture = dol_mktime(0, 0, 0, $opcloturemonth, $opclotureday, $opclotureyear);
666 print $form->selectDate($filter_date_cloture, 'opcloture', 0, 0, 1, '', 1, 0);
667 print '</td>';
668}
669// Extra fields
670include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
671
672// Fields from hook
673$parameters = array('arrayfields' => $arrayfields);
674$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
675print $hookmanager->resPrint;
676if (!empty($arrayfields['cd.datec']['checked'])) {
677 // Date creation
678 print '<td class="liste_titre">';
679 print '</td>';
680}
681if (!empty($arrayfields['cd.tms']['checked'])) {
682 // Date modification
683 print '<td class="liste_titre">';
684 print '</td>';
685}
686if (!empty($arrayfields['status']['checked'])) {
687 // Status
688 print '<td class="liste_titre right parentonrightofpage">';
689 $arrayofstatus = array(
690 '0' => $langs->trans("ServiceStatusInitial"),
691 '4' => $langs->trans("ServiceStatusRunning"),
692 '4&filter=notexpired' => $langs->trans("ServiceStatusNotLate"),
693 '4&filter=expired' => $langs->trans("ServiceStatusLate"),
694 '5' => $langs->trans("ServiceStatusClosed")
695 );
696 $search_status_new = GETPOST('search_status', 'alpha');
697 if ($filter == 'expired' && !preg_match('/expired/', $search_status_new)) {
698 $search_status_new .= '&filter=expired';
699 }
700 print $form->selectarray('search_status', $arrayofstatus, (strstr($search_status_new, ',') ? -1 : $search_status_new), 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
701 print '</td>';
702}
703// Action column
704if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
705 print '<td class="liste_titre center maxwidthsearch">';
706 $searchpicto = $form->showFilterButtons();
707 print $searchpicto;
708 print '</td>';
709}
710print '</tr>'."\n";
711
712$totalarray = array();
713$totalarray['nbfield'] = 0;
714
715// Fields title label
716// --------------------------------------------------------------------
717print '<tr class="liste_titre">';
718// Action column
719if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
720 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
721 $totalarray['nbfield']++;
722}
723if (!empty($arrayfields['c.ref']['checked'])) {
724 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, "", $sortfield, $sortorder);
725}
726if (!empty($arrayfields['p.description']['checked'])) {
727 print_liste_field_titre($arrayfields['p.description']['label'], $_SERVER["PHP_SELF"], "p.description", "", $param, "", $sortfield, $sortorder);
728}
729if (!empty($arrayfields['cd.tva_tx']['checked'])) {
730 print_liste_field_titre($arrayfields['cd.tva_tx']['label'], $_SERVER["PHP_SELF"], "cd.tva_tx", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
731}
732if (!empty($arrayfields['cd.subprice']['checked'])) {
733 print_liste_field_titre($arrayfields['cd.subprice']['label'], $_SERVER["PHP_SELF"], "cd.subprice", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
734}
735if (!empty($arrayfields['cd.qty']['checked'])) {
736 print_liste_field_titre($arrayfields['cd.qty']['label'], $_SERVER["PHP_SELF"], "cd.qty", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
737}
738if (!empty($arrayfields['cd.total_ht']['checked'])) {
739 print_liste_field_titre($arrayfields['cd.total_ht']['label'], $_SERVER["PHP_SELF"], "cd.total_ht", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
740}
741if (!empty($arrayfields['cd.total_tva']['checked'])) {
742 print_liste_field_titre($arrayfields['cd.total_tva']['label'], $_SERVER["PHP_SELF"], "cd.total_tva", "", $param, '', $sortfield, $sortorder, 'right nowrap ');
743}
744if (!empty($arrayfields['s.nom']['checked'])) {
745 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, "", $sortfield, $sortorder);
746}
747if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
748 print_liste_field_titre($arrayfields['cd.date_ouverture_prevue']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture_prevue", "", $param, '', $sortfield, $sortorder, 'center ');
749}
750if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
751 print_liste_field_titre($arrayfields['cd.date_ouverture']['label'], $_SERVER["PHP_SELF"], "cd.date_ouverture", "", $param, '', $sortfield, $sortorder, 'center ');
752}
753if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
754 print_liste_field_titre($arrayfields['cd.date_fin_validite']['label'], $_SERVER["PHP_SELF"], "cd.date_fin_validite", "", $param, '', $sortfield, $sortorder, 'center ');
755}
756if (!empty($arrayfields['cd.date_cloture']['checked'])) {
757 print_liste_field_titre($arrayfields['cd.date_cloture']['label'], $_SERVER["PHP_SELF"], "cd.date_cloture", "", $param, '', $sortfield, $sortorder, 'center ');
758}
759// Extra fields
760include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
761// Hook fields
762$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
763$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
764print $hookmanager->resPrint;
765if (!empty($arrayfields['cd.datec']['checked'])) {
766 print_liste_field_titre($arrayfields['cd.datec']['label'], $_SERVER["PHP_SELF"], "cd.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
767}
768if (!empty($arrayfields['cd.tms']['checked'])) {
769 print_liste_field_titre($arrayfields['cd.tms']['label'], $_SERVER["PHP_SELF"], "cd.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
770}
771if (!empty($arrayfields['status']['checked'])) {
772 print_liste_field_titre($arrayfields['status']['label'], $_SERVER["PHP_SELF"], "cd.statut,c.statut", "", $param, '', $sortfield, $sortorder, 'right ');
773}
774// Action column
775if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
776 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
777 $totalarray['nbfield']++;
778}
779print '</tr>'."\n";
780
781
782// Loop on record
783// --------------------------------------------------------------------
784
785$contractstatic = new Contrat($db);
786$productstatic = new Product($db);
787
788$i = 0;
789$savnbfield = $totalarray['nbfield'];
790$totalarray = array('nbfield' => 0, 'val' => array('cd.qty' => 0, 'cd.total_ht' => 0, 'cd.total_tva' => 0));
791$imaxinloop = ($limit ? min($num, $limit) : $num);
792while ($i < $imaxinloop) {
793 $obj = $db->fetch_object($resql);
794 if (empty($obj)) {
795 break; // Should not happen
796 }
797
798 $contractstatic->id = $obj->cid;
799 $contractstatic->ref = $obj->ref ? $obj->ref : $obj->cid;
800 $contractstatic->ref_customer = $obj->ref_customer;
801 $contractstatic->ref_supplier = $obj->ref_supplier;
802
803 $companystatic->id = $obj->socid;
804 $companystatic->name = $obj->name;
805 $companystatic->email = $obj->email;
806 $companystatic->client = $obj->client;
807 $companystatic->fournisseur = $obj->fournisseur;
808
809 $productstatic->id = $obj->pid;
810 $productstatic->type = $obj->ptype;
811 $productstatic->ref = $obj->pref;
812 $productstatic->entity = $obj->pentity;
813 $productstatic->status = $obj->tosell;
814 $productstatic->status_buy = $obj->tobuy;
815 $productstatic->label = $obj->label;
816 $productstatic->description = $obj->description;
817 $productstatic->barcode = $obj->barcode;
818
819 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
820
821 // Action column
822 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
823 print '<td class="nowrap center">';
824 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
825 $selected = 0;
826 if (in_array($obj->rowid, $arrayofselected)) {
827 $selected = 1;
828 }
829 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
830 }
831 print '</td>';
832 if (!$i) {
833 $totalarray['nbfield']++;
834 }
835 }
836 // Ref
837 if (!empty($arrayfields['c.ref']['checked'])) {
838 print '<td class="nowraponall">';
839 print $contractstatic->getNomUrl(1, 16);
840 print '</td>';
841 if (!$i) {
842 $totalarray['nbfield']++;
843 }
844 }
845 // Service
846 if (!empty($arrayfields['p.description']['checked'])) {
847 print '<td class="tdoverflowmax300">';
848 if ($obj->pid > 0) {
849 print $productstatic->getNomUrl(1, '', 24);
850 print $obj->label ? ' - '.dol_trunc($obj->label, 16) : '';
851 if (!empty($obj->description) && getDolGlobalString('PRODUCT_DESC_IN_LIST')) {
852 print '<br><span class="small">'.dol_nl2br($obj->description).'</span>';
853 }
854 } else {
855 if ($obj->type == 0) {
856 print img_object($obj->description, 'product').' '.dol_trunc($obj->description, 24);
857 }
858 if ($obj->type == 1) {
859 print img_object($obj->description, 'service').' '.dol_trunc($obj->description, 24);
860 }
861 }
862 print '</td>';
863 if (!$i) {
864 $totalarray['nbfield']++;
865 }
866 }
867
868 if (!empty($arrayfields['cd.tva_tx']['checked'])) {
869 print '<td class="right nowraponall">';
870 print price2num($obj->tva_tx).'%';
871 print '</td>';
872 if (!$i) {
873 $totalarray['nbfield']++;
874 }
875 }
876 if (!empty($arrayfields['cd.subprice']['checked'])) {
877 print '<td class="right nowraponall">';
878 print price($obj->subprice);
879 print '</td>';
880 if (!$i) {
881 $totalarray['nbfield']++;
882 }
883 }
884 if (!empty($arrayfields['cd.qty']['checked'])) {
885 print '<td class="right nowraponall">';
886 print $obj->qty;
887 print '</td>';
888 if (!$i) {
889 $totalarray['nbfield']++;
890 }
891 if (!$i) {
892 $totalarray['pos'][$totalarray['nbfield']] = 'cd.qty';
893 }
894 $totalarray['val']['cd.qty'] += $obj->qty;
895 }
896 if (!empty($arrayfields['cd.total_ht']['checked'])) {
897 print '<td class="right nowraponall">';
898 print '<span class="amount">'.price($obj->total_ht).'</span>';
899 print '</td>';
900 if (!$i) {
901 $totalarray['nbfield']++;
902 }
903 if (!$i) {
904 $totalarray['pos'][$totalarray['nbfield']] = 'cd.total_ht';
905 }
906 $totalarray['val']['cd.total_ht'] += $obj->total_ht;
907 }
908 if (!empty($arrayfields['cd.total_tva']['checked'])) {
909 print '<td class="right nowraponall">';
910 print '<span class="amount">'.price($obj->total_tva).'</span>';
911 print '</td>';
912 if (!$i) {
913 $totalarray['nbfield']++;
914 }
915 if (!$i) {
916 $totalarray['pos'][$totalarray['nbfield']] = 'cd.total_tva';
917 }
918 $totalarray['val']['cd.total_tva'] += $obj->total_tva;
919 }
920
921 // Third party
922 if (!empty($arrayfields['s.nom']['checked'])) {
923 print '<td class="tdoverflowmax100">';
924 print $companystatic->getNomUrl(1, 'customer', 28);
925 print '</td>';
926 if (!$i) {
927 $totalarray['nbfield']++;
928 }
929 }
930
931 // Start date
932 if (!empty($arrayfields['cd.date_ouverture_prevue']['checked'])) {
933 print '<td class="center nowraponall">';
934 print($obj->date_ouverture_prevue ? dol_print_date($db->jdate($obj->date_ouverture_prevue), 'dayhour') : '&nbsp;');
935 if ($db->jdate($obj->date_ouverture_prevue) && ($db->jdate($obj->date_ouverture_prevue) < ($now - $conf->contrat->services->inactifs->warning_delay)) && $obj->statut == 0) {
936 print ' '.img_picto($langs->trans("Late"), "warning");
937 } else {
938 print '&nbsp;&nbsp;&nbsp;&nbsp;';
939 }
940 print '</td>';
941 if (!$i) {
942 $totalarray['nbfield']++;
943 }
944 }
945 if (!empty($arrayfields['cd.date_ouverture']['checked'])) {
946 print '<td class="center nowraponall">'.($obj->date_ouverture ? dol_print_date($db->jdate($obj->date_ouverture), 'dayhour') : '&nbsp;').'</td>';
947 if (!$i) {
948 $totalarray['nbfield']++;
949 }
950 }
951 // End date
952 if (!empty($arrayfields['cd.date_fin_validite']['checked'])) {
953 print '<td class="center nowraponall">'.($obj->date_fin_validite ? dol_print_date($db->jdate($obj->date_fin_validite), 'dayhour') : '&nbsp;');
954 if ($obj->date_fin_validite && $db->jdate($obj->date_fin_validite) < ($now - $conf->contrat->services->expires->warning_delay) && $obj->statut < 5) {
955 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
956 $textlate = $langs->trans("Late").' = '.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($warning_delay) >= 0 ? '+' : '').ceil($warning_delay).' '.$langs->trans("days");
957 print img_warning($textlate);
958 } else {
959 print '&nbsp;&nbsp;&nbsp;&nbsp;';
960 }
961 print '</td>';
962 if (!$i) {
963 $totalarray['nbfield']++;
964 }
965 }
966 // Close date (real end date)
967 if (!empty($arrayfields['cd.date_cloture']['checked'])) {
968 print '<td class="center nowraponall">'.dol_print_date($db->jdate($obj->date_cloture), 'dayhour').'</td>';
969 if (!$i) {
970 $totalarray['nbfield']++;
971 }
972 }
973
974 // Extra fields
975 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
976 // Fields from hook
977 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
978 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
979 print $hookmanager->resPrint;
980 // Date creation
981 if (!empty($arrayfields['cd.datec']['checked'])) {
982 print '<td class="center">';
983 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
984 print '</td>';
985 if (!$i) {
986 $totalarray['nbfield']++;
987 }
988 }
989 // Date modification
990 if (!empty($arrayfields['cd.tms']['checked'])) {
991 print '<td class="center nowraponall">';
992 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
993 print '</td>';
994 if (!$i) {
995 $totalarray['nbfield']++;
996 }
997 }
998 // Status
999 if (!empty($arrayfields['status']['checked'])) {
1000 print '<td class="right">';
1001 if ($obj->cstatut == 0) {
1002 // If contract is draft, we say line is also draft
1003 //print $contractstatic->LibStatut(0, 5);
1004 print $staticcontratligne->LibStatut($obj->statut, 5, ($obj->date_fin_validite && $db->jdate($obj->date_fin_validite) < $now) ? 1 : 0, '', ' - '.$langs->trans("Draft"));
1005 } else {
1006 print $staticcontratligne->LibStatut($obj->statut, 5, ($obj->date_fin_validite && $db->jdate($obj->date_fin_validite) < $now) ? 1 : 0);
1007 }
1008 print '</td>';
1009 if (!$i) {
1010 $totalarray['nbfield']++;
1011 }
1012 }
1013 // Action column
1014 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1015 print '<td class="nowrap center">';
1016 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1017 $selected = 0;
1018 if (in_array($obj->rowid, $arrayofselected)) {
1019 $selected = 1;
1020 }
1021 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1022 }
1023 print '</td>';
1024 if (!$i) {
1025 $totalarray['nbfield']++;
1026 }
1027 }
1028
1029 print '</tr>'."\n";
1030 $i++;
1031}
1032
1033// Show total line
1034include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1035
1036// If no record found
1037if ($num == 0) {
1038 $colspan = 1;
1039 foreach ($arrayfields as $key => $val) {
1040 if (!empty($val['checked'])) {
1041 $colspan++;
1042 }
1043 }
1044 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1045}
1046
1047$db->free($resql);
1048
1049$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1050$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1051print $hookmanager->resPrint;
1052
1053print '</table>'."\n";
1054print '</div>'."\n";
1055
1056print '</form>'."\n";
1057
1058
1059// End of page
1060llxFooter();
1061$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.