dolibarr 20.0.0
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
5 * Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
6 * Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
7 * Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
8 * Copyright (C) 2010-2011 Juanjo Menent <jmenent@2byte.es>
9 * Copyright (C) 2010-2022 Philippe Grand <philippe.grand@atoo-net.com>
10 * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
11 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
12 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
13 * Copyright (C) 2016-2021 Ferran Marcet <fmarcet@2byte.es>
14 * Copyright (C) 2017-2023 Charlene Benke <charlene@patas-monkey.com>
15 * Copyright (C) 2018 Nicolas ZABOURI <info@inovea-conseil.com>
16 * Copyright (C) 2019-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
17 * Copyright (C) 2021 Anthony Berton <anthony.berton@bb2a.fr>
18 * Copyright (C) 2021-2024 Frédéric France <frederic.france@free.fr>
19 * Copyright (C) 2022 Josep Lluís Amador <joseplluis@lliuretic.cat>
20 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
21 *
22 * This program is free software; you can redistribute it and/or modify
23 * it under the terms of the GNU General Public License as published by
24 * the Free Software Foundation; either version 3 of the License, or
25 * (at your option) any later version.
26 *
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU General Public License for more details.
31 *
32 * You should have received a copy of the GNU General Public License
33 * along with this program. If not, see <https://www.gnu.org/licenses/>.
34 */
35
42// Load Dolibarr environment
43require '../../main.inc.php';
44require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
45require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
46require_once DOL_DOCUMENT_ROOT.'/core/class/html.formpropal.class.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
48if (isModEnabled('margin')) {
49 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmargin.class.php';
50}
51require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
52require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
53require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
54require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
55if (isModEnabled('category')) {
56 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
57 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
58}
59
60// Load translation files required by the page
61$langs->loadLangs(array('companies', 'propal', 'compta', 'bills', 'orders', 'products', 'deliveries', 'categories'));
62if (isModEnabled("shipping")) {
63 $langs->loadLangs(array('sendings'));
64}
65
66// Get Parameters
67$socid = GETPOSTINT('socid');
68
69$action = GETPOST('action', 'aZ09');
70$massaction = GETPOST('massaction', 'alpha');
71$show_files = GETPOSTINT('show_files');
72$confirm = GETPOST('confirm', 'alpha');
73$cancel = GETPOST('cancel', 'alpha');
74$toselect = GETPOST('toselect', 'array');
75$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'proposallist';
76$optioncss = GETPOST('optioncss', 'alpha');
77$mode = GETPOST('mode', 'alpha');
78
79// Search Fields
80$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
81$search_user = GETPOSTINT('search_user');
82if ($search_user == -1) {
83 $search_user = 0;
84}
85$search_sale = GETPOSTINT('search_sale');
86$search_ref = GETPOST('sf_ref') ? GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha');
87$search_refcustomer = GETPOST('search_refcustomer', 'alpha');
88$search_refproject = GETPOST('search_refproject', 'alpha');
89$search_project = GETPOST('search_project', 'alpha');
90$search_societe = GETPOST('search_societe', 'alpha');
91$search_societe_alias = GETPOST('search_societe_alias', 'alpha');
92$search_montant_ht = GETPOST('search_montant_ht', 'alpha');
93$search_montant_vat = GETPOST('search_montant_vat', 'alpha');
94$search_montant_ttc = GETPOST('search_montant_ttc', 'alpha');
95$search_warehouse = GETPOST('search_warehouse', 'alpha');
96$search_multicurrency_code = GETPOST('search_multicurrency_code', 'alpha');
97$search_multicurrency_tx = GETPOST('search_multicurrency_tx', 'alpha');
98$search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'alpha');
99$search_multicurrency_montant_vat = GETPOST('search_multicurrency_montant_vat', 'alpha');
100$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha');
101$search_login = GETPOST('search_login', 'alpha');
102$search_product_category = GETPOSTINT('search_product_category');
103$search_town = GETPOST('search_town', 'alpha');
104$search_zip = GETPOST('search_zip', 'alpha');
105$search_state = GETPOST("search_state");
106$search_country = GETPOST("search_country", 'aZ09');
107$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
108$search_date_startday = GETPOSTINT('search_date_startday');
109$search_date_startmonth = GETPOSTINT('search_date_startmonth');
110$search_date_startyear = GETPOSTINT('search_date_startyear');
111$search_date_endday = GETPOSTINT('search_date_endday');
112$search_date_endmonth = GETPOSTINT('search_date_endmonth');
113$search_date_endyear = GETPOSTINT('search_date_endyear');
114$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
115$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
116$search_date_end_startday = GETPOSTINT('search_date_end_startday');
117$search_date_end_startmonth = GETPOSTINT('search_date_end_startmonth');
118$search_date_end_startyear = GETPOSTINT('search_date_end_startyear');
119$search_date_end_endday = GETPOSTINT('search_date_end_endday');
120$search_date_end_endmonth = GETPOSTINT('search_date_end_endmonth');
121$search_date_end_endyear = GETPOSTINT('search_date_end_endyear');
122$search_date_end_start = dol_mktime(0, 0, 0, $search_date_end_startmonth, $search_date_end_startday, $search_date_end_startyear); // Use tzserver
123$search_date_end_end = dol_mktime(23, 59, 59, $search_date_end_endmonth, $search_date_end_endday, $search_date_end_endyear);
124$search_date_delivery_startday = GETPOSTINT('search_date_delivery_startday');
125$search_date_delivery_startmonth = GETPOSTINT('search_date_delivery_startmonth');
126$search_date_delivery_startyear = GETPOSTINT('search_date_delivery_startyear');
127$search_date_delivery_endday = GETPOSTINT('search_date_delivery_endday');
128$search_date_delivery_endmonth = GETPOSTINT('search_date_delivery_endmonth');
129$search_date_delivery_endyear = GETPOSTINT('search_date_delivery_endyear');
130$search_date_delivery_start = dol_mktime(0, 0, 0, $search_date_delivery_startmonth, $search_date_delivery_startday, $search_date_delivery_startyear);
131$search_date_delivery_end = dol_mktime(23, 59, 59, $search_date_delivery_endmonth, $search_date_delivery_endday, $search_date_delivery_endyear);
132$search_availability = GETPOST('search_availability', 'intcomma');
133$search_categ_cus = GETPOST("search_categ_cus", 'intcomma');
134$search_fk_cond_reglement = GETPOST("search_fk_cond_reglement", 'intcomma');
135$search_fk_shipping_method = GETPOST("search_fk_shipping_method", 'intcomma');
136$search_fk_input_reason = GETPOST("search_fk_input_reason", 'intcomma');
137$search_fk_mode_reglement = GETPOST("search_fk_mode_reglement", 'intcomma');
138$search_date_signature_startday = GETPOSTINT('search_date_signature_startday');
139$search_date_signature_startmonth = GETPOSTINT('search_date_signature_startmonth');
140$search_date_signature_startyear = GETPOSTINT('search_date_signature_startyear');
141$search_date_signature_endday = GETPOSTINT('search_date_signature_endday');
142$search_date_signature_endmonth = GETPOSTINT('search_date_signature_endmonth');
143$search_date_signature_endyear = GETPOSTINT('search_date_signature_endyear');
144$search_date_signature_start = dol_mktime(0, 0, 0, $search_date_signature_startmonth, $search_date_signature_startday, $search_date_signature_startyear);
145$search_date_signature_end = dol_mktime(23, 59, 59, $search_date_signature_endmonth, $search_date_signature_endday, $search_date_signature_endyear);
146$search_status = GETPOST('search_status', 'alpha');
147$search_note_public = GETPOST('search_note_public', 'alpha');
148
149// Pagination
150$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
151$sortfield = GETPOST('sortfield', 'aZ09comma');
152$sortorder = GETPOST('sortorder', 'aZ09comma');
153$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
154if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
155 // If $page is not defined, or '' or -1 or if we click on clear filters
156 $page = 0;
157}
158$offset = $limit * $page;
159$pageprev = $page - 1;
160$pagenext = $page + 1;
161if (!$sortfield) {
162 $sortfield = 'p.ref';
163}
164if (!$sortorder) {
165 $sortorder = 'DESC';
166}
167
168// Security check
169$module = 'propal';
170$dbtable = '';
171$objectid = '';
172if (!empty($user->socid)) {
173 $socid = $user->socid;
174}
175if (!empty($socid)) {
176 $objectid = $socid;
177 $module = 'societe';
178 $dbtable = '&societe';
179}
180$result = restrictedArea($user, $module, $objectid, $dbtable);
181
182$diroutputmassaction = $conf->propal->multidir_output[$conf->entity].'/temp/massgeneration/'.$user->id;
183
184// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
185$object = new Propal($db);
186$hookmanager->initHooks(array('propallist'));
187$extrafields = new ExtraFields($db);
188
189// fetch optionals attributes and labels
190$extrafields->fetch_name_optionals_label($object->table_element);
191
192$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
193
194// List of fields to search into when doing a "search in all"
195$fieldstosearchall = array(
196 'p.ref' => 'Ref',
197 'p.ref_client' => 'RefCustomer',
198 'pd.description' => 'Description',
199 's.nom' => "ThirdParty",
200 's.name_alias' => "AliasNameShort",
201 's.zip' => "Zip",
202 's.town' => "Town",
203 'p.note_public' => 'NotePublic',
204);
205if (empty($user->socid)) {
206 $fieldstosearchall["p.note_private"] = "NotePrivate";
207}
208
209
210$checkedtypetiers = 0;
211$arrayfields = array(
212 'p.ref' => array('label' => "Ref", 'checked' => 1),
213 'p.ref_client' => array('label' => "RefCustomer", 'checked' => -1),
214 'pr.ref' => array('label' => "ProjectRef", 'checked' => 1, 'enabled' => (isModEnabled('project') ? 1 : 0)),
215 'pr.title' => array('label' => "ProjectLabel", 'checked' => 0, 'enabled' => (isModEnabled('project') ? 1 : 0)),
216 's.nom' => array('label' => "ThirdParty", 'checked' => 1),
217 's.name_alias' => array('label' => "AliasNameShort", 'checked' => -1),
218 's.town' => array('label' => "Town", 'checked' => -1),
219 's.zip' => array('label' => "Zip", 'checked' => -1),
220 'state.nom' => array('label' => "StateShort", 'checked' => 0),
221 'country.code_iso' => array('label' => "Country", 'checked' => 0),
222 'typent.code' => array('label' => "ThirdPartyType", 'checked' => $checkedtypetiers),
223 'p.date' => array('label' => "DatePropal", 'checked' => 1),
224 'p.fin_validite' => array('label' => "DateEnd", 'checked' => 1),
225 'p.date_livraison' => array('label' => "DeliveryDate", 'checked' => 0),
226 'p.date_signature' => array('label' => "DateSigning", 'checked' => 0),
227 'ava.rowid' => array('label' => "AvailabilityPeriod", 'checked' => 0),
228 'p.fk_shipping_method' => array('label' => "SendingMethod", 'checked' => 0, 'enabled' => isModEnabled("shipping")),
229 'p.fk_input_reason' => array('label' => "Origin", 'checked' => 0, 'enabled' => 1),
230 'p.fk_cond_reglement' => array('label' => "PaymentConditionsShort", 'checked' => 0),
231 'p.fk_mode_reglement' => array('label' => "PaymentMode", 'checked' => 0),
232 'p.total_ht' => array('label' => "AmountHT", 'checked' => 1),
233 'p.total_tva' => array('label' => "AmountVAT", 'checked' => 0),
234 'p.total_ttc' => array('label' => "AmountTTC", 'checked' => 0),
235 'p.total_ht_invoiced' => array('label' => "AmountInvoicedHT", 'checked' => 0, 'enabled' => getDolGlobalString('PROPOSAL_SHOW_INVOICED_AMOUNT')),
236 'p.total_invoiced' => array('label' => "AmountInvoicedTTC", 'checked' => 0, 'enabled' => getDolGlobalString('PROPOSAL_SHOW_INVOICED_AMOUNT')),
237 'p.multicurrency_code' => array('label' => 'Currency', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1)),
238 'p.multicurrency_tx' => array('label' => 'CurrencyRate', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1)),
239 'p.multicurrency_total_ht' => array('label' => 'MulticurrencyAmountHT', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1)),
240 'p.multicurrency_total_tva' => array('label' => 'MulticurrencyAmountVAT', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1)),
241 'p.multicurrency_total_ttc' => array('label' => 'MulticurrencyAmountTTC', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1)),
242 'p.multicurrency_total_ht_invoiced' => array('label' => 'MulticurrencyAmountInvoicedHT', 'checked' => 0, 'enabled' => isModEnabled("multicurrency") && getDolGlobalString('PROPOSAL_SHOW_INVOICED_AMOUNT')),
243 'p.multicurrency_total_invoiced' => array('label' => 'MulticurrencyAmountInvoicedTTC', 'checked' => 0, 'enabled' => isModEnabled("multicurrency") && getDolGlobalString('PROPOSAL_SHOW_INVOICED_AMOUNT')),
244 'u.login' => array('label' => "Author", 'checked' => 1, 'position' => 10),
245 'sale_representative' => array('label' => "SaleRepresentativesOfThirdParty", 'checked' => -1),
246 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') ? 0 : 1)),
247 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') ? 0 : 1)),
248 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') || !getDolGlobalString('DISPLAY_MARGIN_RATES') ? 0 : 1)),
249 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') || !getDolGlobalString('DISPLAY_MARK_RATES') ? 0 : 1)),
250 'p.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 500),
251 'p.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 500),
252 'p.date_cloture' => array('label' => "DateClosing", 'checked' => 0, 'position' => 500),
253 'p.note_public' => array('label' => 'NotePublic', 'checked' => 0, 'position' => 510, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
254 'p.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position' => 511, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
255 'p.fk_statut' => array('label' => "Status", 'checked' => 1, 'position' => 1000),
256);
257
258// List of fields to search into when doing a "search in all"
259/*$fieldstosearchall = array();
260foreach ($object->fields as $key => $val) {
261 if (!empty($val['searchall'])) {
262 $fieldstosearchall['t.'.$key] = $val['label'];
263 }
264}*/
265
266// Definition of array of fields for columns
267/*$arrayfields = array();
268foreach ($object->fields as $key => $val) {
269 // If $val['visible']==0, then we never show the field
270 if (!empty($val['visible'])) {
271 $visible = (int) dol_eval($val['visible'], 1);
272 $arrayfields['t.'.$key] = array(
273 'label'=>$val['label'],
274 'checked'=>(($visible < 0) ? 0 : 1),
275 'enabled'=>(abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
276 'position'=>$val['position'],
277 'help'=> isset($val['help']) ? $val['help'] : ''
278 );
279 }
280}*/
281
282if (!$user->hasRight('societe', 'client', 'voir')) {
283 $search_sale = $user->id;
284}
285
286// Extra fields
287include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
288
289// Permissions
290$permissiontoread = $user->hasRight('propal', 'lire');
291$permissiontoadd = $user->hasRight('propal', 'creer');
292$permissiontodelete = $user->hasRight('propal', 'supprimer');
293if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
294 $permissiontovalidate = $user->hasRight('propal', 'propal_advance', 'validate');
295 $permissiontoclose = $user->hasRight('propal', 'propal_advance', 'close');
296 $permissiontosendbymail = $user->hasRight('propal', 'propal_advance', 'send');
297} else {
298 $permissiontovalidate = $user->hasRight('propal', 'creer');
299 $permissiontoclose = $user->hasRight('propal', 'creer');
300 $permissiontosendbymail = $user->hasRight('propal', 'lire');
301}
302
303
304/*
305 * Actions
306 */
307
308if (GETPOST('cancel', 'alpha')) {
309 $action = 'list';
310 $massaction = '';
311}
312if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
313 $massaction = '';
314}
315
316$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
317$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
318if ($reshook < 0) {
319 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
320}
321
322if (empty($reshook)) {
323 // Selection of new fields
324 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
325
326 // Purge search criteria
327 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
328 $search_user = '';
329 $search_sale = '';
330 $search_ref = '';
331 $search_refcustomer = '';
332 $search_refproject = '';
333 $search_project = '';
334 $search_societe = '';
335 $search_societe_alias = '';
336 $search_montant_ht = '';
337 $search_montant_vat = '';
338 $search_montant_ttc = '';
339 $search_warehouse = '';
340 $search_multicurrency_code = '';
341 $search_multicurrency_tx = '';
342 $search_multicurrency_montant_ht = '';
343 $search_multicurrency_montant_vat = '';
344 $search_multicurrency_montant_ttc = '';
345 $search_login = '';
346 $search_product_category = '';
347 $search_town = '';
348 $search_zip = "";
349 $search_state = "";
350 $search_type = '';
351 $search_country = '';
352 $search_type_thirdparty = '';
353 $search_date_startday = '';
354 $search_date_startmonth = '';
355 $search_date_startyear = '';
356 $search_date_endday = '';
357 $search_date_endmonth = '';
358 $search_date_endyear = '';
359 $search_date_start = '';
360 $search_date_end = '';
361 $search_date_end_startday = '';
362 $search_date_end_startmonth = '';
363 $search_date_end_startyear = '';
364 $search_date_end_endday = '';
365 $search_date_end_endmonth = '';
366 $search_date_end_endyear = '';
367 $search_date_end_start = '';
368 $search_date_end_end = '';
369 $search_date_delivery_startday = '';
370 $search_date_delivery_startmonth = '';
371 $search_date_delivery_startyear = '';
372 $search_date_delivery_endday = '';
373 $search_date_delivery_endmonth = '';
374 $search_date_delivery_endyear = '';
375 $search_date_delivery_start = '';
376 $search_date_delivery_end = '';
377 $search_availability = '';
378 $search_status = '';
379 $search_categ_cus = 0;
380 $search_fk_cond_reglement = '';
381 $search_fk_shipping_method = '';
382 $search_fk_input_reason = '';
383 $search_fk_mode_reglement = '';
384 $search_date_signature_startday = '';
385 $search_date_signature_startmonth = '';
386 $search_date_signature_startyear = '';
387 $search_date_signature_endday = '';
388 $search_date_signature_endmonth = '';
389 $search_date_signature_endyear = '';
390 $search_date_signature_start = '';
391 $search_date_signature_end = '';
392 $toselect = array();
393 $search_array_options = array();
394 $socid = 0;
395 }
396
397 // Mass actions
398 $objectclass = 'Propal';
399 $objectlabel = 'Proposals';
400 $uploaddir = $conf->propal->multidir_output[$conf->entity];
401 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
402}
403
404if ($action == 'validate' && $permissiontovalidate) {
405 if (GETPOST('confirm') == 'yes') {
406 $tmpproposal = new Propal($db);
407 $db->begin();
408 $error = 0;
409 foreach ($toselect as $checked) {
410 if ($tmpproposal->fetch($checked) > 0) {
411 if ($tmpproposal->statut == $tmpproposal::STATUS_DRAFT) {
412 if ($tmpproposal->valid($user) > 0) {
413 setEventMessages($langs->trans('hasBeenValidated', $tmpproposal->ref), null, 'mesgs');
414 } else {
415 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
416 $error++;
417 }
418 } else {
419 $langs->load("errors");
420 setEventMessages($langs->trans('ErrorIsNotADraft', $tmpproposal->ref), null, 'errors');
421 $error++;
422 }
423 } else {
424 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
425 $error++;
426 }
427 }
428 if ($error) {
429 $db->rollback();
430 } else {
431 $db->commit();
432 }
433 }
434}
435
436if ($action == "sign" && $permissiontoclose) {
437 if (GETPOST('confirm') == 'yes') {
438 $tmpproposal = new Propal($db);
439 $db->begin();
440 $error = 0;
441 foreach ($toselect as $checked) {
442 if ($tmpproposal->fetch($checked) > 0) {
443 if ($tmpproposal->statut == $tmpproposal::STATUS_VALIDATED) {
444 $tmpproposal->statut = $tmpproposal::STATUS_SIGNED;
445 if ($tmpproposal->closeProposal($user, $tmpproposal::STATUS_SIGNED) >= 0) {
446 setEventMessages($tmpproposal->ref." ".$langs->trans('Signed'), null, 'mesgs');
447 } else {
448 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
449 $error++;
450 }
451 } else {
452 setEventMessage($langs->trans('MustBeValidatedToBeSigned', $tmpproposal->ref), 'errors');
453 $error++;
454 }
455 } else {
456 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
457 $error++;
458 }
459 }
460 if ($error) {
461 $db->rollback();
462 } else {
463 $db->commit();
464 }
465 }
466}
467
468if ($action == "nosign" && $permissiontoclose) {
469 if (GETPOST('confirm') == 'yes') {
470 $tmpproposal = new Propal($db);
471 $db->begin();
472 $error = 0;
473 foreach ($toselect as $checked) {
474 if ($tmpproposal->fetch($checked) > 0) {
475 if ($tmpproposal->statut == $tmpproposal::STATUS_VALIDATED || (getDolGlobalString('PROPAL_SKIP_ACCEPT_REFUSE') && $tmpproposal->statut == $tmpproposal::STATUS_DRAFT)) {
476 $tmpproposal->statut = $tmpproposal::STATUS_NOTSIGNED;
477 if ($tmpproposal->closeProposal($user, $tmpproposal::STATUS_NOTSIGNED) > 0) {
478 setEventMessage($tmpproposal->ref." ".$langs->trans('NoSigned'), 'mesgs');
479 } else {
480 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
481 $error++;
482 }
483 } else {
484 setEventMessage($tmpproposal->ref." ".$langs->trans('CantBeNoSign'), 'errors');
485 $error++;
486 }
487 } else {
488 setEventMessages($tmpproposal->error, $tmpproposal->errors, 'errors');
489 $error++;
490 }
491 }
492 if ($error) {
493 $db->rollback();
494 } else {
495 $db->commit();
496 }
497 }
498}
499
500// Closed records
501if (!$error && $massaction === 'setbilled' && $permissiontoclose) {
502 $db->begin();
503
504 $objecttmp = new $objectclass($db);
505 $nbok = 0;
506 foreach ($toselect as $toselectid) {
507 $result = $objecttmp->fetch($toselectid);
508 if ($result > 0) {
509 $result = $objecttmp->classifyBilled($user, 0);
510 if ($result <= 0) {
511 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
512 $error++;
513 break;
514 } else {
515 $nbok++;
516 }
517 } else {
518 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
519 $error++;
520 break;
521 }
522 }
523
524 if (!$error) {
525 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
526 $db->commit();
527 } else {
528 $db->rollback();
529 }
530}
531
532
533
534/*
535 * View
536 */
537
538$now = dol_now();
539
540$form = new Form($db);
541$formother = new FormOther($db);
542$formfile = new FormFile($db);
543$formpropal = new FormPropal($db);
544$formmargin = null;
545if (isModEnabled('margin')) {
546 $formmargin = new FormMargin($db);
547}
548$companystatic = new Societe($db);
549$projectstatic = new Project($db);
550$formcompany = new FormCompany($db);
551
552$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
553$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
554
555$sql = 'SELECT';
556if ($search_all > 0) {
557 $sql = 'SELECT DISTINCT';
558}
559$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.email, s.phone, s.fax , s.address, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client,';
560$sql .= " typent.code as typent_code,";
561$sql .= " ava.rowid as availability,";
562$sql .= " country.code as country_code,";
563$sql .= " state.code_departement as state_code, state.nom as state_name,";
564$sql .= ' p.rowid, p.entity as propal_entity, p.note_private, p.total_ht, p.total_tva, p.total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut as status, p.fk_user_author, p.datep as dp, p.fin_validite as dfv, p.date_livraison as ddelivery,';
565$sql .= ' p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc,';
566$sql .= ' p.datec as date_creation, p.tms as date_modification, p.date_cloture as date_cloture,';
567$sql .= ' p.date_signature as dsignature,';
568$sql .= ' p.note_public, p.note_private,';
569$sql .= ' p.fk_cond_reglement,p.deposit_percent,p.fk_mode_reglement,p.fk_shipping_method,p.fk_input_reason,';
570$sql .= " pr.rowid as project_id, pr.ref as project_ref, pr.title as project_label,";
571$sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity as user_entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender';
572// Add fields from extrafields
573if (!empty($extrafields->attributes[$object->table_element]['label'])) {
574 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
575 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
576 }
577}
578// Add fields from hooks
579$parameters = array();
580$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
581$sql .= $hookmanager->resPrint;
582$sql = preg_replace('/, $/', '', $sql);
583
584$sqlfields = $sql; // $sql fields to remove for count total
585
586$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
587$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
588$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
589$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
590
591$sql .= ' INNER JOIN '.MAIN_DB_PREFIX.'propal as p ON p.fk_soc = s.rowid';
592if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
593 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (p.rowid = ef.fk_object)";
594}
595if ($search_all) {
596 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'propaldet as pd ON p.rowid = pd.fk_propal';
597}
598$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid';
599$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as pr ON pr.rowid = p.fk_projet";
600$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_availability as ava on (ava.rowid = p.fk_availability)";
601// Add table from hooks
602$parameters = array();
603$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
604$sql .= $hookmanager->resPrint;
605
606$sql .= ' WHERE';
607$sql .= ' p.entity IN ('.getEntity('propal').')';
608if ($search_town) {
609 $sql .= natural_search('s.town', $search_town);
610}
611if ($search_zip) {
612 $sql .= natural_search("s.zip", $search_zip);
613}
614if ($search_state) {
615 $sql .= natural_search("state.nom", $search_state);
616}
617if ($search_country) {
618 $sql .= " AND s.fk_pays IN (".$db->sanitize($db->escape($search_country)).')';
619}
620if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
621 $sql .= " AND s.fk_typent IN (".$db->sanitize($db->escape($search_type_thirdparty)).')';
622}
623if ($search_ref) {
624 $sql .= natural_search('p.ref', $search_ref);
625}
626if ($search_refcustomer) {
627 $sql .= natural_search('p.ref_client', $search_refcustomer);
628}
629if ($search_refproject) {
630 $sql .= natural_search('pr.ref', $search_refproject);
631}
632if ($search_project) {
633 $sql .= natural_search('pr.title', $search_project);
634}
635if ($search_availability) {
636 $sql .= " AND p.fk_availability IN (".$db->sanitize($db->escape($search_availability)).')';
637}
638if (empty($arrayfields['s.name_alias']['checked']) && $search_societe) {
639 $sql .= natural_search(array("s.nom", "s.name_alias"), $search_societe);
640} else {
641 if ($search_societe) {
642 $sql .= natural_search('s.nom', $search_societe);
643 }
644 if ($search_societe_alias) {
645 $sql .= natural_search('s.name_alias', $search_societe_alias);
646 }
647}
648if ($search_login) {
649 $sql .= natural_search(array("u.login", "u.firstname", "u.lastname"), $search_login);
650}
651if ($search_montant_ht != '') {
652 $sql .= natural_search("p.total_ht", $search_montant_ht, 1);
653}
654if ($search_montant_vat != '') {
655 $sql .= natural_search("p.total_tva", $search_montant_vat, 1);
656}
657if ($search_montant_ttc != '') {
658 $sql .= natural_search("p.total_ttc", $search_montant_ttc, 1);
659}
660if ($search_warehouse != '' && $search_warehouse > 0) {
661 $sql .= natural_search("p.fk_warehouse", $search_warehouse, 1);
662}
663if ($search_multicurrency_code != '') {
664 $sql .= " AND p.multicurrency_code = '".$db->escape($search_multicurrency_code)."'";
665}
666if ($search_multicurrency_tx != '') {
667 $sql .= natural_search('p.multicurrency_tx', $search_multicurrency_tx, 1);
668}
669if ($search_multicurrency_montant_ht != '') {
670 $sql .= natural_search('p.multicurrency_total_ht', $search_multicurrency_montant_ht, 1);
671}
672if ($search_multicurrency_montant_vat != '') {
673 $sql .= natural_search('p.multicurrency_total_tva', $search_multicurrency_montant_vat, 1);
674}
675if ($search_multicurrency_montant_ttc != '') {
676 $sql .= natural_search('p.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1);
677}
678if ($search_all) {
679 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
680}
681if ($search_fk_cond_reglement > 0) {
682 $sql .= " AND p.fk_cond_reglement = ".((int) $search_fk_cond_reglement);
683}
684if ($search_fk_shipping_method > 0) {
685 $sql .= " AND p.fk_shipping_method = ".((int) $search_fk_shipping_method);
686}
687if ($search_fk_input_reason > 0) {
688 $sql .= " AND p.fk_input_reason = ".((int) $search_fk_input_reason);
689}
690if ($search_fk_mode_reglement > 0) {
691 $sql .= " AND p.fk_mode_reglement = ".((int) $search_fk_mode_reglement);
692}
693if ($socid > 0) {
694 $sql .= ' AND s.rowid = '.((int) $socid);
695}
696if ($search_status != '' && $search_status != '-1') {
697 $sql .= ' AND p.fk_statut IN ('.$db->sanitize($search_status).')';
698}
699if ($search_date_start) {
700 $sql .= " AND p.datep >= '".$db->idate($search_date_start)."'";
701}
702if ($search_date_end) {
703 $sql .= " AND p.datep <= '".$db->idate($search_date_end)."'";
704}
705if ($search_date_end_start) {
706 $sql .= " AND p.fin_validite >= '".$db->idate($search_date_end_start)."'";
707}
708if ($search_date_end_end) {
709 $sql .= " AND p.fin_validite <= '".$db->idate($search_date_end_end)."'";
710}
711if ($search_date_delivery_start) {
712 $sql .= " AND p.date_livraison >= '".$db->idate($search_date_delivery_start)."'";
713}
714if ($search_date_delivery_end) {
715 $sql .= " AND p.date_livraison <= '".$db->idate($search_date_delivery_end)."'";
716}
717if ($search_date_signature_start) {
718 $sql .= " AND p.date_signature >= '".$db->idate($search_date_signature_start)."'";
719}
720if ($search_date_signature_end) {
721 $sql .= " AND p.date_signature <= '".$db->idate($search_date_signature_end)."'";
722}
723if ($search_note_public) {
724 $sql .= " AND p.note_public LIKE '%".$db->escape($db->escapeforlike($search_note_public))."%'";
725}
726// Search on user
727if ($search_user > 0) {
728 $sql .= " AND EXISTS (";
729 $sql .= " SELECT ec.fk_c_type_contact, ec.element_id, ec.fk_socpeople";
730 $sql .= " FROM llx_element_contact as ec";
731 $sql .= " INNER JOIN llx_c_type_contact as tc";
732 $sql .= " ON ec.fk_c_type_contact = tc.rowid AND tc.element='propal' AND tc.source='internal'";
733 $sql .= " WHERE ec.element_id = p.rowid AND ec.fk_socpeople = ".((int) $search_user).")";
734}
735// Search on sale representative
736if ($search_sale && $search_sale != '-1') {
737 if ($search_sale == -2) {
738 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
739 } elseif ($search_sale > 0) {
740 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
741 }
742}
743// Search for tag/category ($searchCategoryCustomerList is an array of ID)
744$searchCategoryCustomerOperator = -1;
745$searchCategoryCustomerList = array($search_categ_cus);
746if (!empty($searchCategoryCustomerList)) {
747 $searchCategoryCustomerSqlList = array();
748 $listofcategoryid = '';
749 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
750 if (intval($searchCategoryCustomer) == -2) {
751 $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc)";
752 } elseif (intval($searchCategoryCustomer) > 0) {
753 if ($searchCategoryCustomerOperator == 0) {
754 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie = ".((int) $searchCategoryCustomer).")";
755 } else {
756 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
757 }
758 }
759 }
760 if ($listofcategoryid) {
761 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
762 }
763 if ($searchCategoryCustomerOperator == 1) {
764 if (!empty($searchCategoryCustomerSqlList)) {
765 $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
766 }
767 } else {
768 if (!empty($searchCategoryCustomerSqlList)) {
769 $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
770 }
771 }
772}
773// Search for tag/category ($searchCategoryProductList is an array of ID)
774$searchCategoryProductOperator = -1;
775$searchCategoryProductList = array($search_product_category);
776if (!empty($searchCategoryProductList)) {
777 $searchCategoryProductSqlList = array();
778 $listofcategoryid = '';
779 foreach ($searchCategoryProductList as $searchCategoryProduct) {
780 if (intval($searchCategoryProduct) == -2) {
781 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product)";
782 } elseif (intval($searchCategoryProduct) > 0) {
783 if ($searchCategoryProductOperator == 0) {
784 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
785 } else {
786 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
787 }
788 }
789 }
790 if ($listofcategoryid) {
791 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."propaldet as pd WHERE pd.fk_propal = p.rowid AND pd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
792 }
793 if ($searchCategoryProductOperator == 1) {
794 if (!empty($searchCategoryProductSqlList)) {
795 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
796 }
797 } else {
798 if (!empty($searchCategoryProductSqlList)) {
799 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
800 }
801 }
802}
803// Add where from extra fields
804include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
805//print $sql;
806
807// Add where from hooks
808$parameters = array();
809$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
810$sql .= $hookmanager->resPrint;
811
812// Add HAVING from hooks
813$parameters = array();
814$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
815$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
816
817// Count total nb of records
818$nbtotalofrecords = '';
819if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
820 /* The fast and low memory method to get and count full list converts the sql into a sql count */
821 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
822 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
823 $resql = $db->query($sqlforcount);
824 if ($resql) {
825 $objforcount = $db->fetch_object($resql);
826 $nbtotalofrecords = $objforcount->nbtotalofrecords;
827 } else {
828 dol_print_error($db);
829 }
830
831 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
832 $page = 0;
833 $offset = 0;
834 }
835 $db->free($resql);
836}
837
838// Complete request and execute it with limit
839$sql .= $db->order($sortfield, $sortorder);
840$sql .= ', p.ref DESC';
841if ($limit) {
842 $sql .= $db->plimit($limit + 1, $offset);
843}
844
845$resql = $db->query($sql);
846if (!$resql) {
847 dol_print_error($db);
848 exit;
849}
850
851$objectstatic = new Propal($db);
852$userstatic = new User($db);
853
854if ($socid > 0) {
855 $soc = new Societe($db);
856 $soc->fetch($socid);
857 $title = $langs->trans('Proposals').' - '.$soc->name;
858 if (empty($search_societe)) {
859 $search_societe = $soc->name;
860 }
861} else {
862 $title = $langs->trans('Proposals');
863}
864
865$num = $db->num_rows($resql);
866
867$arrayofselected = is_array($toselect) ? $toselect : array();
868
869if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
870 $obj = $db->fetch_object($resql);
871
872 $id = $obj->rowid;
873
874 header("Location: ".DOL_URL_ROOT.'/comm/propal/card.php?id='.$id);
875 exit;
876}
877
878$help_url = 'EN:Commercial_Proposals|FR:Proposition_commerciale|ES:Presupuestos';
879llxHeader('', $title, $help_url, 0, 0, '', '', '', 'bodyforlist');
880
881$param = '&search_status='.urlencode($search_status);
882if (!empty($mode)) {
883 $param .= '&mode='.urlencode($mode);
884}
885if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
886 $param .= '&contextpage='.urlencode($contextpage);
887}
888if ($limit > 0 && $limit != $conf->liste_limit) {
889 $param .= '&limit='.((int) $limit);
890}
891if ($search_all) {
892 $param .= '&search_all='.urlencode($search_all);
893}
894if ($search_date_startday) {
895 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
896}
897if ($search_date_startmonth) {
898 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
899}
900if ($search_date_startyear) {
901 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
902}
903if ($search_date_endday) {
904 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
905}
906if ($search_date_endmonth) {
907 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
908}
909if ($search_date_endyear) {
910 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
911}
912if ($search_date_end_startday) {
913 $param .= '&search_date_end_startday='.urlencode((string) ($search_date_end_startday));
914}
915if ($search_date_end_startmonth) {
916 $param .= '&search_date_end_startmonth='.urlencode((string) ($search_date_end_startmonth));
917}
918if ($search_date_end_startyear) {
919 $param .= '&search_date_end_startyear='.urlencode((string) ($search_date_end_startyear));
920}
921if ($search_date_end_endday) {
922 $param .= '&search_date_end_endday='.urlencode((string) ($search_date_end_endday));
923}
924if ($search_date_end_endmonth) {
925 $param .= '&search_date_end_endmonth='.urlencode((string) ($search_date_end_endmonth));
926}
927if ($search_date_end_endyear) {
928 $param .= '&search_date_end_endyear='.urlencode((string) ($search_date_end_endyear));
929}
930if ($search_date_delivery_startday) {
931 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
932}
933if ($search_date_delivery_startmonth) {
934 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
935}
936if ($search_date_delivery_startyear) {
937 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
938}
939if ($search_date_delivery_endday) {
940 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
941}
942if ($search_date_delivery_endmonth) {
943 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
944}
945if ($search_date_delivery_endyear) {
946 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
947}
948if ($search_ref) {
949 $param .= '&search_ref='.urlencode($search_ref);
950}
951if ($search_refcustomer) {
952 $param .= '&search_refcustomer='.urlencode($search_refcustomer);
953}
954if ($search_refproject) {
955 $param .= '&search_refproject='.urlencode($search_refproject);
956}
957if ($search_societe) {
958 $param .= '&search_societe='.urlencode($search_societe);
959}
960if ($search_societe_alias) {
961 $param .= '&search_societe_alias='.urlencode($search_societe_alias);
962}
963if ($search_user > 0) {
964 $param .= '&search_user='.urlencode((string) ($search_user));
965}
966if ($search_sale > 0) {
967 $param .= '&search_sale='.urlencode($search_sale);
968}
969if ($search_montant_ht) {
970 $param .= '&search_montant_ht='.urlencode($search_montant_ht);
971}
972if ($search_multicurrency_code != '') {
973 $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
974}
975if ($search_multicurrency_tx != '') {
976 $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
977}
978if ($search_multicurrency_montant_ht != '') {
979 $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
980}
981if ($search_multicurrency_montant_vat != '') {
982 $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat);
983}
984if ($search_multicurrency_montant_ttc != '') {
985 $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
986}
987if ($search_login) {
988 $param .= '&search_login='.urlencode($search_login);
989}
990if ($search_town) {
991 $param .= '&search_town='.urlencode($search_town);
992}
993if ($search_zip) {
994 $param .= '&search_zip='.urlencode($search_zip);
995}
996if ($socid > 0) {
997 $param .= '&socid='.urlencode((string) ($socid));
998}
999if ($optioncss != '') {
1000 $param .= '&optioncss='.urlencode($optioncss);
1001}
1002if ($search_categ_cus > 0) {
1003 $param .= '&search_categ_cus='.urlencode((string) ($search_categ_cus));
1004}
1005if ($search_product_category != '') {
1006 $param .= '&search_product_category='.urlencode((string) ($search_product_category));
1007}
1008if ($search_fk_cond_reglement > 0) {
1009 $param .= '&search_fk_cond_reglement='.urlencode((string) ($search_fk_cond_reglement));
1010}
1011if ($search_fk_shipping_method > 0) {
1012 $param .= '&search_fk_shipping_method='.urlencode((string) ($search_fk_shipping_method));
1013}
1014if ($search_fk_input_reason > 0) {
1015 $param .= '&search_fk_input_reason='.urlencode((string) ($search_fk_input_reason));
1016}
1017if ($search_fk_mode_reglement > 0) {
1018 $param .= '&search_fk_mode_reglement='.urlencode((string) ($search_fk_mode_reglement));
1019}
1020if ($search_type_thirdparty > 0) {
1021 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
1022}
1023if ($search_town) {
1024 $param .= '&search_town='.urlencode($search_town);
1025}
1026if ($search_zip) {
1027 $param .= '&search_zip='.urlencode($search_zip);
1028}
1029if ($search_state) {
1030 $param .= '&search_state='.urlencode($search_state);
1031}
1032if ($search_town) {
1033 $param .= '&search_town='.urlencode($search_town);
1034}
1035if ($search_country) {
1036 $param .= '&search_country='.urlencode((string) ($search_country));
1037}
1038if ($search_date_signature_startday) {
1039 $param .= '&search_date_signature_startday='.urlencode((string) ($search_date_signature_startday));
1040}
1041if ($search_date_signature_startmonth) {
1042 $param .= '&search_date_signature_startmonth='.urlencode((string) ($search_date_signature_startmonth));
1043}
1044if ($search_date_signature_startyear) {
1045 $param .= '&search_date_signature_startyear='.urlencode((string) ($search_date_signature_startyear));
1046}
1047if ($search_date_signature_endday) {
1048 $param .= '&search_date_signature_endday='.urlencode((string) ($search_date_signature_endday));
1049}
1050if ($search_date_signature_endmonth) {
1051 $param .= '&search_date_signature_endmonth='.urlencode((string) ($search_date_signature_endmonth));
1052}
1053if ($search_date_signature_endyear) {
1054 $param .= '&search_date_signature_endyear='.urlencode((string) ($search_date_signature_endyear));
1055}
1056
1057// Add $param from extra fields
1058include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1059// Add $param from hooks
1060$parameters = array('param' => &$param);
1061$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1062$param .= $hookmanager->resPrint;
1063
1064// List of mass actions available
1065$arrayofmassactions = array(
1066 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1067 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1068);
1069if ($permissiontosendbymail) {
1070 $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail");
1071}
1072if ($permissiontovalidate) {
1073 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate");
1074}
1075if ($permissiontoclose) {
1076 $arrayofmassactions['presign'] = img_picto('', 'propal', 'class="pictofixedwidth"').$langs->trans("Sign");
1077 $arrayofmassactions['nopresign'] = img_picto('', 'propal', 'class="pictofixedwidth"').$langs->trans("NoSign");
1078 $arrayofmassactions['setbilled'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("ClassifyBilled");
1079}
1080if ($permissiontodelete) {
1081 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
1082}
1083
1084if (in_array($massaction, array('presend', 'predelete', 'closed'))) {
1085 $arrayofmassactions = array();
1086}
1087$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1088
1089$url = DOL_URL_ROOT.'/comm/propal/card.php?action=create';
1090if (!empty($socid)) {
1091 $url .= '&socid='.$socid;
1092}
1093$newcardbutton = '';
1094$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'));
1095$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'));
1096$newcardbutton .= dolGetButtonTitleSeparator();
1097$newcardbutton .= dolGetButtonTitle($langs->trans('NewPropal'), '', 'fa fa-plus-circle', $url, '', $user->hasRight('propal', 'creer'));
1098
1099// Fields title search
1100print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">';
1101if ($optioncss != '') {
1102 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1103}
1104print '<input type="hidden" name="token" value="'.newToken().'">';
1105print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1106print '<input type="hidden" name="action" value="list">';
1107print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1108print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1109print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
1110print '<input type="hidden" name="socid" value="'.$socid.'">';
1111print '<input type="hidden" name="mode"value="'.$mode.'">';
1112
1113print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'propal', 0, $newcardbutton, '', $limit, 0, 0, 1);
1114
1115$topicmail = "SendPropalRef";
1116$modelmail = "propal_send";
1117$objecttmp = new Propal($db);
1118$trackid = 'pro'.$object->id;
1119include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1120
1121if ($massaction == 'prevalidate') {
1122 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1);
1123}
1124
1125if ($massaction == 'presign') {
1126 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassSignature"), $langs->trans("ConfirmMassSignatureQuestion"), "sign", null, '', 0, 200, 500, 1);
1127}
1128
1129if ($massaction == 'nopresign') {
1130 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassNoSignature"), $langs->trans("ConfirmMassNoSignatureQuestion"), "nosign", null, '', 0, 200, 500, 1);
1131}
1132
1133if ($search_all) {
1134 foreach ($fieldstosearchall as $key => $val) {
1135 $fieldstosearchall[$key] = $langs->trans($val);
1136 }
1137 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1138}
1139
1140$i = 0;
1141
1142$moreforfilter = '';
1143
1144// If the user can view prospects other than his'
1145if ($user->hasRight('user', 'user', 'lire')) {
1146 $langs->load("commercial");
1147 $moreforfilter .= '<div class="divsearchfield">';
1148 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1149 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx', 1);
1150 $moreforfilter .= '</div>';
1151}
1152// If the user can view prospects other than his'
1153if ($user->hasRight('user', 'user', 'lire')) {
1154 $moreforfilter .= '<div class="divsearchfield">';
1155 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1156 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers((empty($search_user) ? -2 : 0), 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth250 widthcentpercentminusx');
1157 $moreforfilter .= '</div>';
1158}
1159// If the user can view products
1160if (isModEnabled('category') && $user->hasRight('categorie', 'read') && ($user->hasRight('product', 'read') || $user->hasRight('service', 'read'))) {
1161 $searchCategoryProductOperator = -1;
1162 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1163 $tmptitle = $langs->trans('IncludingProductWithTag');
1164 $formcategory = new FormCategory($db);
1165 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_PRODUCT, array($search_product_category), 'maxwidth300', $searchCategoryProductOperator, 0, 0, $tmptitle);
1166}
1167if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1168 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1169 $moreforfilter .= '<div class="divsearchfield">';
1170 $tmptitle = $langs->trans('CustomersProspectsCategoriesShort');
1171 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $tmptitle, (empty($conf->dol_optimize_smallscreen) ? 'maxwidth300 widthcentpercentminusx' : 'maxwidth250 widthcentpercentminusx'));
1172 $moreforfilter .= '</div>';
1173}
1174if (isModEnabled('stock') && getDolGlobalString('WAREHOUSE_ASK_WAREHOUSE_DURING_PROPAL')) {
1175 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
1176 $formproduct = new FormProduct($db);
1177 $moreforfilter .= '<div class="divsearchfield">';
1178 $tmptitle = $langs->trans('Warehouse');
1179 $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', $tmptitle, 0, 0, $tmptitle);
1180 $moreforfilter .= '</div>';
1181}
1182$parameters = array();
1183$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1184if (empty($reshook)) {
1185 $moreforfilter .= $hookmanager->resPrint;
1186} else {
1187 $moreforfilter = $hookmanager->resPrint;
1188}
1189
1190if (!empty($moreforfilter)) {
1191 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1192 print $moreforfilter;
1193 print '</div>';
1194}
1195
1196$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1197$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
1198$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
1199
1200print '<div class="div-table-responsive">';
1201print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1202
1203print '<tr class="liste_titre_filter">';
1204
1205// Action column
1206if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1207 print '<td class="liste_titre" align="middle">';
1208 $searchpicto = $form->showFilterButtons('left');
1209 print $searchpicto;
1210 print '</td>';
1211}
1212
1213if (!empty($arrayfields['p.ref']['checked'])) {
1214 print '<td class="liste_titre">';
1215 print '<input class="flat maxwidth50" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
1216 print '</td>';
1217}
1218if (!empty($arrayfields['p.ref_client']['checked'])) {
1219 print '<td class="liste_titre">';
1220 print '<input class="flat maxwidth50" type="text" name="search_refcustomer" value="'.dol_escape_htmltag($search_refcustomer).'">';
1221 print '</td>';
1222}
1223if (!empty($arrayfields['pr.ref']['checked'])) {
1224 print '<td class="liste_titre">';
1225 print '<input class="flat maxwidth50" type="text" name="search_refproject" value="'.dol_escape_htmltag($search_refproject).'">';
1226 print '</td>';
1227}
1228if (!empty($arrayfields['pr.title']['checked'])) {
1229 print '<td class="liste_titre">';
1230 print '<input class="flat maxwidth50" type="text" name="search_project" value="'.dol_escape_htmltag($search_project).'">';
1231 print '</td>';
1232}
1233if (!empty($arrayfields['s.nom']['checked'])) {
1234 print '<td class="liste_titre" align="left">';
1235 print '<input class="flat maxwidth100" type="text" name="search_societe" value="'.dol_escape_htmltag($search_societe).'"'.($socid > 0 ? " disabled" : "").'>';
1236 print '</td>';
1237}
1238if (!empty($arrayfields['s.name_alias']['checked'])) {
1239 print '<td class="liste_titre" align="left">';
1240 print '<input class="flat maxwidth100" type="text" name="search_societe_alias" value="'.dol_escape_htmltag($search_societe_alias).'">';
1241 print '</td>';
1242}
1243if (!empty($arrayfields['s.town']['checked'])) {
1244 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_town" value="'.$search_town.'"></td>';
1245}
1246if (!empty($arrayfields['s.zip']['checked'])) {
1247 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_zip" value="'.$search_zip.'"></td>';
1248}
1249// State
1250if (!empty($arrayfields['state.nom']['checked'])) {
1251 print '<td class="liste_titre">';
1252 print '<input class="flat maxwidth50" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1253 print '</td>';
1254}
1255// Country
1256if (!empty($arrayfields['country.code_iso']['checked'])) {
1257 print '<td class="liste_titre" align="center">';
1258 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1259 print '</td>';
1260}
1261// Company type
1262if (!empty($arrayfields['typent.code']['checked'])) {
1263 print '<td class="liste_titre maxwidth100onsmartphone" align="center">';
1264 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'), 'maxwidth100', 1);
1265 print ajax_combobox('search_type_thirdparty');
1266 print '</td>';
1267}
1268// Date
1269if (!empty($arrayfields['p.date']['checked'])) {
1270 print '<td class="liste_titre center">';
1271 print '<div class="nowrapfordate">';
1272 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1273 print '</div>';
1274 print '<div class="nowrapfordate">';
1275 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1276 print '</div>';
1277 print '</td>';
1278}
1279// Date end
1280if (!empty($arrayfields['p.fin_validite']['checked'])) {
1281 print '<td class="liste_titre center">';
1282 print '<div class="nowrapfordate">';
1283 print $form->selectDate($search_date_end_start ? $search_date_end_start : -1, 'search_date_end_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1284 print '</div>';
1285 print '<div class="nowrapfordate">';
1286 print $form->selectDate($search_date_end_end ? $search_date_end_end : -1, 'search_date_end_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1287 print '</div>';
1288 print '</td>';
1289}
1290// Date delivery
1291if (!empty($arrayfields['p.date_livraison']['checked'])) {
1292 print '<td class="liste_titre center">';
1293 print '<div class="nowrapfordate">';
1294 print $form->selectDate($search_date_delivery_start ? $search_date_delivery_start : -1, 'search_date_delivery_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1295 print '</div>';
1296 print '<div class="nowrapfordate">';
1297 print $form->selectDate($search_date_delivery_end ? $search_date_delivery_end : -1, 'search_date_delivery_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1298 print '</div>';
1299 print '</td>';
1300}
1301// Date Signature
1302if (!empty($arrayfields['p.date_signature']['checked'])) {
1303 print '<td class="liste_titre center">';
1304 print '<div class="nowrapfordate">';
1305 print $form->selectDate($search_date_signature_start ? $search_date_signature_start : -1, 'search_date_signature_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1306 print '</div>';
1307 print '<div class="nowrapfordate">';
1308 print $form->selectDate($search_date_signature_end ? $search_date_signature_end : -1, 'search_date_signature_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1309 print '</div>';
1310 print '</td>';
1311}
1312// Availability
1313if (!empty($arrayfields['ava.rowid']['checked'])) {
1314 print '<td class="liste_titre maxwidth100onsmartphone center">';
1315 $form->selectAvailabilityDelay($search_availability, 'search_availability', '', 1);
1316 print ajax_combobox('search_availability');
1317 print '</td>';
1318}
1319// Shipping Method
1320if (!empty($arrayfields['p.fk_shipping_method']['checked'])) {
1321 print '<td class="liste_titre">';
1322 $form->selectShippingMethod($search_fk_shipping_method, 'search_fk_shipping_method', '', 1, '', 1);
1323 print '</td>';
1324}
1325// Source - Input reason
1326if (!empty($arrayfields['p.fk_input_reason']['checked'])) {
1327 print '<td class="liste_titre">';
1328 $form->selectInputReason($search_fk_input_reason, 'search_fk_input_reason', '', 1, 'maxwidth125', 1);
1329 print '</td>';
1330}
1331// Payment term
1332if (!empty($arrayfields['p.fk_cond_reglement']['checked'])) {
1333 print '<td class="liste_titre">';
1334 print $form->getSelectConditionsPaiements($search_fk_cond_reglement, 'search_fk_cond_reglement', 1, 1, 1);
1335 print '</td>';
1336}
1337// Payment mode
1338if (!empty($arrayfields['p.fk_mode_reglement']['checked'])) {
1339 print '<td class="liste_titre">';
1340 print $form->select_types_paiements($search_fk_mode_reglement, 'search_fk_mode_reglement', '', 0, 1, 1, 0, -1, '', 1);
1341 print '</td>';
1342}
1343if (!empty($arrayfields['p.total_ht']['checked'])) {
1344 // Amount
1345 print '<td class="liste_titre right">';
1346 print '<input class="flat" type="text" size="5" name="search_montant_ht" value="'.dol_escape_htmltag($search_montant_ht).'">';
1347 print '</td>';
1348}
1349if (!empty($arrayfields['p.total_tva']['checked'])) {
1350 // Amount
1351 print '<td class="liste_titre right">';
1352 print '<input class="flat" type="text" size="5" name="search_montant_vat" value="'.dol_escape_htmltag($search_montant_vat).'">';
1353 print '</td>';
1354}
1355if (!empty($arrayfields['p.total_ttc']['checked'])) {
1356 // Amount
1357 print '<td class="liste_titre right">';
1358 print '<input class="flat" type="text" size="5" name="search_montant_ttc" value="'.dol_escape_htmltag($search_montant_ttc).'">';
1359 print '</td>';
1360}
1361if (!empty($arrayfields['p.total_ht_invoiced']['checked'])) {
1362 // Amount invoiced
1363 print '<td class="liste_titre right">';
1364 print '</td>';
1365}
1366if (!empty($arrayfields['p.total_invoiced']['checked'])) {
1367 // Amount invoiced
1368 print '<td class="liste_titre right">';
1369 print '</td>';
1370}
1371if (!empty($arrayfields['p.multicurrency_code']['checked'])) {
1372 // Currency
1373 print '<td class="liste_titre">';
1374 print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
1375 print '</td>';
1376}
1377if (!empty($arrayfields['p.multicurrency_tx']['checked'])) {
1378 // Currency rate
1379 print '<td class="liste_titre">';
1380 print '<input class="flat" type="text" size="4" name="search_multicurrency_tx" value="'.dol_escape_htmltag($search_multicurrency_tx).'">';
1381 print '</td>';
1382}
1383if (!empty($arrayfields['p.multicurrency_total_ht']['checked'])) {
1384 // Amount
1385 print '<td class="liste_titre right">';
1386 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ht" value="'.dol_escape_htmltag($search_multicurrency_montant_ht).'">';
1387 print '</td>';
1388}
1389if (!empty($arrayfields['p.multicurrency_total_tva']['checked'])) {
1390 // Amount
1391 print '<td class="liste_titre right">';
1392 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_vat" value="'.dol_escape_htmltag($search_multicurrency_montant_vat).'">';
1393 print '</td>';
1394}
1395if (!empty($arrayfields['p.multicurrency_total_ttc']['checked'])) {
1396 // Amount
1397 print '<td class="liste_titre right">';
1398 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ttc" value="'.dol_escape_htmltag($search_multicurrency_montant_ttc).'">';
1399 print '</td>';
1400}
1401if (!empty($arrayfields['p.multicurrency_total_ht_invoiced']['checked'])) {
1402 // Amount invoiced
1403 print '<td class="liste_titre right">';
1404 print '</td>';
1405}
1406if (!empty($arrayfields['p.multicurrency_total_invoiced']['checked'])) {
1407 // Amount invoiced
1408 print '<td class="liste_titre right">';
1409 print '</td>';
1410}
1411if (!empty($arrayfields['u.login']['checked'])) {
1412 // Author
1413 print '<td class="liste_titre">';
1414 print '<input class="flat maxwidth75" type="text" name="search_login" value="'.dol_escape_htmltag($search_login).'">';
1415 print '</td>';
1416}
1417if (!empty($arrayfields['sale_representative']['checked'])) {
1418 print '<td class="liste_titre"></td>';
1419}
1420if (!empty($arrayfields['total_pa']['checked'])) {
1421 print '<td class="liste_titre right">';
1422 print '</td>';
1423}
1424if (!empty($arrayfields['total_margin']['checked'])) {
1425 print '<td class="liste_titre right">';
1426 print '</td>';
1427}
1428if (!empty($arrayfields['total_margin_rate']['checked'])) {
1429 print '<td class="liste_titre right">';
1430 print '</td>';
1431}
1432if (!empty($arrayfields['total_mark_rate']['checked'])) {
1433 print '<td class="liste_titre right">';
1434 print '</td>';
1435}
1436// Extra fields
1437include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1438
1439// Fields from hook
1440$parameters = array('arrayfields' => $arrayfields);
1441$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1442print $hookmanager->resPrint;
1443// Date creation
1444if (!empty($arrayfields['p.datec']['checked'])) {
1445 print '<td class="liste_titre">';
1446 print '</td>';
1447}
1448// Date modification
1449if (!empty($arrayfields['p.tms']['checked'])) {
1450 print '<td class="liste_titre">';
1451 print '</td>';
1452}
1453// Date cloture
1454if (!empty($arrayfields['p.date_cloture']['checked'])) {
1455 print '<td class="liste_titre">';
1456 print '</td>';
1457}
1458if (!empty($arrayfields['p.note_public']['checked'])) {
1459 // Note public
1460 print '<td class="liste_titre">';
1461 print '<input class="flat maxwidth75" type="text" name="search_note_public" value="'.dol_escape_htmltag($search_note_public).'">';
1462 print '</td>';
1463}
1464if (!empty($arrayfields['p.note_private']['checked'])) {
1465 // Note private
1466 print '<td class="liste_titre">';
1467 print '</td>';
1468}
1469// Status
1470if (!empty($arrayfields['p.fk_statut']['checked'])) {
1471 print '<td class="liste_titre center parentonrightofpage">';
1472 $formpropal->selectProposalStatus($search_status, 1, 0, 1, 'customer', 'search_status', 'search_status width100 onrightofpage');
1473 print '</td>';
1474}
1475// Action column
1476if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1477 print '<td class="liste_titre" align="middle">';
1478 $searchpicto = $form->showFilterButtons();
1479 print $searchpicto;
1480 print '</td>';
1481}
1482print "</tr>\n";
1483
1484$totalarray = array(
1485 'nbfield' => 0,
1486 'val' => array(
1487 'p.total_ht' => 0,
1488 'p.total_tva' => 0,
1489 'p.total_ttc' => 0,
1490 ),
1491);
1492
1493// Fields title
1494print '<tr class="liste_titre">';
1495if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1496 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
1497 $totalarray['nbfield']++;
1498}
1499if (!empty($arrayfields['p.ref']['checked'])) {
1500 print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], 'p.ref', '', $param, '', $sortfield, $sortorder);
1501 $totalarray['nbfield']++;
1502}
1503if (!empty($arrayfields['p.ref_client']['checked'])) {
1504 print_liste_field_titre($arrayfields['p.ref_client']['label'], $_SERVER["PHP_SELF"], 'p.ref_client', '', $param, '', $sortfield, $sortorder);
1505 $totalarray['nbfield']++;
1506}
1507if (!empty($arrayfields['pr.ref']['checked'])) {
1508 print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder);
1509 $totalarray['nbfield']++;
1510}
1511if (!empty($arrayfields['pr.title']['checked'])) {
1512 print_liste_field_titre($arrayfields['pr.title']['label'], $_SERVER["PHP_SELF"], 'pr.title', '', $param, '', $sortfield, $sortorder);
1513 $totalarray['nbfield']++;
1514}
1515if (!empty($arrayfields['s.nom']['checked'])) {
1516 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], 's.nom', '', $param, '', $sortfield, $sortorder);
1517 $totalarray['nbfield']++;
1518}
1519if (!empty($arrayfields['s.name_alias']['checked'])) {
1520 print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], 's.name_alias', '', $param, '', $sortfield, $sortorder);
1521 $totalarray['nbfield']++;
1522}
1523if (!empty($arrayfields['s.town']['checked'])) {
1524 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1525 $totalarray['nbfield']++;
1526}
1527if (!empty($arrayfields['s.zip']['checked'])) {
1528 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1529 $totalarray['nbfield']++;
1530}
1531if (!empty($arrayfields['state.nom']['checked'])) {
1532 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1533 $totalarray['nbfield']++;
1534}
1535if (!empty($arrayfields['country.code_iso']['checked'])) {
1536 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1537 $totalarray['nbfield']++;
1538}
1539if (!empty($arrayfields['typent.code']['checked'])) {
1540 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1541 $totalarray['nbfield']++;
1542}
1543if (!empty($arrayfields['p.date']['checked'])) {
1544 print_liste_field_titre($arrayfields['p.date']['label'], $_SERVER["PHP_SELF"], 'p.datep', '', $param, '', $sortfield, $sortorder, 'center ');
1545 $totalarray['nbfield']++;
1546}
1547if (!empty($arrayfields['p.fin_validite']['checked'])) {
1548 print_liste_field_titre($arrayfields['p.fin_validite']['label'], $_SERVER["PHP_SELF"], 'dfv', '', $param, '', $sortfield, $sortorder, 'center ');
1549 $totalarray['nbfield']++;
1550}
1551if (!empty($arrayfields['p.date_livraison']['checked'])) {
1552 print_liste_field_titre($arrayfields['p.date_livraison']['label'], $_SERVER["PHP_SELF"], 'p.date_livraison', '', $param, '', $sortfield, $sortorder, 'center ');
1553 $totalarray['nbfield']++;
1554}
1555if (!empty($arrayfields['p.date_signature']['checked'])) {
1556 print_liste_field_titre($arrayfields['p.date_signature']['label'], $_SERVER["PHP_SELF"], 'p.date_signature', '', $param, '', $sortfield, $sortorder, 'center ');
1557 $totalarray['nbfield']++;
1558}
1559if (!empty($arrayfields['ava.rowid']['checked'])) {
1560 print_liste_field_titre($arrayfields['ava.rowid']['label'], $_SERVER["PHP_SELF"], 'availability', '', $param, '', $sortfield, $sortorder);
1561 $totalarray['nbfield']++;
1562}
1563if (!empty($arrayfields['p.fk_shipping_method']['checked'])) {
1564 print_liste_field_titre($arrayfields['p.fk_shipping_method']['label'], $_SERVER["PHP_SELF"], "p.fk_shipping_method", "", $param, '', $sortfield, $sortorder);
1565 $totalarray['nbfield']++;
1566}
1567if (!empty($arrayfields['p.fk_input_reason']['checked'])) {
1568 print_liste_field_titre($arrayfields['p.fk_input_reason']['label'], $_SERVER["PHP_SELF"], "p.fk_input_reason", "", $param, '', $sortfield, $sortorder);
1569 $totalarray['nbfield']++;
1570}
1571if (!empty($arrayfields['p.fk_cond_reglement']['checked'])) {
1572 print_liste_field_titre($arrayfields['p.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "p.fk_cond_reglement", "", $param, '', $sortfield, $sortorder);
1573 $totalarray['nbfield']++;
1574}
1575if (!empty($arrayfields['p.fk_mode_reglement']['checked'])) {
1576 print_liste_field_titre($arrayfields['p.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "p.fk_mode_reglement", "", $param, '', $sortfield, $sortorder);
1577 $totalarray['nbfield']++;
1578}
1579if (!empty($arrayfields['p.total_ht']['checked'])) {
1580 print_liste_field_titre($arrayfields['p.total_ht']['label'], $_SERVER["PHP_SELF"], 'p.total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
1581 $totalarray['nbfield']++;
1582}
1583if (!empty($arrayfields['p.total_tva']['checked'])) {
1584 print_liste_field_titre($arrayfields['p.total_tva']['label'], $_SERVER["PHP_SELF"], 'p.total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
1585 $totalarray['nbfield']++;
1586}
1587if (!empty($arrayfields['p.total_ttc']['checked'])) {
1588 print_liste_field_titre($arrayfields['p.total_ttc']['label'], $_SERVER["PHP_SELF"], 'p.total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
1589 $totalarray['nbfield']++;
1590}
1591if (!empty($arrayfields['p.total_ht_invoiced']['checked'])) {
1592 print_liste_field_titre($arrayfields['p.total_ht_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1593 $totalarray['nbfield']++;
1594}
1595if (!empty($arrayfields['p.total_invoiced']['checked'])) {
1596 print_liste_field_titre($arrayfields['p.total_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1597 $totalarray['nbfield']++;
1598}
1599if (!empty($arrayfields['p.multicurrency_code']['checked'])) {
1600 print_liste_field_titre($arrayfields['p.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'p.multicurrency_code', '', $param, '', $sortfield, $sortorder);
1601 $totalarray['nbfield']++;
1602}
1603if (!empty($arrayfields['p.multicurrency_tx']['checked'])) {
1604 print_liste_field_titre($arrayfields['p.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'p.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
1605 $totalarray['nbfield']++;
1606}
1607if (!empty($arrayfields['p.multicurrency_total_ht']['checked'])) {
1608 print_liste_field_titre($arrayfields['p.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'p.multicurrency_total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
1609 $totalarray['nbfield']++;
1610}
1611if (!empty($arrayfields['p.multicurrency_total_tva']['checked'])) {
1612 print_liste_field_titre($arrayfields['p.multicurrency_total_tva']['label'], $_SERVER['PHP_SELF'], 'p.multicurrency_total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
1613 $totalarray['nbfield']++;
1614}
1615if (!empty($arrayfields['p.multicurrency_total_ttc']['checked'])) {
1616 print_liste_field_titre($arrayfields['p.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'p.multicurrency_total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
1617 $totalarray['nbfield']++;
1618}
1619if (!empty($arrayfields['p.multicurrency_total_ht_invoiced']['checked'])) {
1620 print_liste_field_titre($arrayfields['p.multicurrency_total_ht_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1621 $totalarray['nbfield']++;
1622}
1623if (!empty($arrayfields['p.multicurrency_total_invoiced']['checked'])) {
1624 print_liste_field_titre($arrayfields['p.multicurrency_total_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right ');
1625 $totalarray['nbfield']++;
1626}
1627if (!empty($arrayfields['u.login']['checked'])) {
1628 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, '', $sortfield, $sortorder);
1629 $totalarray['nbfield']++;
1630}
1631if (!empty($arrayfields['sale_representative']['checked'])) {
1632 print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder);
1633 $totalarray['nbfield']++;
1634}
1635if (!empty($arrayfields['total_pa']['checked'])) {
1636 print_liste_field_titre($arrayfields['total_pa']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1637 $totalarray['nbfield']++;
1638}
1639if (!empty($arrayfields['total_margin']['checked'])) {
1640 print_liste_field_titre($arrayfields['total_margin']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1641 $totalarray['nbfield']++;
1642}
1643if (!empty($arrayfields['total_margin_rate']['checked'])) {
1644 print_liste_field_titre($arrayfields['total_margin_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1645 $totalarray['nbfield']++;
1646}
1647if (!empty($arrayfields['total_mark_rate']['checked'])) {
1648 print_liste_field_titre($arrayfields['total_mark_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1649 $totalarray['nbfield']++;
1650}
1651// Extra fields
1652include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1653// Hook fields
1654$parameters = array(
1655 'arrayfields' => $arrayfields,
1656 'param' => $param,
1657 'sortfield' => $sortfield,
1658 'sortorder' => $sortorder,
1659 'totalarray' => &$totalarray,
1660);
1661
1662$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1663
1664print $hookmanager->resPrint;
1665if (!empty($arrayfields['p.datec']['checked'])) {
1666 print_liste_field_titre($arrayfields['p.datec']['label'], $_SERVER["PHP_SELF"], "p.datec", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1667 $totalarray['nbfield']++;
1668}
1669if (!empty($arrayfields['p.tms']['checked'])) {
1670 print_liste_field_titre($arrayfields['p.tms']['label'], $_SERVER["PHP_SELF"], "p.tms", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1671 $totalarray['nbfield']++;
1672}
1673if (!empty($arrayfields['p.date_cloture']['checked'])) {
1674 print_liste_field_titre($arrayfields['p.date_cloture']['label'], $_SERVER["PHP_SELF"], "p.date_cloture", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder);
1675 $totalarray['nbfield']++;
1676}
1677if (!empty($arrayfields['p.note_public']['checked'])) {
1678 print_liste_field_titre($arrayfields['p.note_public']['label'], $_SERVER["PHP_SELF"], "p.note_public", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1679 $totalarray['nbfield']++;
1680}
1681if (!empty($arrayfields['p.note_private']['checked'])) {
1682 print_liste_field_titre($arrayfields['p.note_private']['label'], $_SERVER["PHP_SELF"], "p.note_private", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1683 $totalarray['nbfield']++;
1684}
1685if (!empty($arrayfields['p.fk_statut']['checked'])) {
1686 print_liste_field_titre($arrayfields['p.fk_statut']['label'], $_SERVER["PHP_SELF"], "p.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
1687 $totalarray['nbfield']++;
1688}
1689if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1690 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
1691 $totalarray['nbfield']++;
1692}
1693print '</tr>'."\n";
1694
1695// Loop on record
1696// --------------------------------------------------------------------
1697$typenArray = null;
1698$now = dol_now();
1699
1700$with_margin_info = false;
1701if (isModEnabled('margin') && (
1702 !empty($arrayfields['total_pa']['checked'])
1703 || !empty($arrayfields['total_margin']['checked'])
1704 || !empty($arrayfields['total_margin_rate']['checked'])
1705 || !empty($arrayfields['total_mark_rate']['checked'])
1706)
1707) {
1708 $with_margin_info = true;
1709}
1710$total_ht = 0;
1711$total_margin = 0;
1712
1713$i = 0;
1714$savnbfield = $totalarray['nbfield'];
1715$totalarray = array();
1716$totalarray['nbfield'] = 0;
1717$imaxinloop = ($limit ? min($num, $limit) : $num);
1718while ($i < $imaxinloop) {
1719 $obj = $db->fetch_object($resql);
1720 if (empty($obj)) {
1721 break; // Should not happen
1722 }
1723
1724 $objectstatic->id = $obj->rowid;
1725 $objectstatic->ref = $obj->ref;
1726 $objectstatic->ref_customer = $obj->ref_client;
1727 $objectstatic->note_public = $obj->note_public;
1728 $objectstatic->note_private = $obj->note_private;
1729 $objectstatic->statut = $obj->status;
1730 $objectstatic->status = $obj->status;
1731
1732 $companystatic->id = $obj->socid;
1733 $companystatic->name = $obj->name;
1734 $companystatic->name_alias = $obj->alias;
1735 $companystatic->client = $obj->client;
1736 $companystatic->fournisseur = $obj->fournisseur;
1737 $companystatic->code_client = $obj->code_client;
1738 $companystatic->email = $obj->email;
1739 $companystatic->phone = $obj->phone;
1740 $companystatic->address = $obj->address;
1741 $companystatic->zip = $obj->zip;
1742 $companystatic->town = $obj->town;
1743 $companystatic->country_code = $obj->country_code;
1744
1745 $projectstatic->id = $obj->project_id;
1746 $projectstatic->ref = $obj->project_ref;
1747 $projectstatic->title = $obj->project_label;
1748
1749 $totalInvoicedHT = 0;
1750 $totalInvoicedTTC = 0;
1751 $multicurrency_totalInvoicedHT = 0;
1752 $multicurrency_totalInvoicedTTC = 0;
1753
1754 $TInvoiceData = $objectstatic->InvoiceArrayList($obj->rowid);
1755
1756 if (!empty($TInvoiceData)) {
1757 foreach ($TInvoiceData as $invoiceData) {
1758 $invoice = new Facture($db);
1759 $invoice->fetch($invoiceData->facid);
1760
1761 if (getDolGlobalString('FACTURE_DEPOSITS_ARE_JUST_PAYMENTS') && $invoice->type == Facture::TYPE_DEPOSIT) {
1762 continue;
1763 }
1764
1765 $totalInvoicedHT += $invoice->total_ht;
1766 $totalInvoicedTTC += $invoice->total_ttc;
1767 $multicurrency_totalInvoicedHT += $invoice->multicurrency_total_ht;
1768 $multicurrency_totalInvoicedTTC += $invoice->multicurrency_total_ttc;
1769 }
1770 }
1771
1772 $marginInfo = array();
1773 if ($with_margin_info === true) {
1774 $objectstatic->fetch_lines();
1775 $marginInfo = $formmargin->getMarginInfosArray($objectstatic);
1776 $total_ht += $obj->total_ht;
1777 $total_margin += $marginInfo['total_margin'];
1778 }
1779
1780 if ($mode == 'kanban') {
1781 if ($i == 0) {
1782 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1783 print '<div class="box-flex-container kanban">';
1784 }
1785 // Output Kanban
1786 $objectstatic->thirdparty = $companystatic;
1787 $userstatic->fetch($obj->fk_user_author);
1788 $arrayofparams = array('selected' => in_array($object->id, $arrayofselected), 'authorlink' => $userstatic->getNomUrl(-2), 'projectlink' => $projectstatic->getNomUrl(2));
1789 print $objectstatic->getKanbanView('', $arrayofparams);
1790 if ($i == ($imaxinloop - 1)) {
1791 print '</div>';
1792 print '</td></tr>';
1793 }
1794 } else {
1795 print '<tr class="oddeven">';
1796
1797 // Action column
1798 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1799 print '<td class="nowrap" align="center">';
1800 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1801 $selected = 0;
1802 if (in_array($obj->rowid, $arrayofselected)) {
1803 $selected = 1;
1804 }
1805 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1806 }
1807 print '</td>';
1808 if (!$i) {
1809 $totalarray['nbfield']++;
1810 }
1811 }
1812
1813 if (!empty($arrayfields['p.ref']['checked'])) {
1814 print '<td class="nowraponall">';
1815
1816 print '<table class="nobordernopadding"><tr class="nocellnopadd">';
1817 // Picto + Ref
1818 print '<td class="nobordernopadding nowraponall">';
1819 print $objectstatic->getNomUrl(1, '', '', 0, 1, (isset($conf->global->PROPAL_LIST_SHOW_NOTES) ? $conf->global->PROPAL_LIST_SHOW_NOTES : 1));
1820 print '</td>';
1821 // Warning
1822 $warnornote = '';
1823 if ($obj->status == Propal::STATUS_VALIDATED && $db->jdate($obj->dfv) < ($now - $conf->propal->cloture->warning_delay)) {
1824 $warnornote .= img_warning($langs->trans("Late"));
1825 }
1826 if ($warnornote) {
1827 print '<td style="min-width: 20px" class="nobordernopadding nowrap">';
1828 print $warnornote;
1829 print '</td>';
1830 }
1831 // Other picto tool
1832 print '<td width="16" class="nobordernopadding right">';
1833 $filename = dol_sanitizeFileName($obj->ref);
1834 $filedir = $conf->propal->multidir_output[$obj->propal_entity].'/'.dol_sanitizeFileName($obj->ref);
1835 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
1836 print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1837 print '</td></tr></table>';
1838
1839 print "</td>\n";
1840 if (!$i) {
1841 $totalarray['nbfield']++;
1842 }
1843 }
1844
1845 if (!empty($arrayfields['p.ref_client']['checked'])) {
1846 // Customer ref
1847 print '<td class="nowrap tdoverflowmax200">';
1848 print dol_escape_htmltag($obj->ref_client);
1849 print '</td>';
1850 if (!$i) {
1851 $totalarray['nbfield']++;
1852 }
1853 }
1854
1855 if (!empty($arrayfields['pr.ref']['checked'])) {
1856 // Project ref
1857 print '<td class="nowraponall">';
1858 if ($obj->project_id > 0) {
1859 print $projectstatic->getNomUrl(1);
1860 }
1861 print '</td>';
1862 if (!$i) {
1863 $totalarray['nbfield']++;
1864 }
1865 }
1866
1867 if (!empty($arrayfields['pr.title']['checked'])) {
1868 // Project label
1869 print '<td class="nowrap">';
1870 if ($obj->project_id > 0) {
1871 print dol_escape_htmltag($projectstatic->title);
1872 }
1873 print '</td>';
1874 if (!$i) {
1875 $totalarray['nbfield']++;
1876 }
1877 }
1878
1879 // Thirdparty
1880 if (!empty($arrayfields['s.nom']['checked'])) {
1881 print '<td class="tdoverflowmax150">';
1882 print $companystatic->getNomUrl(1, 'customer', 0, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
1883 print '</td>';
1884 if (!$i) {
1885 $totalarray['nbfield']++;
1886 }
1887 }
1888
1889 // Alias
1890 if (!empty($arrayfields['s.name_alias']['checked'])) {
1891 print '<td class="tdoverflowmax200">';
1892 print $obj->alias;
1893 print '</td>';
1894 if (!$i) {
1895 $totalarray['nbfield']++;
1896 }
1897 }
1898
1899 // Town
1900 if (!empty($arrayfields['s.town']['checked'])) {
1901 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->town).'">';
1902 print dol_escape_htmltag($obj->town);
1903 print '</td>';
1904 if (!$i) {
1905 $totalarray['nbfield']++;
1906 }
1907 }
1908 // Zip
1909 if (!empty($arrayfields['s.zip']['checked'])) {
1910 print '<td class="nocellnopadd">';
1911 print $obj->zip;
1912 print '</td>';
1913 if (!$i) {
1914 $totalarray['nbfield']++;
1915 }
1916 }
1917 // State
1918 if (!empty($arrayfields['state.nom']['checked'])) {
1919 print "<td>".$obj->state_name."</td>\n";
1920 if (!$i) {
1921 $totalarray['nbfield']++;
1922 }
1923 }
1924 // Country
1925 if (!empty($arrayfields['country.code_iso']['checked'])) {
1926 print '<td class="center">';
1927 $tmparray = getCountry($obj->fk_pays, 'all');
1928 print $tmparray['label'];
1929 print '</td>';
1930 if (!$i) {
1931 $totalarray['nbfield']++;
1932 }
1933 }
1934 // Type ent
1935 if (!empty($arrayfields['typent.code']['checked'])) {
1936 if (!is_array($typenArray) || empty($typenArray)) {
1937 $typenArray = $formcompany->typent_array(1);
1938 }
1939
1940 print '<td class="center">';
1941 if (!empty($obj->typent_code)) {
1942 print $typenArray[$obj->typent_code];
1943 }
1944 print '</td>';
1945 if (!$i) {
1946 $totalarray['nbfield']++;
1947 }
1948 }
1949
1950 // Date proposal
1951 if (!empty($arrayfields['p.date']['checked'])) {
1952 print '<td class="center">';
1953 print dol_print_date($db->jdate($obj->dp), 'day');
1954 print "</td>\n";
1955 if (!$i) {
1956 $totalarray['nbfield']++;
1957 }
1958 }
1959
1960 // Date end validity
1961 if (!empty($arrayfields['p.fin_validite']['checked'])) {
1962 if ($obj->dfv) {
1963 print '<td class="center">'.dol_print_date($db->jdate($obj->dfv), 'day');
1964 print '</td>';
1965 } else {
1966 print '<td>&nbsp;</td>';
1967 }
1968 if (!$i) {
1969 $totalarray['nbfield']++;
1970 }
1971 }
1972 // Date delivery
1973 if (!empty($arrayfields['p.date_livraison']['checked'])) {
1974 if ($obj->ddelivery) {
1975 print '<td class="center">'.dol_print_date($db->jdate($obj->ddelivery), 'day');
1976 print '</td>';
1977 } else {
1978 print '<td>&nbsp;</td>';
1979 }
1980 if (!$i) {
1981 $totalarray['nbfield']++;
1982 }
1983 }
1984 // Date Signature
1985 if (!empty($arrayfields['p.date_signature']['checked'])) {
1986 if ($obj->dsignature) {
1987 print '<td class="center">'.dol_print_date($db->jdate($obj->dsignature), 'day');
1988 print '</td>';
1989 } else {
1990 print '<td>&nbsp;</td>';
1991 }
1992 if (!$i) {
1993 $totalarray['nbfield']++;
1994 }
1995 }
1996 // Availability
1997 if (!empty($arrayfields['ava.rowid']['checked'])) {
1998 print '<td class="center">';
1999 $form->form_availability('', $obj->availability, 'none', 1);
2000 print '</td>';
2001 if (!$i) {
2002 $totalarray['nbfield']++;
2003 }
2004 }
2005 // Shipping Method
2006 if (!empty($arrayfields['p.fk_shipping_method']['checked'])) {
2007 print '<td>';
2008 $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1);
2009 print '</td>';
2010 if (!$i) {
2011 $totalarray['nbfield']++;
2012 }
2013 }
2014 // Source - input reason
2015 if (!empty($arrayfields['p.fk_input_reason']['checked'])) {
2016 $labelInputReason = '';
2017 if ($obj->fk_input_reason > 0) {
2018 $labelInputReason = $form->cache_demand_reason[$obj->fk_input_reason]['label'];
2019 }
2020 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($labelInputReason).'">';
2021 print dol_escape_htmltag($labelInputReason);
2022 print '</td>';
2023 if (!$i) {
2024 $totalarray['nbfield']++;
2025 }
2026 }
2027 // Payment terms
2028 if (!empty($arrayfields['p.fk_cond_reglement']['checked'])) {
2029 print '<td>';
2030 $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent);
2031 print '</td>';
2032 if (!$i) {
2033 $totalarray['nbfield']++;
2034 }
2035 }
2036 // Payment mode
2037 if (!empty($arrayfields['p.fk_mode_reglement']['checked'])) {
2038 print '<td>';
2039 $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1);
2040 print '</td>';
2041 if (!$i) {
2042 $totalarray['nbfield']++;
2043 }
2044 }
2045 // Amount HT
2046 if (!empty($arrayfields['p.total_ht']['checked'])) {
2047 print '<td class="nowrap right"><span class="amount">'.price($obj->total_ht)."</span></td>\n";
2048 if (!$i) {
2049 $totalarray['nbfield']++;
2050 }
2051 if (!$i) {
2052 $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht';
2053 }
2054 if (empty($totalarray['val']['p.total_ht'])) {
2055 $totalarray['val']['p.total_ht'] = $obj->total_ht;
2056 } else {
2057 $totalarray['val']['p.total_ht'] += $obj->total_ht;
2058 }
2059 }
2060 // Amount VAT
2061 if (!empty($arrayfields['p.total_tva']['checked'])) {
2062 print '<td class="nowrap right"><span class="amount">'.price($obj->total_tva)."</span></td>\n";
2063 if (!$i) {
2064 $totalarray['nbfield']++;
2065 }
2066 if (!$i) {
2067 $totalarray['pos'][$totalarray['nbfield']] = 'p.total_tva';
2068 }
2069 if (empty($totalarray['val']['p.total_tva'])) {
2070 $totalarray['val']['p.total_tva'] = $obj->total_tva;
2071 } else {
2072 $totalarray['val']['p.total_tva'] += $obj->total_tva;
2073 }
2074 }
2075 // Amount TTC
2076 if (!empty($arrayfields['p.total_ttc']['checked'])) {
2077 print '<td class="nowrap right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n";
2078 if (!$i) {
2079 $totalarray['nbfield']++;
2080 }
2081 if (!$i) {
2082 $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ttc';
2083 }
2084 if (empty($totalarray['val']['p.total_ttc'])) {
2085 $totalarray['val']['p.total_ttc'] = $obj->total_ttc;
2086 } else {
2087 $totalarray['val']['p.total_ttc'] += $obj->total_ttc;
2088 }
2089 }
2090 // Amount invoiced HT
2091 if (!empty($arrayfields['p.total_ht_invoiced']['checked'])) {
2092 print '<td class="nowrap right"><span class="amount">'.price($totalInvoicedHT)."</span></td>\n";
2093 if (!$i) {
2094 $totalarray['nbfield']++;
2095 }
2096 if (!$i) {
2097 $totalarray['pos'][$totalarray['nbfield']] = 'p.total_ht_invoiced';
2098 }
2099 if (empty($totalarray['val']['p.total_ht_invoiced'])) {
2100 $totalarray['val']['p.total_ht_invoiced'] = $totalInvoicedHT;
2101 } else {
2102 $totalarray['val']['p.total_ht_invoiced'] += $totalInvoicedHT;
2103 }
2104 }
2105 // Amount invoiced TTC
2106 if (!empty($arrayfields['p.total_invoiced']['checked'])) {
2107 print '<td class="nowrap right"><span class="amount">'.price($totalInvoicedTTC)."</span></td>\n";
2108 if (!$i) {
2109 $totalarray['nbfield']++;
2110 }
2111 if (!$i) {
2112 $totalarray['pos'][$totalarray['nbfield']] = 'p.total_invoiced';
2113 }
2114 if (empty($totalarray['val']['p.total_invoiced'])) {
2115 $totalarray['val']['p.total_invoiced'] = $totalInvoicedTTC;
2116 } else {
2117 $totalarray['val']['p.total_invoiced'] += $totalInvoicedTTC;
2118 }
2119 }
2120 // Currency
2121 if (!empty($arrayfields['p.multicurrency_code']['checked'])) {
2122 print '<td class="nowrap">'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."</td>\n";
2123 if (!$i) {
2124 $totalarray['nbfield']++;
2125 }
2126 }
2127
2128 // Currency rate
2129 if (!empty($arrayfields['p.multicurrency_tx']['checked'])) {
2130 print '<td class="nowrap">';
2131 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
2132 print "</td>\n";
2133 if (!$i) {
2134 $totalarray['nbfield']++;
2135 }
2136 }
2137 // Amount HT
2138 if (!empty($arrayfields['p.multicurrency_total_ht']['checked'])) {
2139 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ht)."</span></td>\n";
2140 if (!$i) {
2141 $totalarray['nbfield']++;
2142 }
2143 }
2144 // Amount VAT
2145 if (!empty($arrayfields['p.multicurrency_total_tva']['checked'])) {
2146 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_tva)."</span></td>\n";
2147 if (!$i) {
2148 $totalarray['nbfield']++;
2149 }
2150 }
2151 // Amount TTC
2152 if (!empty($arrayfields['p.multicurrency_total_ttc']['checked'])) {
2153 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ttc)."</span></td>\n";
2154 if (!$i) {
2155 $totalarray['nbfield']++;
2156 }
2157 }
2158 // Amount invoiced
2159 if (!empty($arrayfields['p.multicurrency_total_ht_invoiced']['checked'])) {
2160 print '<td class="nowrap right"><span class="amount">'.price($multicurrency_totalInvoicedHT)."</span></td>\n";
2161 if (!$i) {
2162 $totalarray['nbfield']++;
2163 }
2164 }
2165 // Amount invoiced
2166 if (!empty($arrayfields['p.multicurrency_total_invoiced']['checked'])) {
2167 print '<td class="nowrap right"><span class="amount">'.price($multicurrency_totalInvoicedTTC)."</span></td>\n";
2168 if (!$i) {
2169 $totalarray['nbfield']++;
2170 }
2171 }
2172
2173 $userstatic->id = $obj->fk_user_author;
2174 $userstatic->login = $obj->login;
2175 $userstatic->lastname = $obj->lastname;
2176 $userstatic->firstname = $obj->firstname;
2177 $userstatic->email = $obj->user_email;
2178 $userstatic->status = $obj->user_statut;
2179 $userstatic->entity = $obj->user_entity;
2180 $userstatic->photo = $obj->photo;
2181 $userstatic->office_phone = $obj->office_phone;
2182 $userstatic->office_fax = $obj->office_fax;
2183 $userstatic->user_mobile = $obj->user_mobile;
2184 $userstatic->job = $obj->job;
2185 $userstatic->gender = $obj->gender;
2186
2187 // Author
2188 if (!empty($arrayfields['u.login']['checked'])) {
2189 print '<td class="tdoverflowmax150">';
2190 if ($userstatic->id) {
2191 print $userstatic->getNomUrl(-1);
2192 }
2193 print "</td>\n";
2194 if (!$i) {
2195 $totalarray['nbfield']++;
2196 }
2197 }
2198
2199 if (!empty($arrayfields['sale_representative']['checked'])) {
2200 // Sales representatives
2201 print '<td class="tdoverflowmax125">';
2202 if ($obj->socid > 0) {
2203 $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user);
2204 if ($listsalesrepresentatives < 0) {
2205 dol_print_error($db);
2206 }
2207 $nbofsalesrepresentative = count($listsalesrepresentatives);
2208 if ($nbofsalesrepresentative > 6) {
2209 // We print only number
2210 print $nbofsalesrepresentative;
2211 } elseif ($nbofsalesrepresentative > 0) {
2212 $userstatic = new User($db);
2213 $j = 0;
2214 foreach ($listsalesrepresentatives as $val) {
2215 $userstatic->id = $val['id'];
2216 $userstatic->lastname = $val['lastname'];
2217 $userstatic->firstname = $val['firstname'];
2218 $userstatic->email = $val['email'];
2219 $userstatic->status = $val['statut'];
2220 $userstatic->entity = $val['entity'];
2221 $userstatic->photo = $val['photo'];
2222 $userstatic->login = $val['login'];
2223 $userstatic->office_phone = $val['office_phone'];
2224 $userstatic->office_fax = $val['office_fax'];
2225 $userstatic->user_mobile = $val['user_mobile'];
2226 $userstatic->job = $val['job'];
2227 $userstatic->gender = $val['gender'];
2228 //print '<div class="float">':
2229 print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2);
2230 $j++;
2231 if ($j < $nbofsalesrepresentative) {
2232 print ' ';
2233 }
2234 //print '</div>';
2235 }
2236 }
2237 //else print $langs->trans("NoSalesRepresentativeAffected");
2238 } else {
2239 print '&nbsp;';
2240 }
2241 print '</td>';
2242 if (!$i) {
2243 $totalarray['nbfield']++;
2244 }
2245 }
2246
2247 // Total buying or cost price
2248 if (!empty($arrayfields['total_pa']['checked'])) {
2249 print '<td class="right nowrap">'.price($marginInfo['pa_total']).'</td>';
2250 if (!$i) {
2251 $totalarray['nbfield']++;
2252 }
2253 }
2254 // Total margin
2255 if (!empty($arrayfields['total_margin']['checked'])) {
2256 print '<td class="right nowrap">'.price($marginInfo['total_margin']).'</td>';
2257 if (!$i) {
2258 $totalarray['nbfield']++;
2259 }
2260 if (!$i) {
2261 $totalarray['pos'][$totalarray['nbfield']] = 'total_margin';
2262 }
2263 $totalarray['val']['total_margin'] = $total_margin;
2264 }
2265 // Total margin rate
2266 if (!empty($arrayfields['total_margin_rate']['checked'])) {
2267 print '<td class="right nowrap">'.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], 0, '', 0, 0, 2).'%').'</td>';
2268 if (!$i) {
2269 $totalarray['nbfield']++;
2270 }
2271 }
2272 // Total mark rate
2273 if (!empty($arrayfields['total_mark_rate']['checked'])) {
2274 print '<td class="right nowrap">'.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], 0, '', 0, 0, 2).'%').'</td>';
2275 if (!$i) {
2276 $totalarray['nbfield']++;
2277 }
2278 if (!$i) {
2279 $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate';
2280 }
2281 if ($i >= $imaxinloop - 1) {
2282 if (!empty($total_ht)) {
2283 $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT');
2284 } else {
2285 $totalarray['val']['total_mark_rate'] = '';
2286 }
2287 }
2288 }
2289
2290 // Extra fields
2291 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
2292 // Fields from hook
2293 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
2294 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2295 print $hookmanager->resPrint;
2296 // Date creation
2297 if (!empty($arrayfields['p.datec']['checked'])) {
2298 print '<td align="center" class="nowrap">';
2299 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
2300 print '</td>';
2301 if (!$i) {
2302 $totalarray['nbfield']++;
2303 }
2304 }
2305 // Date modification
2306 if (!empty($arrayfields['p.tms']['checked'])) {
2307 print '<td align="center" class="nowrap">';
2308 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
2309 print '</td>';
2310 if (!$i) {
2311 $totalarray['nbfield']++;
2312 }
2313 }
2314 // Date cloture
2315 if (!empty($arrayfields['p.date_cloture']['checked'])) {
2316 print '<td align="center" class="nowrap">';
2317 print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser');
2318 print '</td>';
2319 if (!$i) {
2320 $totalarray['nbfield']++;
2321 }
2322 }
2323 // Note public
2324 if (!empty($arrayfields['p.note_public']['checked'])) {
2325 print '<td class="sensiblehtmlcontent center">';
2326 print dolPrintHTML($obj->note_public);
2327 print '</td>';
2328 if (!$i) {
2329 $totalarray['nbfield']++;
2330 }
2331 }
2332 // Note private
2333 if (!empty($arrayfields['p.note_private']['checked'])) {
2334 print '<td class="sensiblehtmlcontent center">';
2335 print dolPrintHTML($obj->note_private);
2336 print '</td>';
2337 if (!$i) {
2338 $totalarray['nbfield']++;
2339 }
2340 }
2341 // Status
2342 if (!empty($arrayfields['p.fk_statut']['checked'])) {
2343 print '<td class="nowrap center">'.$objectstatic->getLibStatut(5).'</td>';
2344 if (!$i) {
2345 $totalarray['nbfield']++;
2346 }
2347 }
2348 // Action column
2349 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2350 print '<td class="nowrap" align="center">';
2351 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2352 $selected = 0;
2353 if (in_array($obj->rowid, $arrayofselected)) {
2354 $selected = 1;
2355 }
2356 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
2357 }
2358 print '</td>';
2359 if (!$i) {
2360 $totalarray['nbfield']++;
2361 }
2362 }
2363
2364
2365 print '</tr>'."\n";
2366 }
2367
2368 $i++;
2369}
2370
2371// Show total line
2372include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
2373
2374// If no record found
2375if ($num == 0) {
2376 $colspan = 1;
2377 foreach ($arrayfields as $key => $val) {
2378 if (!empty($val['checked'])) {
2379 $colspan++;
2380 }
2381 }
2382 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2383}
2384
2385$db->free($resql);
2386
2387$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
2388$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2389print $hookmanager->resPrint;
2390
2391print '</table>'."\n";
2392print '</div>'."\n";
2393
2394print '</form>'."\n";
2395
2396if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
2397 $hidegeneratedfilelistifempty = 1;
2398 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
2399 $hidegeneratedfilelistifempty = 0;
2400 }
2401
2402 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
2403 $formfile = new FormFile($db);
2404
2405 // Show list of available documents
2406 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
2407 $urlsource .= str_replace('&amp;', '&', $param);
2408
2409 $filedir = $diroutputmassaction;
2410 $genallowed = $permissiontoread;
2411 $delallowed = $permissiontoadd;
2412
2413 print $formfile->showdocuments('massfilesarea_proposals', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
2414}
2415
2416// End of page
2417llxFooter();
2418$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:456
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage standard extra fields.
Class to manage invoices.
const TYPE_DEPOSIT
Deposit invoice.
Class to manage forms for categories.
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.
Class permettant la generation de composants html autre Only common components are here.
Class permettant la generation de composants html autre Only common components are here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage generation of HTML components for proposal management.
Class to manage projects.
Class to manage proposals.
const STATUS_VALIDATED
Validated status.
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_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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 dolibarr global constant string value.
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.