dolibarr 23.0.3
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-2020 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
6 * Copyright (C) 2014-2019 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2015 Claudio Aschieri <c.aschieri@19.coop>
8 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
9 * Copyright (C) 2016-2018 Ferran Marcet <fmarcet@2byte.es>
10 * Copyright (C) 2019 Nicolas Zabouri <info@inovea-conseil.com>
11 * Copyright (C) 2021-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
12 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
13 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
14 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
15 * Copyright (C) 2025 Charlene Benke <charlene@patas-monkey.com>
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 3 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program. If not, see <https://www.gnu.org/licenses/>.
29 */
30
37// Load Dolibarr environment
38require '../main.inc.php';
46require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
51require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
52if (isModEnabled("category")) {
53 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
54}
55
56// Load translation files required by the page
57$langs->loadLangs(array('contracts', 'products', 'companies', 'compta'));
58
59$action = GETPOST('action', 'aZ09');
60$massaction = GETPOST('massaction', 'alpha');
61$show_files = GETPOSTINT('show_files');
62$confirm = GETPOST('confirm', 'alpha');
63$toselect = GETPOST('toselect', 'array:int');
64$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'contractlist'; // To manage different context of search
65$optioncss = GETPOST('optioncss', 'alpha');
66$mode = GETPOST('mode', 'alpha');
67
68$socid = GETPOSTINT('socid');
69
70$search_name = GETPOST('search_name', 'alpha');
71$search_email = GETPOST('search_email', 'alpha');
72$search_town = GETPOST('search_town', 'alpha');
73$search_zip = GETPOST('search_zip', 'alpha');
74$search_state = GETPOST("search_state", 'alpha');
75$search_country = GETPOST("search_country", 'aZ09');
76$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
77$search_contract = GETPOST('search_contract', 'alpha');
78$search_ref_customer = GETPOST('search_ref_customer', 'alpha');
79$search_ref_supplier = GETPOST('search_ref_supplier', 'alpha');
80$search_all = GETPOST('search_all', 'alphanohtml');
81$search_status = GETPOST('search_status', 'alpha');
82$search_signed_status = GETPOST('search_signed_status', 'alpha');
83$search_note_public = GETPOST('search_note_public', 'alpha');
84$search_note_private = GETPOST('search_note_private', 'alpha');
85
86$search_user = GETPOST('search_user', 'intcomma');
87$search_sale = GETPOST('search_sale', 'intcomma');
88$search_product_category = GETPOST('search_product_category', 'intcomma');
89$search_dfmonth = GETPOSTINT('search_dfmonth');
90$search_dfyear = GETPOSTINT('search_dfyear');
91$search_op2df = GETPOST('search_op2df', 'alpha');
92$search_date_startday = GETPOSTINT('search_date_startday');
93$search_date_startmonth = GETPOSTINT('search_date_startmonth');
94$search_date_startyear = GETPOSTINT('search_date_startyear');
95$search_date_endday = GETPOSTINT('search_date_endday');
96$search_date_endmonth = GETPOSTINT('search_date_endmonth');
97$search_date_endyear = GETPOSTINT('search_date_endyear');
98$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
99$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
100$searchCategoryCustomerOperator = 0;
101if (GETPOSTISSET('formfilteraction')) {
102 $searchCategoryCustomerOperator = GETPOSTINT('search_category_customer_operator');
103} elseif (getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT')) {
104 $searchCategoryCustomerOperator = getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT');
105}
106$searchCategoryCustomerList = GETPOST('search_category_customer_list', 'array');
107
108$search_date_creation_startmonth = GETPOSTINT('search_date_creation_startmonth');
109$search_date_creation_startyear = GETPOSTINT('search_date_creation_startyear');
110$search_date_creation_startday = GETPOSTINT('search_date_creation_startday');
111$search_date_creation_start = dol_mktime(0, 0, 0, $search_date_creation_startmonth, $search_date_creation_startday, $search_date_creation_startyear); // Use tzserver
112$search_date_creation_endmonth = GETPOSTINT('search_date_creation_endmonth');
113$search_date_creation_endyear = GETPOSTINT('search_date_creation_endyear');
114$search_date_creation_endday = GETPOSTINT('search_date_creation_endday');
115$search_date_creation_end = dol_mktime(23, 59, 59, $search_date_creation_endmonth, $search_date_creation_endday, $search_date_creation_endyear); // Use tzserver
116
117$search_date_modif_startmonth = GETPOSTINT('search_date_modif_startmonth');
118$search_date_modif_startyear = GETPOSTINT('search_date_modif_startyear');
119$search_date_modif_startday = GETPOSTINT('search_date_modif_startday');
120$search_date_modif_start = dol_mktime(0, 0, 0, $search_date_modif_startmonth, $search_date_modif_startday, $search_date_modif_startyear); // Use tzserver
121$search_date_modif_endmonth = GETPOSTINT('search_date_modif_endmonth');
122$search_date_modif_endyear = GETPOSTINT('search_date_modif_endyear');
123$search_date_modif_endday = GETPOSTINT('search_date_modif_endday');
124$search_date_modif_end = dol_mktime(23, 59, 59, $search_date_modif_endmonth, $search_date_modif_endday, $search_date_modif_endyear); // Use tzserver
125
126// Load variable for pagination
127$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
128$sortfield = GETPOST('sortfield', 'aZ09comma');
129$sortorder = GETPOST('sortorder', 'aZ09comma');
130$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
131if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
132 // If $page is not defined, or '' or -1 or if we click on clear filters
133 $page = 0;
134}
135$offset = $limit * $page;
136$pageprev = $page - 1;
137$pagenext = $page + 1;
138if (!$sortfield) {
139 $sortfield = 'c.ref';
140}
141if (!$sortorder) {
142 $sortorder = 'DESC';
143}
144
145// Security check
146$id = GETPOSTINT('id');
147if ($user->socid > 0) {
148 $socid = $user->socid;
149}
150
151$hookmanager->initHooks(array('contractlist'));
152
153$result = restrictedArea($user, 'contrat', $id);
154
155$diroutputmassaction = $conf->contract->dir_output.'/temp/massgeneration/'.$user->id;
156
157if ($search_status == '') {
158 $search_status = 1;
159}
160
161// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
162$object = new Contrat($db);
163$extrafields = new ExtraFields($db);
164$staticcontratligne = new ContratLigne($db);
165
166// fetch optionals attributes and labels
167$extrafields->fetch_name_optionals_label($object->table_element);
168
169$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
170// List of fields to search into when doing a "search in all"
171$fieldstosearchall = array();
172foreach ($object->fields as $key => $val) {
173 if (!empty($val['searchall'])) {
174 $fieldstosearchall['c.'.$key] = $val['label'];
175 }
176}
177$fieldstosearchall["s.nom"] = "ThirdParty";
178if (empty($user->socid)) {
179 $fieldstosearchall["c.note_private"] = "NotePrivate";
180}
181$parameters = array('fieldstosearchall' => $fieldstosearchall);
182$reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
183if ($reshook > 0) {
184 $fieldstosearchall = $hookmanager->resArray['fieldstosearchall'];
185} elseif ($reshook == 0) {
186 if (!empty($hookmanager->resArray['fieldstosearchall'])) {
187 $fieldstosearchall = array_merge($fieldstosearchall, $hookmanager->resArray['fieldstosearchall']);
188 }
189}
190
191$arrayfields = array(
192 'c.ref' => array('label' => $langs->trans("Ref"), 'checked' => '1', 'position' => 10),
193 'c.ref_customer' => array('label' => $langs->trans("RefCustomer"), 'checked' => '1', 'position' => 12),
194 'c.ref_supplier' => array('label' => $langs->trans("RefSupplier"), 'checked' => '1', 'position' => 14),
195 's.nom' => array('label' => $langs->trans("ThirdParty"), 'checked' => '1', 'position' => 30),
196 's.email' => array('label' => $langs->trans("ThirdPartyEmail"), 'checked' => '0', 'position' => 30),
197 's.town' => array('label' => $langs->trans("Town"), 'checked' => '0', 'position' => 31),
198 's.zip' => array('label' => $langs->trans("Zip"), 'checked' => '1', 'position' => 32),
199 'state.nom' => array('label' => $langs->trans("StateShort"), 'checked' => '0', 'position' => 33),
200 'country.code_iso' => array('label' => $langs->trans("Country"), 'checked' => '0', 'position' => 34),
201 'sale_representative' => array('label' => $langs->trans("SaleRepresentativesOfThirdParty"), 'checked' => '-1', 'position' => 80),
202 'c.date_contrat' => array('label' => $langs->trans("DateContract"), 'checked' => '1', 'position' => 45),
203 'c.datec' => array('label' => $langs->trans("DateCreation"), 'checked' => '0', 'position' => 500),
204 'c.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => '0', 'position' => 500),
205 'c.note_public' => array('label' => $langs->trans("NotePublic"), 'checked' => '0', 'position' => 520, 'enabled' => (string) (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
206 'c.note_private' => array('label' => $langs->trans("NotePrivate"), 'checked' => '0', 'position' => 521, 'enabled' => (string) (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
207 'lower_planned_end_date' => array('label' => $langs->trans("LowerDateEndPlannedShort"), 'checked' => '1', 'position' => 900, 'help' => $langs->trans("LowerDateEndPlannedShort")),
208 'status' => array('label' => $langs->trans("Status"), 'checked' => '1', 'position' => 1000),
209 'c.signed_status' => array('label' => $langs->trans('SignedStatus'), 'checked' => '0', 'position' => 1001),
210);
211// Extra fields
212include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
213
214$object->fields = dol_sort_array($object->fields, 'position');
215$arrayfields = dol_sort_array($arrayfields, 'position');
216
217if (empty($user->socid) && !$user->hasRight('societe', 'client', 'voir')) {
218 $search_sale = $user->id;
219}
220
221$permissiontoread = $user->hasRight('contrat', 'lire');
222$permissiontoadd = $user->hasRight('contrat', 'creer');
223$permissiontodelete = $user->hasRight('contrat', 'supprimer');
224
225$result = restrictedArea($user, 'contrat', 0);
226
227
228
229/*
230 * Actions
231 */
232
233if (GETPOST('cancel', 'alpha')) {
234 $action = 'list';
235 $massaction = '';
236}
237if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
238 $massaction = '';
239}
240
241$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
242$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
243if ($reshook < 0) {
244 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
245}
246
247include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
248// Purge search criteria
249if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers
250 $search_dfmonth = '';
251 $search_dfyear = '';
252 $search_op2df = '';
253 $search_name = "";
254 $search_email = "";
255 $search_town = '';
256 $search_zip = "";
257 $search_state = "";
258 $search_type_thirdparty = '';
259 $search_country = '';
260 $search_contract = "";
261 $search_ref_customer = "";
262 $search_ref_supplier = "";
263 $search_user = '';
264 $search_sale = '';
265 $search_product_category = '';
266 $search_date_startday = '';
267 $search_date_startmonth = '';
268 $search_date_startyear = '';
269 $search_date_endday = '';
270 $search_date_endmonth = '';
271 $search_date_endyear = '';
272 $search_date_start = '';
273 $search_date_end = '';
274 $search_all = "";
275 $search_date_creation_startmonth = "";
276 $search_date_creation_startyear = "";
277 $search_date_creation_startday = "";
278 $search_date_creation_start = "";
279 $search_date_creation_endmonth = "";
280 $search_date_creation_endyear = "";
281 $search_date_creation_endday = "";
282 $search_date_creation_end = "";
283 $search_date_modif_startmonth = "";
284 $search_date_modif_startyear = "";
285 $search_date_modif_startday = "";
286 $search_date_modif_start = "";
287 $search_date_modif_endmonth = "";
288 $search_date_modif_endyear = "";
289 $search_date_modif_endday = "";
290 $search_date_modif_end = "";
291 $search_status = "";
292 $search_signed_status = '';
293 $search_note_public = "";
294 $search_note_private = "";
295 $toselect = array();
296 $searchCategoryCustomerList = array();
297 $search_array_options = array();
298}
299
300if (empty($reshook)) {
301 $objectclass = 'Contrat';
302 $objectlabel = 'Contracts';
303 $uploaddir = $conf->contract->dir_output;
304 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
305}
306
307
308/*
309 * View
310 */
311
312$form = new Form($db);
313$formfile = new FormFile($db);
314$formother = new FormOther($db);
315$socstatic = new Societe($db);
316$formcompany = new FormCompany($db);
317$contracttmp = new Contrat($db);
318
319$now = dol_now();
320
321$title = "";
322
323$sql = 'SELECT';
324$sql .= " c.rowid, c.ref, c.datec as date_creation, c.tms as date_modification, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier, c.note_private, c.note_public, c.entity, c.signed_status,";
325$sql .= ' s.rowid as socid, s.nom as name, s.name_alias, s.email, s.town, s.zip, s.fk_pays as country_id, s.client, s.code_client, s.status as company_status, s.logo as company_logo,';
326$sql .= " typent.code as typent_code, c.note_public, c.note_private,";
327$sql .= " state.code_departement as state_code, state.nom as state_name,";
328// TODO Add a denormalized field "denormalized_lower_planned_end_date" so we can remove the HAVING and then,
329// remove completely the SUM and GROUP BY (faster). Status of each service can be read into the loop that build the list.
330$sql .= " MIN(".$db->ifsql("cd.statut=4", "cd.date_fin_validite", "null").") as lower_planned_end_date,"; // lowest expiration date among open service lines
331$sql .= " SUM(".$db->ifsql("cd.statut=0", '1', '0').') as nb_initial,';
332$sql .= " SUM(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NULL OR cd.date_fin_validite >= '".$db->idate($now)."')", '1', '0').') as nb_running,';
333$sql .= " SUM(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now)."')", '1', '0').') as nb_expired,';
334$sql .= " SUM(".$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now - $conf->contract->services->expires->warning_delay)."')", '1', '0').') as nb_late,';
335$sql .= " SUM(".$db->ifsql("cd.statut=5", '1', '0').') as nb_closed';
336// Add fields from extrafields
337if (!empty($extrafields->attributes[$object->table_element]['label'])) {
338 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
339 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
340 }
341}
342// Add fields from hooks
343$parameters = array();
344$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
345$sql .= $hookmanager->resPrint;
346$sql = preg_replace('/,\s*$/', '', $sql);
347
348$sqlfields = $sql; // $sql fields to remove for count total
349
350$sql .= " FROM ".MAIN_DB_PREFIX."contrat as c";
351$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON (c.fk_soc = s.rowid)";
352$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
353$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
354$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
355if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
356 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (c.rowid = ef.fk_object)";
357}
358$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."contratdet as cd ON c.rowid = cd.fk_contrat";
359if ($search_user > 0) {
360 $sql .= ", ".MAIN_DB_PREFIX."element_contact as ec";
361 $sql .= ", ".MAIN_DB_PREFIX."c_type_contact as tc";
362}
363// Add table from hooks
364$parameters = array();
365$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
366$sql .= $hookmanager->resPrint;
367$sql .= " WHERE c.entity IN (".getEntity('contract').")";
368if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
369 $sql .= " AND s.fk_typent IN (".$db->sanitize($db->escape($search_type_thirdparty)).')';
370}
371if ($socid > 0) {
372 $sql .= " AND s.rowid = ".((int) $socid);
373}
374if ($search_date_start) {
375 $sql .= " AND c.date_contrat >= '".$db->idate($search_date_start)."'";
376}
377if ($search_date_end) {
378 $sql .= " AND c.date_contrat <= '".$db->idate($search_date_end)."'";
379}
380if ($search_name) {
381 $sql .= natural_search('s.nom', $search_name);
382}
383if ($search_email) {
384 $sql .= natural_search('s.email', $search_email);
385}
386if ($search_contract) {
387 $sql .= natural_search(array('c.rowid', 'c.ref'), $search_contract);
388}
389if (!empty($search_ref_customer)) {
390 $sql .= natural_search(array('c.ref_customer'), $search_ref_customer);
391}
392if (!empty($search_ref_supplier)) {
393 $sql .= natural_search(array('c.ref_supplier'), $search_ref_supplier);
394}
395if ($search_zip) {
396 $sql .= natural_search(array('s.zip'), $search_zip);
397}
398if ($search_town) {
399 $sql .= natural_search(array('s.town'), $search_town);
400}
401if ($search_country && $search_country != '-1') {
402 $sql .= " AND s.fk_pays IN (".$db->sanitize($search_country).')';
403}
404if (!empty($search_note_private)) {
405 $sql .= natural_search(array('c.note_private'), $search_note_private);
406}
407if (!empty($search_note_public)) {
408 $sql .= natural_search(array('c.note_public'), $search_note_public);
409}
410
411/*if ($search_sale > 0) {
412 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
413}*/
414if ($search_all) {
415 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
416}
417if ($search_user > 0) {
418 $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='contrat' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".((int) $search_user);
419}
420// Search on sale representative
421if ($search_sale && $search_sale != '-1') {
422 if ($search_sale == -2) {
423 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc)";
424 } elseif ($search_sale > 0) {
425 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
426 }
427}
428// Search for tag/category ($searchCategoryProductList is an array of ID)
429$searchCategoryProductOperator = GETPOSTINT('search_category_product_operator');
430$searchCategoryProductList = array($search_product_category);
431if (!empty($searchCategoryProductList)) {
432 $searchCategoryProductSqlList = array();
433 $listofcategoryid = '';
434 foreach ($searchCategoryProductList as $searchCategoryProduct) {
435 if (intval($searchCategoryProduct) == -2) {
436 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."contratdet as cd WHERE cd.fk_contrat = c.rowid AND cd.fk_product = ck.fk_product)";
437 } elseif (intval($searchCategoryProduct) > 0) {
438 if ($searchCategoryProductOperator == 0) {
439 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."contratdet as cd WHERE cd.fk_contrat = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
440 } else {
441 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
442 }
443 }
444 }
445 if ($listofcategoryid) {
446 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."contratdet as cd WHERE cd.fk_contrat = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
447 }
448 if ($searchCategoryProductOperator == 1) {
449 if (!empty($searchCategoryProductSqlList)) {
450 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
451 }
452 } else {
453 if (!empty($searchCategoryProductSqlList)) {
454 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
455 }
456 }
457}
458$searchCategoryCustomerSqlList = array();
459if ($searchCategoryCustomerOperator == 1) {
460 $existsCategoryCustomerList = array();
461 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
462 if (intval($searchCategoryCustomer) == -2) {
463 $sqlCategoryCustomerNotExists = " NOT EXISTS (";
464 $sqlCategoryCustomerNotExists .= " SELECT cat_cus.fk_soc";
465 $sqlCategoryCustomerNotExists .= " FROM ".$db->prefix()."categorie_societe AS cat_cus";
466 $sqlCategoryCustomerNotExists .= " WHERE cat_cus.fk_soc = s.rowid";
467 $sqlCategoryCustomerNotExists .= " )";
468 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerNotExists;
469 } elseif (intval($searchCategoryCustomer) > 0) {
470 $existsCategoryCustomerList[] = $db->escape($searchCategoryCustomer);
471 }
472 }
473 if (!empty($existsCategoryCustomerList)) {
474 $sqlCategoryCustomerExists = " EXISTS (";
475 $sqlCategoryCustomerExists .= " SELECT cat_cus.fk_soc";
476 $sqlCategoryCustomerExists .= " FROM ".$db->prefix()."categorie_societe AS cat_cus";
477 $sqlCategoryCustomerExists .= " WHERE cat_cus.fk_soc = s.rowid";
478 $sqlCategoryCustomerExists .= " AND cat_cus.fk_categorie IN (".$db->sanitize(implode(',', $existsCategoryCustomerList)).")";
479 $sqlCategoryCustomerExists .= " )";
480 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerExists;
481 }
482 if (!empty($searchCategoryCustomerSqlList)) {
483 $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
484 }
485} else {
486 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
487 if (intval($searchCategoryCustomer) == -2) {
488 $sqlCategoryCustomerNotExists = " NOT EXISTS (";
489 $sqlCategoryCustomerNotExists .= " SELECT cat_cus.fk_soc";
490 $sqlCategoryCustomerNotExists .= " FROM ".$db->prefix()."categorie_societe AS cat_cus";
491 $sqlCategoryCustomerNotExists .= " WHERE cat_cus.fk_soc = s.rowid";
492 $sqlCategoryCustomerNotExists .= " )";
493 $searchCategoryCustomerSqlList[] = $sqlCategoryCustomerNotExists;
494 } elseif (intval($searchCategoryCustomer) > 0) {
495 $searchCategoryCustomerSqlList[] = "s.rowid IN (SELECT fk_soc FROM ".$db->prefix()."categorie_societe WHERE fk_categorie = ".((int) $searchCategoryCustomer).")";
496 }
497 }
498 if (!empty($searchCategoryCustomerSqlList)) {
499 $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
500 }
501}
502
503if ($search_date_creation_start) {
504 $sql .= " AND c.datec >= '".$db->idate($search_date_creation_start)."'";
505}
506if ($search_date_creation_end) {
507 $sql .= " AND c.datec <= '".$db->idate($search_date_creation_end)."'";
508}
509
510if ($search_date_modif_start) {
511 $sql .= " AND c.tms >= '".$db->idate($search_date_modif_start)."'";
512}
513if ($search_date_modif_end) {
514 $sql .= " AND c.tms <= '".$db->idate($search_date_modif_end)."'";
515}
516if ($search_signed_status != '' && $search_signed_status >= 0) {
517 $sql .= " AND c.signed_status = '".$db->escape($search_signed_status)."'";
518}
519
520// Add where from extra fields
521include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
522// Add where from hooks
523$parameters = array();
524$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
525$sql .= $hookmanager->resPrint;
526$sql .= " GROUP BY c.rowid, c.ref, c.datec, c.tms, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier, c.note_private, c.note_public, c.entity, c.signed_status,";
527$sql .= ' s.rowid, s.nom, s.name_alias, s.email, s.town, s.zip, s.fk_pays, s.client, s.code_client, s.status, s.logo,';
528$sql .= " typent.code, c.note_public, c.note_private,";
529$sql .= " state.code_departement, state.nom";
530// Add fields from extrafields
531if (!empty($extrafields->attributes[$object->table_element]['label'])) {
532 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
533 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key : '');
534 }
535}
536// Add where from hooks
537$parameters = array('search_dfyear' => $search_dfyear, 'search_op2df' => $search_op2df);
538$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
539$sql .= $hookmanager->resPrint;
540// Add HAVING from hooks
541$parameters = array('search_dfyear' => $search_dfyear, 'search_op2df' => $search_op2df);
542$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
543if (empty($reshook)) {
544 if ($search_dfyear > 0 && $search_op2df) {
545 if ($search_op2df == '<=') {
546 $sql .= " HAVING MIN(".$db->ifsql("cd.statut=4", "cd.date_fin_validite", "null").") <= '".$db->idate(dol_get_last_day($search_dfyear, $search_dfmonth, false))."'";
547 } elseif ($search_op2df == '>=') {
548 $sql .= " HAVING MIN(".$db->ifsql("cd.statut=4", "cd.date_fin_validite", "null").") >= '".$db->idate(dol_get_first_day($search_dfyear, $search_dfmonth, false))."'";
549 } else {
550 $sql .= " HAVING MIN(".$db->ifsql("cd.statut=4", "cd.date_fin_validite", "null").") <= '".$db->idate(dol_get_last_day($search_dfyear, $search_dfmonth, false))."' AND MIN(".$db->ifsql("cd.statut=4", "cd.date_fin_validite", "null").") >= '".$db->idate(dol_get_first_day($search_dfyear, $search_dfmonth, false))."'";
551 }
552 $sql .= empty($hookmanager->resPrint) ? "" : " AND ".$hookmanager->resPrint;
553 } else {
554 $sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
555 }
556} else {
557 $sql = $hookmanager->resPrint;
558}
559
560// Count total nb of records
561$nbtotalofrecords = '';
562if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
563 //$result = $db->query($sql);
564 //$nbtotalofrecords = $db->num_rows($result);
565
566 if ($search_dfyear > 0 && $search_op2df) {
567 $resql = $db->query($sql, 0, 'auto', 1);
568 while ($db->fetch_object($resql)) {
569 if (empty($nbtotalofrecords)) {
570 $nbtotalofrecords = 1; // We can't make +1 because init value is ''
571 } else {
572 $nbtotalofrecords++;
573 }
574 }
575 } else {
576 /* The fast and low memory method to get and count full list converts the sql into a sql count */
577 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
578
579 $sqlforcount = str_replace('LEFT JOIN '.MAIN_DB_PREFIX.'c_country as country on (country.rowid = s.fk_pays)', '', $sqlforcount);
580 $sqlforcount = str_replace('LEFT JOIN '.MAIN_DB_PREFIX.'c_typent as typent on (typent.id = s.fk_typent)', '', $sqlforcount);
581 $sqlforcount = str_replace('LEFT JOIN '.MAIN_DB_PREFIX.'c_departements as state on (state.rowid = s.fk_departement)', '', $sqlforcount);
582 $sqlforcount = str_replace('LEFT JOIN '.MAIN_DB_PREFIX.'contratdet as cd ON c.rowid = cd.fk_contrat', '', $sqlforcount);
583 //$sqlforcount = str_replace('LEFT JOIN '.MAIN_DB_PREFIX.'contrat_extrafields as ef on (c.rowid = ef.fk_object)', '', $sqlforcount); // We my need this if there is filters on extrafields
584 $sqlforcount = preg_replace('/GROUP BY.*$/', '', $sqlforcount);
585
586 $resql = $db->query($sqlforcount);
587 if ($resql) {
588 $objforcount = $db->fetch_object($resql);
589 $nbtotalofrecords = $objforcount->nbtotalofrecords;
590 } else {
591 dol_print_error($db);
592 }
593 }
594
595 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
596 $page = 0;
597 $offset = 0;
598 }
599 $db->free($resql);
600}
601
602// Complete request and execute it with limit
603$sql .= $db->order($sortfield, $sortorder);
604if ($limit) {
605 $sql .= $db->plimit($limit + 1, $offset);
606}
607
608$resql = $db->query($sql);
609if (!$resql) {
610 dol_print_error($db);
611 exit;
612}
613
614$num = $db->num_rows($resql);
615
616// Direct jump if only one record found
617if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
618 $obj = $db->fetch_object($resql);
619 $id = $obj->rowid;
620 header("Location: ".DOL_URL_ROOT.'/contrat/card.php?id='.$id);
621 exit;
622}
623
624
625// Output page
626// --------------------------------------------------------------------
627$title = $langs->trans("Contracts");
628$help_url = 'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
629
630llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-contrat page-list bodyforlist');
631
632$i = 0;
633
634$arrayofselected = is_array($toselect) ? $toselect : array();
635
636if ($socid > 0) {
637 $soc = new Societe($db);
638 $soc->fetch($socid);
639 if (empty($search_name)) {
640 $search_name = $soc->name;
641 }
642}
643
644$param = '';
645if (!empty($mode)) {
646 $param .= '&mode='.urlencode($mode);
647}
648if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
649 $param .= '&contextpage='.urlencode($contextpage);
650}
651if ($limit > 0 && $limit != $conf->liste_limit) {
652 $param .= '&limit='.((int) $limit);
653}
654if ($search_all != '') {
655 $param .= '&search_all='.urlencode($search_all);
656}
657if ($search_contract != '') {
658 $param .= '&search_contract='.urlencode($search_contract);
659}
660if ($search_name != '') {
661 $param .= '&search_name='.urlencode($search_name);
662}
663if ($search_email != '') {
664 $param .= '&search_email='.urlencode($search_email);
665}
666if ($search_ref_customer != '') {
667 $param .= '&search_ref_customer='.urlencode($search_ref_customer);
668}
669if ($search_ref_supplier != '') {
670 $param .= '&search_ref_supplier='.urlencode($search_ref_supplier);
671}
672if ($search_note_private != '') {
673 $param .= '&search_note_private='.urlencode($search_note_private);
674}
675if ($search_note_public != '') {
676 $param .= '&search_note_public='.urlencode($search_note_public);
677}
678if ($search_op2df != '') {
679 $param .= '&search_op2df='.urlencode($search_op2df);
680}
681if ($search_date_creation_startmonth) {
682 $param .= '&search_date_creation_startmonth='.urlencode((string) ($search_date_creation_startmonth));
683}
684if ($search_date_creation_startyear) {
685 $param .= '&search_date_creation_startyear='.urlencode((string) ($search_date_creation_startyear));
686}
687if ($search_date_creation_startday) {
688 $param .= '&search_date_creation_startday='.urlencode((string) ($search_date_creation_startday));
689}
690if ($search_date_creation_start) {
691 $param .= '&search_date_creation_start='.urlencode((string) $search_date_creation_start);
692}
693if ($search_date_creation_endmonth) {
694 $param .= '&search_date_creation_endmonth='.urlencode((string) ($search_date_creation_endmonth));
695}
696if ($search_date_creation_endyear) {
697 $param .= '&search_date_creation_endyear='.urlencode((string) ($search_date_creation_endyear));
698}
699if ($search_date_creation_endday) {
700 $param .= '&search_date_creation_endday='.urlencode((string) ($search_date_creation_endday));
701}
702if ($search_date_creation_end) {
703 $param .= '&search_date_creation_end='.urlencode((string) $search_date_creation_end);
704}
705if ($search_date_modif_startmonth) {
706 $param .= '&search_date_modif_startmonth='.urlencode((string) ($search_date_modif_startmonth));
707}
708if ($search_date_modif_startyear) {
709 $param .= '&search_date_modif_startyear='.urlencode((string) ($search_date_modif_startyear));
710}
711if ($search_date_modif_startday) {
712 $param .= '&search_date_modif_startday='.urlencode((string) ($search_date_modif_startday));
713}
714if ($search_date_modif_start) {
715 $param .= '&search_date_modif_start='.urlencode((string) $search_date_modif_start);
716}
717if ($search_date_modif_endmonth) {
718 $param .= '&search_date_modif_endmonth='.urlencode((string) ($search_date_modif_endmonth));
719}
720if ($search_date_modif_endyear) {
721 $param .= '&search_date_modif_endyear='.urlencode((string) ($search_date_modif_endyear));
722}
723if ($search_date_modif_endday) {
724 $param .= '&search_date_modif_endday='.urlencode((string) ($search_date_modif_endday));
725}
726if ($search_date_modif_end) {
727 $param .= '&search_date_modif_end=' . urlencode((string) $search_date_modif_end);
728}
729if ($search_date_startday > 0) {
730 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
731}
732if ($search_date_startmonth > 0) {
733 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
734}
735if ($search_date_startyear > 0) {
736 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
737}
738if ($search_date_endday > 0) {
739 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
740}
741if ($search_date_endmonth > 0) {
742 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
743}
744if ($search_date_endyear > 0) {
745 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
746}
747if ($search_dfyear > 0) {
748 $param .= '&search_dfyear='.urlencode((string) ($search_dfyear));
749}
750if ($search_dfmonth > 0) {
751 $param .= '&search_dfmonth='.urlencode((string) ($search_dfmonth));
752}
753if ($search_signed_status != '' && $search_signed_status >= 0) {
754 $param .= '&search_signed_status='.urlencode($search_signed_status);
755}
756if ($search_sale > 0) {
757 $param .= '&search_sale='.urlencode($search_sale);
758}
759if ($search_user > 0) {
760 $param .= '&search_user='.urlencode((string) ($search_user));
761}
762if ($search_type_thirdparty > 0) {
763 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
764}
765if ($search_country != '') {
766 $param .= "&search_country=".urlencode($search_country);
767}
768if ($search_product_category > 0) {
769 $param .= '&search_product_category='.urlencode((string) ($search_product_category));
770}
771if ($show_files) {
772 $param .= '&show_files='.urlencode((string) ($show_files));
773}
774if ($optioncss != '') {
775 $param .= '&optioncss='.urlencode($optioncss);
776}
777foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
778 $param .= "&search_category_customer_list[]=".urlencode($searchCategoryCustomer);
779}
780// Add $param from extra fields
781include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
782
783// List of mass actions available
784$arrayofmassactions = array(
785 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
786 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
787 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
788);
789if (!empty($permissiontodelete)) {
790 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
791}
792if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
793 $arrayofmassactions = array();
794}
795$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
796
797$url = DOL_URL_ROOT.'/contrat/card.php?action=create';
798if (!empty($socid)) {
799 $url .= '&socid='.((int) $socid);
800}
801$newcardbutton = '';
802$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss' => 'reposition'));
803$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss' => 'reposition'));
804$newcardbutton .= dolGetButtonTitleSeparator();
805$newcardbutton .= dolGetButtonTitle($langs->trans('NewContractSubscription'), '', 'fa fa-plus-circle', $url, '', $user->hasRight('contrat', 'creer'));
806
807print '<form method="POST" id="searchFormList" action="'.$_SERVER['PHP_SELF'].'">'."\n";
808if ($optioncss != '') {
809 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
810}
811print '<input type="hidden" name="token" value="'.newToken().'">';
812print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
813print '<input type="hidden" name="action" value="list">';
814print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
815print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
816print '<input type="hidden" name="page" value="'.$page.'">';
817print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
818print '<input type="hidden" name="page_y" value="">';
819print '<input type="hidden" name="mode" value="'.$mode.'">';
820
821// @phan-suppress-next-line PhanPluginSuspiciousParamOrder
822print_barre_liste($langs->trans("Contracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'contract', 0, $newcardbutton, '', $limit, 0, 0, 1);
823
824$topicmail = "SendContractRef";
825$modelmail = "contract";
826$objecttmp = new Contrat($db);
827$trackid = 'con'.$object->id;
828include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
829
830if ($search_all) {
831 $setupstring = '';
832 foreach ($fieldstosearchall as $key => $val) {
833 $fieldstosearchall[$key] = $langs->trans($val);
834 $setupstring .= $key."=".$val.";";
835 }
836 print '<!-- Search done like if CONTRACT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
837 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
838}
839
840$moreforfilter = '';
841
842// If the user can view prospects other than his'
843if ($user->hasRight('user', 'user', 'lire')) {
844 $langs->load("commercial");
845 $moreforfilter .= '<div class="divsearchfield">';
846 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
847 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'widthcentpercentminusx maxwidth300');
848 $moreforfilter .= '</div>';
849}
850// If the user can view other users
851if ($user->hasRight('user', 'user', 'lire')) {
852 $moreforfilter .= '<div class="divsearchfield">';
853 $tmptitle = $langs->trans('LinkedToSpecificUsers');
854 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, null, 0, '', '', '0', 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
855 $moreforfilter .= '</div>';
856}
857// If the user can view categories of products
858if (isModEnabled('category') && $user->hasRight('categorie', 'lire') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
859 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
860 $moreforfilter .= '<div class="divsearchfield">';
861 $tmptitle = $langs->trans('IncludingProductWithTag');
862 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', 'parent', 64, 0, 2);
863 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, '', 'widthcentpercentminusx maxwidth300', 1);
864 $moreforfilter .= '</div>';
865}
866// Filter on customer categories
867if (getDolGlobalString('MAIN_SEARCH_CATEGORY_CUSTOMER_ON_CONTRACT_LIST') && isModEnabled("category") && $user->hasRight('categorie', 'lire')) {
868 $moreforfilter .= '<div class="divsearchfield">';
869 $tmptitle = $langs->transnoentities('CustomersProspectsCategoriesShort');
870 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"');
871 $categoriesArr = $form->select_all_categories(Categorie::TYPE_CUSTOMER, '', '', 64, 0, 2);
872 $categoriesArr[-2] = '- '.$langs->trans('NotCategorized').' -';
873 $moreforfilter .= Form::multiselectarray('search_category_customer_list', $categoriesArr, $searchCategoryCustomerList, 0, 0, 'minwidth300', 0, 0, '', 'category', $tmptitle);
874 $moreforfilter .= ' <input type="checkbox" class="valignmiddle" id="search_category_customer_operator" name="search_category_customer_operator" value="1"'.($searchCategoryCustomerOperator == 1 ? ' checked="checked"' : '').'/>';
875 $moreforfilter .= $form->textwithpicto('', $langs->trans('UseOrOperatorForCategories') . ' : ' . $tmptitle, 1, 'help', '', 0, 2, 'tooltip_cat_cus'); // Tooltip on click
876 $moreforfilter .= '</div>';
877}
878
879$parameters = array();
880$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
881if (empty($reshook)) {
882 $moreforfilter .= $hookmanager->resPrint;
883} else {
884 $moreforfilter = $hookmanager->resPrint;
885}
886
887if (!empty($moreforfilter)) {
888 print '<div class="liste_titre liste_titre_bydiv centpercent">';
889 print $moreforfilter;
890 print '</div>';
891}
892
893$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
894$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
895if ($massactionbutton) {
896 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
897}
898
899print '<div class="div-table-responsive">';
900print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
901
902// Fields title search
903// --------------------------------------------------------------------
904print '<tr class="liste_titre_filter">';
905// Action column
906if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
907 print '<td class="liste_titre maxwidthsearch center">';
908 $searchpicto = $form->showFilterButtons('left');
909 print $searchpicto;
910 print '</td>';
911}
912if (!empty($arrayfields['c.ref']['checked'])) {
913 print '<td class="liste_titre">';
914 print '<input type="text" class="flat" size="3" name="search_contract" value="'.dol_escape_htmltag($search_contract).'">';
915 print '</td>';
916}
917if (!empty($arrayfields['c.ref_customer']['checked'])) {
918 print '<td class="liste_titre">';
919 print '<input type="text" class="flat" size="6" name="search_ref_customer" value="'.dol_escape_htmltag($search_ref_customer).'">';
920 print '</td>';
921}
922if (!empty($arrayfields['c.ref_supplier']['checked'])) {
923 print '<td class="liste_titre">';
924 print '<input type="text" class="flat" size="6" name="search_ref_supplier" value="'.dol_escape_htmltag($search_ref_supplier).'">';
925 print '</td>';
926}
927if (!empty($arrayfields['s.nom']['checked'])) {
928 print '<td class="liste_titre">';
929 print '<input type="text" class="flat" size="8" name="search_name" value="'.dol_escape_htmltag($search_name).'"'.($user->socid > 0 ? " disabled" : "").'>';
930 print '</td>';
931}
932if (!empty($arrayfields['s.email']['checked'])) {
933 print '<td class="liste_titre">';
934 print '<input type="text" class="flat" size="6" name="search_email" value="'.dol_escape_htmltag($search_email).'">';
935 print '</td>';
936}
937// Town
938if (!empty($arrayfields['s.town']['checked'])) {
939 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_town" value="'.dol_escape_htmltag($search_town).'"></td>';
940}
941// Zip
942if (!empty($arrayfields['s.zip']['checked'])) {
943 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_zip" value="'.dol_escape_htmltag($search_zip).'"></td>';
944}
945// State
946if (!empty($arrayfields['state.nom']['checked'])) {
947 print '<td class="liste_titre">';
948 print '<input class="flat" size="4" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
949 print '</td>';
950}
951// Country
952if (!empty($arrayfields['country.code_iso']['checked'])) {
953 print '<td class="liste_titre center">';
954 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
955 print '</td>';
956}
957// Company type
958if (!empty($arrayfields['typent.code']['checked'])) {
959 print '<td class="liste_titre maxwidthonsmartphone center">';
960 print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (!getDolGlobalString('SOCIETE_SORT_ON_TYPEENT') ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1);
961 print '</td>';
962}
963if (!empty($arrayfields['sale_representative']['checked'])) {
964 print '<td class="liste_titre"></td>';
965}
966if (!empty($arrayfields['c.date_contrat']['checked'])) {
967 print '<td class="liste_titre center">';
968 print '<div class="nowrapfordate">';
969 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
970 print '</div>';
971 print '<div class="nowrapfordate">';
972 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
973 print '</div>';
974 print '</td>';
975}
976// Signed status
977if (!empty($arrayfields['c.signed_status']['checked'])) {
978 print '<td class="liste_titre center">';
979 $list_signed_status = $object->getSignedStatusLocalisedArray();
980 print $form->selectarray('search_signed_status', $list_signed_status, $search_signed_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status');
981 print '</td>';
982}
983// Public note
984if (!empty($arrayfields['c.note_public']['checked'])) {
985 print '<td class="liste_titre center">';
986 print '<input class="flat" size="10" type="text" name="search_note_public" value="'.dol_escape_htmltag($search_note_public).'">';
987 print '</td>';
988}
989// Private note
990if (!empty($arrayfields['c.note_private']['checked'])) {
991 print '<td class="liste_titre center">';
992 print '<input class="flat" size="10" type="text" name="search_note_private" value="'.dol_escape_htmltag($search_note_private).'">';
993 print '</td>';
994}
995// Extra fields
996include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
997
998// Fields from hook
999$parameters = array('arrayfields' => $arrayfields);
1000$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1001print $hookmanager->resPrint;
1002// Creation date
1003if (!empty($arrayfields['c.datec']['checked'])) {
1004 print '<td class="liste_titre center nowraponall">';
1005 print '<div class="nowrapfordate">';
1006 print $form->selectDate($search_date_creation_start ? $search_date_creation_start : -1, 'search_date_creation_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1007 print '</div>';
1008 print '<div class="nowrapfordate">';
1009 print $form->selectDate($search_date_creation_end ? $search_date_creation_end : -1, 'search_date_creation_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1010 print '</div>';
1011 print '</td>';
1012}
1013// Modification date
1014if (!empty($arrayfields['c.tms']['checked'])) {
1015 print '<td class="liste_titre center nowraponall">';
1016 print '<div class="nowrapfordate">';
1017 print $form->selectDate($search_date_modif_start ? $search_date_modif_start : -1, 'search_date_modif_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1018 print '</div>';
1019 print '<div class="nowrapfordate">';
1020 print $form->selectDate($search_date_modif_end ? $search_date_modif_end : -1, 'search_date_modif_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1021 print '</div>';
1022 print '</td>';
1023}
1024// First end date
1025if (!empty($arrayfields['lower_planned_end_date']['checked'])) {
1026 print '<td class="liste_titre nowraponall center">';
1027 $arrayofoperators = array('0' => '', '=' => '=', '<=' => '<=', '>=' => '>=');
1028 print $form->selectarray('search_op2df', $arrayofoperators, $search_op2df, 0, 0, 0, '', 0, 0, 0, '', 'maxwidth50imp');
1029 print '</br>';
1030 print $formother->select_month($search_dfmonth, 'search_dfmonth', 1, 0);
1031 print ' ';
1032 print $formother->selectyear($search_dfyear, 'search_dfyear', 1, 20, 5, 0, 0, '');
1033 print '</td>';
1034}
1035// Status
1036if (!empty($arrayfields['status']['checked'])) {
1037 print '<td class="liste_titre right" colspan="4"></td>';
1038}
1039
1040// Action column
1041if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1042 print '<td class="liste_titre center">';
1043 $searchpicto = $form->showFilterButtons();
1044 print $searchpicto;
1045 print '</td>';
1046}
1047print '</tr>'."\n";
1048
1049$totalarray = array();
1050$totalarray['nbfield'] = 0;
1051
1052// Fields title label
1053// --------------------------------------------------------------------
1054print '<tr class="liste_titre">';
1055if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1056 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1057 $totalarray['nbfield']++; // For the column action
1058}
1059if (!empty($arrayfields['c.ref']['checked'])) {
1060 // False positive @phan-suppress-next-line PhanTypeInvalidDimOffset
1061 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref", "", $param, '', $sortfield, $sortorder);
1062 $totalarray['nbfield']++; // For the column action
1063}
1064if (!empty($arrayfields['c.ref_customer']['checked'])) {
1065 print_liste_field_titre($arrayfields['c.ref_customer']['label'], $_SERVER["PHP_SELF"], "c.ref_customer", "", $param, '', $sortfield, $sortorder);
1066 $totalarray['nbfield']++; // For the column action
1067}
1068if (!empty($arrayfields['c.ref_supplier']['checked'])) {
1069 print_liste_field_titre($arrayfields['c.ref_supplier']['label'], $_SERVER["PHP_SELF"], "c.ref_supplier", "", $param, '', $sortfield, $sortorder);
1070 $totalarray['nbfield']++; // For the column action
1071}
1072if (!empty($arrayfields['s.nom']['checked'])) {
1073 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
1074 $totalarray['nbfield']++; // For the column action
1075}
1076if (!empty($arrayfields['s.email']['checked'])) {
1077 print_liste_field_titre($arrayfields['s.email']['label'], $_SERVER["PHP_SELF"], "s.email", "", $param, '', $sortfield, $sortorder);
1078 $totalarray['nbfield']++; // For the column action
1079}
1080if (!empty($arrayfields['s.town']['checked'])) {
1081 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1082 $totalarray['nbfield']++; // For the column action
1083}
1084if (!empty($arrayfields['s.zip']['checked'])) {
1085 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1086 $totalarray['nbfield']++; // For the column action
1087}
1088if (!empty($arrayfields['state.nom']['checked'])) {
1089 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1090 $totalarray['nbfield']++; // For the column action
1091}
1092if (!empty($arrayfields['country.code_iso']['checked'])) {
1093 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1094 $totalarray['nbfield']++; // For the column action
1095}
1096if (!empty($arrayfields['typent.code']['checked'])) {
1097 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1098 $totalarray['nbfield']++; // For the column action
1099}
1100if (!empty($arrayfields['sale_representative']['checked'])) {
1101 print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder);
1102 $totalarray['nbfield']++; // For the column action
1103}
1104if (!empty($arrayfields['c.date_contrat']['checked'])) {
1105 print_liste_field_titre($arrayfields['c.date_contrat']['label'], $_SERVER["PHP_SELF"], "c.date_contrat", "", $param, '', $sortfield, $sortorder, 'center ');
1106 $totalarray['nbfield']++; // For the column action
1107}
1108if (!empty($arrayfields['c.signed_status']['checked'])) {
1109 print_liste_field_titre($arrayfields['c.signed_status']['label'], $_SERVER["PHP_SELF"], "c.signed_status", "", $param, '', $sortfield, $sortorder, 'center ');
1110 $totalarray['nbfield']++;
1111}
1112if (!empty($arrayfields['c.note_public']['checked'])) {
1113 print_liste_field_titre($arrayfields['c.note_public']['label'], $_SERVER["PHP_SELF"], "c.note_public", "", $param, '', $sortfield, $sortorder, 'center ');
1114 $totalarray['nbfield']++;
1115}
1116if (!empty($arrayfields['c.note_private']['checked'])) {
1117 print_liste_field_titre($arrayfields['c.note_private']['label'], $_SERVER["PHP_SELF"], "c.note_private", "", $param, '', $sortfield, $sortorder, 'center ');
1118 $totalarray['nbfield']++;
1119}
1120// Extra fields
1121include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1122// Hook fields
1123$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
1124$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1125print $hookmanager->resPrint;
1126if (!empty($arrayfields['c.datec']['checked'])) {
1127 print_liste_field_titre($arrayfields['c.datec']['label'], $_SERVER["PHP_SELF"], "c.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1128 $totalarray['nbfield']++; // For the column action
1129}
1130if (!empty($arrayfields['c.tms']['checked'])) {
1131 print_liste_field_titre($arrayfields['c.tms']['label'], $_SERVER["PHP_SELF"], "c.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1132 $totalarray['nbfield']++; // For the column action
1133}
1134if (!empty($arrayfields['lower_planned_end_date']['checked'])) {
1135 print_liste_field_titre($arrayfields['lower_planned_end_date']['label'], $_SERVER["PHP_SELF"], "lower_planned_end_date", "", $param, '', $sortfield, $sortorder, 'center ');
1136 $totalarray['nbfield']++; // For the column action
1137}
1138if (!empty($arrayfields['status']['checked'])) {
1139 print_liste_field_titre($staticcontratligne->LibStatut(0, 3, -1, 'class="nochangebackground"'), '', '', '', '', 'width="16"');
1140 $totalarray['nbfield']++; // For the column action
1141 print_liste_field_titre($staticcontratligne->LibStatut(4, 3, 0, 'class="nochangebackground"'), '', '', '', '', 'width="16"');
1142 $totalarray['nbfield']++; // For the column action
1143 print_liste_field_titre($staticcontratligne->LibStatut(4, 3, 1, 'class="nochangebackground"'), '', '', '', '', 'width="16"');
1144 $totalarray['nbfield']++; // For the column action
1145 print_liste_field_titre($staticcontratligne->LibStatut(5, 3, -1, 'class="nochangebackground"'), '', '', '', '', 'width="16"');
1146 $totalarray['nbfield']++; // For the column action
1147}
1148if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1149 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1150 $totalarray['nbfield']++; // For the column action
1151}
1152print "</tr>\n";
1153
1154// Loop on record
1155// --------------------------------------------------------------------
1156$i = 0;
1157$savnbfield = $totalarray['nbfield'];
1158$totalarray = array();
1159$totalarray['nbfield'] = 0;
1160$typenArray = array();
1161$cacheCountryIDCode = array();
1162$imaxinloop = ($limit ? min($num, $limit) : $num);
1163while ($i < $imaxinloop) {
1164 $obj = $db->fetch_object($resql);
1165 if (empty($obj)) {
1166 break; // Should not happen
1167 }
1168
1169 $contracttmp->ref = $obj->ref;
1170 $contracttmp->id = $obj->rowid;
1171 $contracttmp->ref_customer = $obj->ref_customer;
1172 $contracttmp->ref_supplier = $obj->ref_supplier;
1173
1174 $contracttmp->nbofserviceswait = $obj->nb_initial;
1175 $contracttmp->nbofservicesopened = $obj->nb_running;
1176 $contracttmp->nbofservicesexpired = $obj->nb_expired;
1177 $contracttmp->nbofservicesclosed = $obj->nb_closed;
1178 $contracttmp->signed_status = $obj->signed_status;
1179
1180 $socstatic->id = $obj->socid;
1181 $socstatic->name = $obj->name;
1182 $socstatic->name_alias = $obj->name_alias;
1183 $socstatic->email = $obj->email;
1184 $socstatic->status = $obj->company_status;
1185 $socstatic->logo = $obj->company_logo;
1186 $socstatic->country_id = $obj->country_id;
1187 $socstatic->country_code = '';
1188 $socstatic->country = '';
1189
1190 if ($obj->country_id > 0) {
1191 if (!isset($cacheCountryIDCode[$obj->country_id]['code'])) {
1192 $tmparray = getCountry($obj->country_id, 'all');
1193 $cacheCountryIDCode[$obj->country_id] = array('code' => empty($tmparray['code']) ? '' : $tmparray['code'], 'label' => empty($tmparray['label']) ? '' : $tmparray['label']);
1194 }
1195 $socstatic->country_code = $cacheCountryIDCode[$obj->country_id]['code'];
1196 $socstatic->country = $cacheCountryIDCode[$obj->country_id]['label'];
1197 }
1198
1199 if ($mode == 'kanban') {
1200 if ($i == 0) {
1201 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1202 print '<div class="box-flex-container kanban">';
1203 }
1204 // Output Kanban
1205 $arraydata = array();
1206 $arraydata['thirdparty'] = $socstatic;
1207 $arraydata['selected'] = in_array($obj->rowid, $arrayofselected);
1208 $contracttmp->date_contrat = $obj->date_contrat;
1209 print $contracttmp->getKanbanView('', $arraydata);
1210 if ($i == ($imaxinloop - 1)) {
1211 print '</div>';
1212 print '</td></tr>';
1213 }
1214 } else {
1215 // Show here line of result
1216 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
1217 // Action column
1218 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1219 print '<td class="nowrap center">';
1220 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1221 $selected = 0;
1222 if (in_array($obj->rowid, $arrayofselected)) {
1223 $selected = 1;
1224 }
1225 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1226 }
1227 print '</td>';
1228 if (!$i) {
1229 $totalarray['nbfield']++;
1230 }
1231 }
1232 // Ref
1233 if (!empty($arrayfields['c.ref']['checked'])) {
1234 print '<td class="nowraponall">';
1235 print $contracttmp->getNomUrl(1);
1236 if ($obj->nb_late) {
1237 print img_warning($langs->trans("Late"));
1238 }
1239 if (!empty($obj->note_private) || !empty($obj->note_public)) {
1240 print ' <span class="note">';
1241 print '<a href="'.DOL_URL_ROOT.'/contrat/note.php?id='.$obj->rowid.'&save_lastsearch_values=1">'.img_picto($langs->trans("ViewPrivateNote"), 'note').'</a>';
1242 print '</span>';
1243 }
1244
1245 $filename = dol_sanitizeFileName($obj->ref);
1246 $filedir = $conf->contrat->multidir_output[$obj->entity].'/'.dol_sanitizeFileName($obj->ref);
1247 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
1248 print $formfile->getDocumentsLink($contracttmp->element, $filename, $filedir);
1249 print '</td>';
1250
1251 print '</td>';
1252 if (!$i) {
1253 $totalarray['nbfield']++;
1254 }
1255 }
1256
1257 // Ref thirdparty
1258 if (!empty($arrayfields['c.ref_customer']['checked'])) {
1259 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag(dol_string_nohtmltag($contracttmp->getFormatedCustomerRef($obj->ref_customer))).'">'.$contracttmp->getFormatedCustomerRef($obj->ref_customer).'</td>';
1260 if (!$i) {
1261 $totalarray['nbfield']++;
1262 }
1263 }
1264 if (!empty($arrayfields['c.ref_supplier']['checked'])) {
1265 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->ref_supplier).'">'.dol_escape_htmltag($obj->ref_supplier).'</td>';
1266 }
1267 if (!empty($arrayfields['s.nom']['checked'])) {
1268 print '<td class="tdoverflowmax150">';
1269 if ($obj->socid > 0) {
1270 // TODO Use a cache for this string
1271 print $socstatic->getNomUrl(1, '');
1272 }
1273 print '</td>';
1274 }
1275 // Email
1276 if (!empty($arrayfields['s.email']['checked'])) {
1277 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->email).'">'.dol_print_email($obj->email, 0, $obj->socid, 1, 0, 1, 1).'</td>';
1278 }
1279 // Town
1280 if (!empty($arrayfields['s.town']['checked'])) {
1281 print '<td class="nocellnopadd">';
1282 print $obj->town;
1283 print '</td>';
1284 if (!$i) {
1285 $totalarray['nbfield']++;
1286 }
1287 }
1288 // Zip
1289 if (!empty($arrayfields['s.zip']['checked'])) {
1290 print '<td class="center nocellnopadd">';
1291 print $obj->zip;
1292 print '</td>';
1293 if (!$i) {
1294 $totalarray['nbfield']++;
1295 }
1296 }
1297 // State
1298 if (!empty($arrayfields['state.nom']['checked'])) {
1299 print "<td>".$obj->state_name."</td>\n";
1300 if (!$i) {
1301 $totalarray['nbfield']++;
1302 }
1303 }
1304 // Country
1305 if (!empty($arrayfields['country.code_iso']['checked'])) {
1306 print '<td class="center tdoverflowmax100" title="'.dol_escape_htmltag($socstatic->country).'">';
1307 print dol_escape_htmltag($socstatic->country);
1308 print '</td>';
1309 if (!$i) {
1310 $totalarray['nbfield']++;
1311 }
1312 }
1313 // Type ent
1314 if (!empty($arrayfields['typent.code']['checked'])) {
1315 print '<td class="center">';
1316 if (count($typenArray) == 0) {
1317 $typenArray = $formcompany->typent_array(1);
1318 }
1319 print $typenArray[$obj->typent_code];
1320 print '</td>';
1321 if (!$i) {
1322 $totalarray['nbfield']++;
1323 }
1324 }
1325 if (!empty($arrayfields['sale_representative']['checked'])) {
1326 // Sales representatives
1327 print '<td>';
1328 if ($obj->socid > 0) {
1329 $listsalesrepresentatives = $socstatic->getSalesRepresentatives($user);
1330 if ($listsalesrepresentatives < 0) {
1331 dol_print_error($db);
1332 }
1333 $nbofsalesrepresentative = count($listsalesrepresentatives);
1334 if ($nbofsalesrepresentative > 6) {
1335 // We print only number
1336 print $nbofsalesrepresentative;
1337 } elseif ($nbofsalesrepresentative > 0) {
1338 $userstatic = new User($db);
1339 $j = 0;
1340 foreach ($listsalesrepresentatives as $val) {
1341 $userstatic->id = $val['id'];
1342 $userstatic->lastname = $val['lastname'];
1343 $userstatic->firstname = $val['firstname'];
1344 $userstatic->email = $val['email'];
1345 $userstatic->status = $val['statut'];
1346 $userstatic->entity = $val['entity'];
1347 $userstatic->photo = $val['photo'];
1348 $userstatic->login = $val['login'];
1349 $userstatic->phone = $val['phone'];
1350 $userstatic->job = $val['job'];
1351 $userstatic->gender = $val['gender'];
1352
1353 //print '<div class="float">':
1354 print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2);
1355 $j++;
1356 if ($j < $nbofsalesrepresentative) {
1357 print ' ';
1358 }
1359 //print '</div>';
1360 }
1361 }
1362 //else print $langs->trans("NoSalesRepresentativeAffected");
1363 } else {
1364 print '&nbsp;';
1365 }
1366 print '</td>';
1367 }
1368 // Date
1369 if (!empty($arrayfields['c.date_contrat']['checked'])) {
1370 print '<td class="center">'.dol_print_date($db->jdate($obj->date_contrat), 'day', 'tzserver').'</td>';
1371 }
1372 // Signed Status
1373 if (!empty($arrayfields['c.signed_status']['checked'])) {
1374 print '<td class="center">'.$contracttmp->getLibSignedStatus(5).'</td>';
1375 if (!$i) {
1376 $totalarray['nbfield']++;
1377 }
1378 }
1379 // public note
1380 if (!empty($arrayfields['c.note_public']['checked'])) {
1381 print '<td class="center">'.$obj->note_public.'</td>';
1382 if (!$i) {
1383 $totalarray['nbfield']++;
1384 }
1385 }
1386 // private note
1387 if (!empty($arrayfields['c.note_private']['checked'])) {
1388 print '<td class="center">'.$obj->note_private.'</td>';
1389 if (!$i) {
1390 $totalarray['nbfield']++;
1391 }
1392 }
1393 // Extra fields
1394 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1395 // Fields from hook
1396 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1397 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1398 print $hookmanager->resPrint;
1399 // Date creation
1400 if (!empty($arrayfields['c.datec']['checked'])) {
1401 print '<td class="center nowrap">';
1402 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1403 print '</td>';
1404 if (!$i) {
1405 $totalarray['nbfield']++;
1406 }
1407 }
1408 // Date modification
1409 if (!empty($arrayfields['c.tms']['checked'])) {
1410 print '<td class="center nowrap">';
1411 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1412 print '</td>';
1413 if (!$i) {
1414 $totalarray['nbfield']++;
1415 }
1416 }
1417 // Date lower end date
1418 if (!empty($arrayfields['lower_planned_end_date']['checked'])) {
1419 print '<td class="center nowrapforall">';
1420 print dol_print_date($db->jdate($obj->lower_planned_end_date), 'day', 'tzuser');
1421 print '</td>';
1422 if (!$i) {
1423 $totalarray['nbfield']++;
1424 }
1425 }
1426 // Status
1427 if (!empty($arrayfields['status']['checked'])) {
1428 print '<td class="center">'.($obj->nb_initial > 0 ? $obj->nb_initial : '').'</td>';
1429 print '<td class="center">'.($obj->nb_running > 0 ? $obj->nb_running : '').'</td>';
1430 print '<td class="center">'.($obj->nb_expired > 0 ? $obj->nb_expired : '').'</td>';
1431 print '<td class="center">'.($obj->nb_closed > 0 ? $obj->nb_closed : '').'</td>';
1432 if (!$i) {
1433 $totalarray['nbfield']++;
1434 $totalarray['nbfield']++;
1435 $totalarray['nbfield']++;
1436 $totalarray['nbfield']++;
1437 }
1438 }
1439 // Action column
1440 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1441 print '<td class="nowrap center">';
1442 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1443 $selected = 0;
1444 if (in_array($obj->rowid, $arrayofselected)) {
1445 $selected = 1;
1446 }
1447 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1448 }
1449 print '</td>';
1450 if (!$i) {
1451 $totalarray['nbfield']++;
1452 }
1453 }
1454
1455 print '</tr>'."\n";
1456 }
1457 $i++;
1458}
1459
1460// If no record found
1461if ($num == 0) {
1462 $colspan = 4; // Include the 4 columns of status
1463 foreach ($arrayfields as $key => $val) {
1464 if (!empty($val['checked'])) {
1465 $colspan++;
1466 }
1467 }
1468 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1469}
1470
1471$db->free($resql);
1472
1473$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1474$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1475print $hookmanager->resPrint;
1476
1477print '</table>'."\n";
1478print '</div>'."\n";
1479
1480print '</form>'."\n";
1481
1482$hidegeneratedfilelistifempty = 1;
1483if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1484 $hidegeneratedfilelistifempty = 0;
1485}
1486
1487// Show list of available documents
1488$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1489$urlsource .= str_replace('&amp;', '&', $param);
1490
1491$filedir = $diroutputmassaction;
1492$genallowed = $permissiontoread;
1493$delallowed = $permissiontoadd;
1494
1495print $formfile->showdocuments('massfilesarea_contract', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1496
1497
1498llxFooter();
1499$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage lines of contracts.
Class to manage standard extra fields.
Class to build HTML component for third parties management Only common components are here.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
static multiselectarray($htmlname, $array, $selected=array(), $key_in_label=0, $value_as_key=0, $morecss='', $translate=0, $width=0, $moreattrib='', $nu='', $placeholder='', $addjscombo=-1)
Show a multiselect form from an array.
Class permettant la generation de composants html autre Only common components are here.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_first_day($year, $month=1, $gm=false)
Return GMT time for first day of a month or year.
Definition date.lib.php:603
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:622
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show 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, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.