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);
1163$showinvalidemail = getDolGlobalInt('MAIN_SHOW_INVALID_EMAIL_IN_LIST', 1); // in list, we check only syntax of emails
1164while ($i < $imaxinloop) {
1165 $obj = $db->fetch_object($resql);
1166 if (empty($obj)) {
1167 break; // Should not happen
1168 }
1169
1170 $contracttmp->ref = $obj->ref;
1171 $contracttmp->id = $obj->rowid;
1172 $contracttmp->ref_customer = $obj->ref_customer;
1173 $contracttmp->ref_supplier = $obj->ref_supplier;
1174
1175 $contracttmp->nbofserviceswait = $obj->nb_initial;
1176 $contracttmp->nbofservicesopened = $obj->nb_running;
1177 $contracttmp->nbofservicesexpired = $obj->nb_expired;
1178 $contracttmp->nbofservicesclosed = $obj->nb_closed;
1179 $contracttmp->signed_status = $obj->signed_status;
1180
1181 $socstatic->id = $obj->socid;
1182 $socstatic->name = $obj->name;
1183 $socstatic->name_alias = $obj->name_alias;
1184 $socstatic->email = $obj->email;
1185 $socstatic->status = $obj->company_status;
1186 $socstatic->logo = $obj->company_logo;
1187 $socstatic->country_id = $obj->country_id;
1188 $socstatic->country_code = '';
1189 $socstatic->country = '';
1190
1191 if ($obj->country_id > 0) {
1192 if (!isset($cacheCountryIDCode[$obj->country_id]['code'])) {
1193 $tmparray = getCountry($obj->country_id, 'all');
1194 $cacheCountryIDCode[$obj->country_id] = array('code' => empty($tmparray['code']) ? '' : $tmparray['code'], 'label' => empty($tmparray['label']) ? '' : $tmparray['label']);
1195 }
1196 $socstatic->country_code = $cacheCountryIDCode[$obj->country_id]['code'];
1197 $socstatic->country = $cacheCountryIDCode[$obj->country_id]['label'];
1198 }
1199
1200 if ($mode == 'kanban') {
1201 if ($i == 0) {
1202 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1203 print '<div class="box-flex-container kanban">';
1204 }
1205 // Output Kanban
1206 $arraydata = array();
1207 $arraydata['thirdparty'] = $socstatic;
1208 $arraydata['selected'] = in_array($obj->rowid, $arrayofselected);
1209 $contracttmp->date_contrat = $obj->date_contrat;
1210 print $contracttmp->getKanbanView('', $arraydata);
1211 if ($i == ($imaxinloop - 1)) {
1212 print '</div>';
1213 print '</td></tr>';
1214 }
1215 } else {
1216 // Show here line of result
1217 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
1218 // Action column
1219 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1220 print '<td class="nowrap center">';
1221 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1222 $selected = 0;
1223 if (in_array($obj->rowid, $arrayofselected)) {
1224 $selected = 1;
1225 }
1226 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1227 }
1228 print '</td>';
1229 if (!$i) {
1230 $totalarray['nbfield']++;
1231 }
1232 }
1233 // Ref
1234 if (!empty($arrayfields['c.ref']['checked'])) {
1235 print '<td class="nowraponall">';
1236 print $contracttmp->getNomUrl(1);
1237 if ($obj->nb_late) {
1238 print img_warning($langs->trans("Late"));
1239 }
1240 if (!empty($obj->note_private) || !empty($obj->note_public)) {
1241 print ' <span class="note">';
1242 print '<a href="'.DOL_URL_ROOT.'/contrat/note.php?id='.$obj->rowid.'&save_lastsearch_values=1">'.img_picto($langs->trans("ViewPrivateNote"), 'note').'</a>';
1243 print '</span>';
1244 }
1245
1246 $filename = dol_sanitizeFileName($obj->ref);
1247 $filedir = $conf->contrat->multidir_output[$obj->entity].'/'.dol_sanitizeFileName($obj->ref);
1248 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
1249 print $formfile->getDocumentsLink($contracttmp->element, $filename, $filedir);
1250 print '</td>';
1251
1252 print '</td>';
1253 if (!$i) {
1254 $totalarray['nbfield']++;
1255 }
1256 }
1257
1258 // Ref thirdparty
1259 if (!empty($arrayfields['c.ref_customer']['checked'])) {
1260 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag(dol_string_nohtmltag($contracttmp->getFormatedCustomerRef($obj->ref_customer))).'">'.$contracttmp->getFormatedCustomerRef($obj->ref_customer).'</td>';
1261 if (!$i) {
1262 $totalarray['nbfield']++;
1263 }
1264 }
1265 if (!empty($arrayfields['c.ref_supplier']['checked'])) {
1266 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->ref_supplier).'">'.dol_escape_htmltag($obj->ref_supplier).'</td>';
1267 }
1268 if (!empty($arrayfields['s.nom']['checked'])) {
1269 print '<td class="tdoverflowmax150">';
1270 if ($obj->socid > 0) {
1271 // TODO Use a cache for this string
1272 print $socstatic->getNomUrl(1, '');
1273 }
1274 print '</td>';
1275 }
1276 // Email
1277 if (!empty($arrayfields['s.email']['checked'])) {
1278 print '<td class="tdoverflowmax200" title="'.dolPrintHTMLForAttribute($obj->email).'">'.dol_print_email($obj->email, 0, $obj->socid, 1, 0, $showinvalidemail, 1).'</td>';
1279 }
1280 // Town
1281 if (!empty($arrayfields['s.town']['checked'])) {
1282 print '<td class="nocellnopadd">';
1283 print $obj->town;
1284 print '</td>';
1285 if (!$i) {
1286 $totalarray['nbfield']++;
1287 }
1288 }
1289 // Zip
1290 if (!empty($arrayfields['s.zip']['checked'])) {
1291 print '<td class="center nocellnopadd">';
1292 print $obj->zip;
1293 print '</td>';
1294 if (!$i) {
1295 $totalarray['nbfield']++;
1296 }
1297 }
1298 // State
1299 if (!empty($arrayfields['state.nom']['checked'])) {
1300 print "<td>".$obj->state_name."</td>\n";
1301 if (!$i) {
1302 $totalarray['nbfield']++;
1303 }
1304 }
1305 // Country
1306 if (!empty($arrayfields['country.code_iso']['checked'])) {
1307 print '<td class="center tdoverflowmax100" title="'.dol_escape_htmltag($socstatic->country).'">';
1308 print dol_escape_htmltag($socstatic->country);
1309 print '</td>';
1310 if (!$i) {
1311 $totalarray['nbfield']++;
1312 }
1313 }
1314 // Type ent
1315 if (!empty($arrayfields['typent.code']['checked'])) {
1316 print '<td class="center">';
1317 if (count($typenArray) == 0) {
1318 $typenArray = $formcompany->typent_array(1);
1319 }
1320 print $typenArray[$obj->typent_code];
1321 print '</td>';
1322 if (!$i) {
1323 $totalarray['nbfield']++;
1324 }
1325 }
1326 if (!empty($arrayfields['sale_representative']['checked'])) {
1327 // Sales representatives
1328 print '<td>';
1329 if ($obj->socid > 0) {
1330 $listsalesrepresentatives = $socstatic->getSalesRepresentatives($user);
1331 if ($listsalesrepresentatives < 0) {
1332 dol_print_error($db);
1333 }
1334 $nbofsalesrepresentative = count($listsalesrepresentatives);
1335 if ($nbofsalesrepresentative > 6) {
1336 // We print only number
1337 print $nbofsalesrepresentative;
1338 } elseif ($nbofsalesrepresentative > 0) {
1339 $userstatic = new User($db);
1340 $j = 0;
1341 foreach ($listsalesrepresentatives as $val) {
1342 $userstatic->id = $val['id'];
1343 $userstatic->lastname = $val['lastname'];
1344 $userstatic->firstname = $val['firstname'];
1345 $userstatic->email = $val['email'];
1346 $userstatic->status = $val['statut'];
1347 $userstatic->entity = $val['entity'];
1348 $userstatic->photo = $val['photo'];
1349 $userstatic->login = $val['login'];
1350 $userstatic->phone = $val['phone'];
1351 $userstatic->job = $val['job'];
1352 $userstatic->gender = $val['gender'];
1353
1354 //print '<div class="float">':
1355 print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2);
1356 $j++;
1357 if ($j < $nbofsalesrepresentative) {
1358 print ' ';
1359 }
1360 //print '</div>';
1361 }
1362 }
1363 //else print $langs->trans("NoSalesRepresentativeAffected");
1364 } else {
1365 print '&nbsp;';
1366 }
1367 print '</td>';
1368 }
1369 // Date
1370 if (!empty($arrayfields['c.date_contrat']['checked'])) {
1371 print '<td class="center">'.dol_print_date($db->jdate($obj->date_contrat), 'day', 'tzserver').'</td>';
1372 }
1373 // Signed Status
1374 if (!empty($arrayfields['c.signed_status']['checked'])) {
1375 print '<td class="center">'.$contracttmp->getLibSignedStatus(5).'</td>';
1376 if (!$i) {
1377 $totalarray['nbfield']++;
1378 }
1379 }
1380 // public note
1381 if (!empty($arrayfields['c.note_public']['checked'])) {
1382 print '<td class="center">'.$obj->note_public.'</td>';
1383 if (!$i) {
1384 $totalarray['nbfield']++;
1385 }
1386 }
1387 // private note
1388 if (!empty($arrayfields['c.note_private']['checked'])) {
1389 print '<td class="center">'.$obj->note_private.'</td>';
1390 if (!$i) {
1391 $totalarray['nbfield']++;
1392 }
1393 }
1394 // Extra fields
1395 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1396 // Fields from hook
1397 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1398 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1399 print $hookmanager->resPrint;
1400 // Date creation
1401 if (!empty($arrayfields['c.datec']['checked'])) {
1402 print '<td class="center nowrap">';
1403 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1404 print '</td>';
1405 if (!$i) {
1406 $totalarray['nbfield']++;
1407 }
1408 }
1409 // Date modification
1410 if (!empty($arrayfields['c.tms']['checked'])) {
1411 print '<td class="center nowrap">';
1412 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1413 print '</td>';
1414 if (!$i) {
1415 $totalarray['nbfield']++;
1416 }
1417 }
1418 // Date lower end date
1419 if (!empty($arrayfields['lower_planned_end_date']['checked'])) {
1420 print '<td class="center nowrapforall">';
1421 print dol_print_date($db->jdate($obj->lower_planned_end_date), 'day', 'tzuser');
1422 print '</td>';
1423 if (!$i) {
1424 $totalarray['nbfield']++;
1425 }
1426 }
1427 // Status
1428 if (!empty($arrayfields['status']['checked'])) {
1429 print '<td class="center">'.($obj->nb_initial > 0 ? $obj->nb_initial : '').'</td>';
1430 print '<td class="center">'.($obj->nb_running > 0 ? $obj->nb_running : '').'</td>';
1431 print '<td class="center">'.($obj->nb_expired > 0 ? $obj->nb_expired : '').'</td>';
1432 print '<td class="center">'.($obj->nb_closed > 0 ? $obj->nb_closed : '').'</td>';
1433 if (!$i) {
1434 $totalarray['nbfield']++;
1435 $totalarray['nbfield']++;
1436 $totalarray['nbfield']++;
1437 $totalarray['nbfield']++;
1438 }
1439 }
1440 // Action column
1441 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1442 print '<td class="nowrap center">';
1443 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1444 $selected = 0;
1445 if (in_array($obj->rowid, $arrayofselected)) {
1446 $selected = 1;
1447 }
1448 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1449 }
1450 print '</td>';
1451 if (!$i) {
1452 $totalarray['nbfield']++;
1453 }
1454 }
1455
1456 print '</tr>'."\n";
1457 }
1458 $i++;
1459}
1460
1461// If no record found
1462if ($num == 0) {
1463 $colspan = 4; // Include the 4 columns of status
1464 foreach ($arrayfields as $key => $val) {
1465 if (!empty($val['checked'])) {
1466 $colspan++;
1467 }
1468 }
1469 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1470}
1471
1472$db->free($resql);
1473
1474$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1475$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1476print $hookmanager->resPrint;
1477
1478print '</table>'."\n";
1479print '</div>'."\n";
1480
1481print '</form>'."\n";
1482
1483$hidegeneratedfilelistifempty = 1;
1484if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1485 $hidegeneratedfilelistifempty = 0;
1486}
1487
1488// Show list of available documents
1489$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1490$urlsource .= str_replace('&amp;', '&', $param);
1491
1492$filedir = $diroutputmassaction;
1493$genallowed = $permissiontoread;
1494$delallowed = $permissiontoadd;
1495
1496print $formfile->showdocuments('massfilesarea_contract', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1497
1498
1499llxFooter();
1500$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...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
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...
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.