dolibarr 20.0.2
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
4 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
6 * Copyright (C) 2005-2015 Regis Houssin <regis.houssin@inodbox.com>
7 * Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
8 * Copyright (C) 2010-2020 Juanjo Menent <jmenent@2byte.es>
9 * Copyright (C) 2012 Christophe Battarel <christophe.battarel@altairis.fr>
10 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
11 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
12 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
13 * Copyright (C) 2015-2022 Ferran Marcet <fmarcet@2byte.es>
14 * Copyright (C) 2017 Josep Lluís Amador <joseplluis@lliuretic.cat>
15 * Copyright (C) 2018 Charlene Benke <charlie@patas-monkey.com>
16 * Copyright (C) 2019-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
17 * Copyright (C) 2021-2024 Anthony Berton <anthony.berton@bb2a.fr>
18 * Copyright (C) 2023 Nick Fragoulis
19 * Copyright (C) 2023 Joachim Kueter <git-jk@bloxera.com>
20 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
21 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
22 * Copyright (C) 2024 Solution Libre SAS <contact@solution-libre.fr>
23 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
24 *
25 * This program is free software; you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by
27 * the Free Software Foundation; either version 3 of the License, or
28 * (at your option) any later version.
29 *
30 * This program is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU General Public License for more details.
34 *
35 * You should have received a copy of the GNU General Public License
36 * along with this program. If not, see <https://www.gnu.org/licenses/>.
37 */
38
45// Load Dolibarr environment
46require '../../main.inc.php';
47require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
50if (isModEnabled('margin')) {
51 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmargin.class.php';
52}
53require_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
54require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
55require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
56require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
57require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
58require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php';
59require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
60require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php';
61require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
62require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
63require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
64if (isModEnabled('order')) {
65 require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
66}
67
68// Load translation files required by the page
69$langs->loadLangs(array('bills', 'companies', 'products', 'categories'));
70
71$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
72
73$id = (GETPOSTINT('id') ? GETPOSTINT('id') : GETPOSTINT('facid')); // For backward compatibility
74$ref = GETPOST('ref', 'alpha');
75$socid = GETPOSTINT('socid');
76
77$action = GETPOST('action', 'aZ09');
78$massaction = GETPOST('massaction', 'alpha');
79$show_files = GETPOSTINT('show_files');
80$confirm = GETPOST('confirm', 'alpha');
81$toselect = GETPOST('toselect', 'array');
82$optioncss = GETPOST('optioncss', 'alpha');
83$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'invoicelist';
84$mode = GETPOST('mode', 'aZ'); // The output mode ('list', 'kanban', 'hierarchy', 'calendar', ...)
85
86if ($contextpage == 'poslist') {
87 $optioncss = 'print';
88}
89
90$userid = GETPOSTINT('userid');
91$search_ref = GETPOST('sf_ref') ? GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha');
92$search_refcustomer = GETPOST('search_refcustomer', 'alpha');
93$search_type = GETPOST('search_type', 'intcomma');
94$search_subtype = GETPOST('search_subtype', 'intcomma');
95$search_project_ref = GETPOST('search_project_ref', 'alpha');
96$search_project = GETPOST('search_project', 'alpha');
97$search_company = GETPOST('search_company', 'alpha');
98$search_company_alias = GETPOST('search_company_alias', 'alpha');
99$search_parent_name = trim(GETPOST('search_parent_name', 'alphanohtml'));
100$search_montant_ht = GETPOST('search_montant_ht', 'alpha');
101$search_montant_vat = GETPOST('search_montant_vat', 'alpha');
102$search_montant_localtax1 = GETPOST('search_montant_localtax1', 'alpha');
103$search_montant_localtax2 = GETPOST('search_montant_localtax2', 'alpha');
104$search_montant_ttc = GETPOST('search_montant_ttc', 'alpha');
105$search_login = GETPOST('search_login', 'alpha');
106$search_multicurrency_code = GETPOST('search_multicurrency_code', 'alpha');
107$search_multicurrency_tx = GETPOST('search_multicurrency_tx', 'alpha');
108$search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'alpha');
109$search_multicurrency_montant_vat = GETPOST('search_multicurrency_montant_vat', 'alpha');
110$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha');
111$search_status = GETPOST('search_status', 'intcomma');
112$search_paymentmode = GETPOST('search_paymentmode', 'intcomma');
113$search_paymentterms = GETPOST('search_paymentterms', 'intcomma');
114$search_module_source = GETPOST('search_module_source', 'alpha');
115$search_pos_source = GETPOST('search_pos_source', 'alpha');
116$search_town = GETPOST('search_town', 'alpha');
117$search_zip = GETPOST('search_zip', 'alpha');
118$search_state = GETPOST("search_state");
119$search_country = GETPOST("search_country", 'aZ09');
120$search_customer_code = GETPOST("search_customer_code", 'alphanohtml');
121$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
122$search_user = GETPOST('search_user', 'intcomma');
123$search_sale = GETPOST('search_sale', 'intcomma');
124$search_date_startday = GETPOSTINT('search_date_startday');
125$search_date_startmonth = GETPOSTINT('search_date_startmonth');
126$search_date_startyear = GETPOSTINT('search_date_startyear');
127$search_date_endday = GETPOSTINT('search_date_endday');
128$search_date_endmonth = GETPOSTINT('search_date_endmonth');
129$search_date_endyear = GETPOSTINT('search_date_endyear');
130$search_date_start = dol_mktime(0, 0, 0, $search_date_startmonth, $search_date_startday, $search_date_startyear); // Use tzserver
131$search_date_end = dol_mktime(23, 59, 59, $search_date_endmonth, $search_date_endday, $search_date_endyear);
132$search_date_valid_startday = GETPOSTINT('search_date_valid_startday');
133$search_date_valid_startmonth = GETPOSTINT('search_date_valid_startmonth');
134$search_date_valid_startyear = GETPOSTINT('search_date_valid_startyear');
135$search_date_valid_endday = GETPOSTINT('search_date_valid_endday');
136$search_date_valid_endmonth = GETPOSTINT('search_date_valid_endmonth');
137$search_date_valid_endyear = GETPOSTINT('search_date_valid_endyear');
138$search_date_valid_start = dol_mktime(0, 0, 0, $search_date_valid_startmonth, $search_date_valid_startday, $search_date_valid_startyear); // Use tzserver
139$search_date_valid_end = dol_mktime(23, 59, 59, $search_date_valid_endmonth, $search_date_valid_endday, $search_date_valid_endyear);
140$search_datelimit_startday = GETPOSTINT('search_datelimit_startday');
141$search_datelimit_startmonth = GETPOSTINT('search_datelimit_startmonth');
142$search_datelimit_startyear = GETPOSTINT('search_datelimit_startyear');
143$search_datelimit_endday = GETPOSTINT('search_datelimit_endday');
144$search_datelimit_endmonth = GETPOSTINT('search_datelimit_endmonth');
145$search_datelimit_endyear = GETPOSTINT('search_datelimit_endyear');
146$search_datelimit_start = dol_mktime(0, 0, 0, $search_datelimit_startmonth, $search_datelimit_startday, $search_datelimit_startyear);
147$search_datelimit_end = dol_mktime(23, 59, 59, $search_datelimit_endmonth, $search_datelimit_endday, $search_datelimit_endyear);
148$search_categ_cus = GETPOST("search_categ_cus", 'intcomma');
149$search_product_category = GETPOST('search_product_category', 'intcomma');
150$search_fac_rec_source_title = GETPOST("search_fac_rec_source_title", 'alpha');
151
152$search_option = GETPOST('search_option');
153if ($search_option == 'late') {
154 $search_status = '1';
155}
156
157$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
158$sortfield = GETPOST('sortfield', 'aZ09comma');
159$sortorder = GETPOST('sortorder', 'aZ09comma');
160$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
161if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
162 $page = 0;
163} // If $page is not defined, or '' or -1 or if we click on clear filters
164$offset = $limit * $page;
165if (!$sortorder && getDolGlobalString('INVOICE_DEFAULT_UNPAYED_SORT_ORDER') && $search_status == '1') {
166 $sortorder = getDolGlobalString('INVOICE_DEFAULT_UNPAYED_SORT_ORDER');
167}
168if (!$sortorder) {
169 $sortorder = 'DESC';
170}
171if (!$sortfield) {
172 $sortfield = 'f.datef';
173}
174$pageprev = $page - 1;
175$pagenext = $page + 1;
176
177$diroutputmassaction = $conf->facture->dir_output.'/temp/massgeneration/'.$user->id;
178
179$now = dol_now();
180$error = 0;
181
182// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
183$object = new Facture($db);
184$hookmanager->initHooks(array($contextpage));
185$extrafields = new ExtraFields($db);
186
187// Fetch optionals attributes and labels
188$extrafields->fetch_name_optionals_label($object->table_element);
189
190$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
191
192// List of fields to search into when doing a "search in all"
193$fieldstosearchall = array(
194 'f.ref' => 'Ref',
195 'f.ref_client' => 'RefCustomer',
196 'f.note_public' => 'NotePublic',
197 's.nom' => "ThirdParty",
198 's.code_client' => "CustomerCodeShort",
199 's.name_alias' => "AliasNameShort",
200 's.zip' => "Zip",
201 's.town' => "Town",
202 'pd.description' => 'Description',
203);
204if (empty($user->socid)) {
205 $fieldstosearchall["f.note_private"] = "NotePrivate";
206}
207
208$checkedtypetiers = 0;
209$arrayfields = array(
210 'f.ref' => array('label' => "Ref", 'checked' => 1, 'position' => 5),
211 'f.ref_client' => array('label' => "RefCustomer", 'checked' => -1, 'position' => 10),
212 'f.type' => array('label' => "Type", 'checked' => 0, 'position' => 15),
213 'f.subtype' => array('label' => "InvoiceSubtype", 'checked' => 0, 'position' => 17),
214 'f.datef' => array('label' => "DateInvoice", 'checked' => 1, 'position' => 20),
215 'f.date_valid' => array('label' => "DateValidation", 'checked' => 0, 'position' => 22),
216 'f.date_lim_reglement' => array('label' => "DateDue", 'checked' => 1, 'position' => 25),
217 'f.date_closing' => array('label' => "DateClosing", 'checked' => 0, 'position' => 30),
218 'p.ref' => array('label' => "ProjectRef", 'langs' => 'projects', 'checked' => 1, 'enabled' => (!isModEnabled('project') ? 0 : 1), 'position' => 40),
219 'p.title' => array('label' => "ProjectLabel", 'checked' => 0, 'enabled' => (!isModEnabled('project') ? 0 : 1), 'position' => 41),
220 's.nom' => array('label' => "ThirdParty", 'checked' => 1, 'position' => 50),
221 's.name_alias' => array('label' => "AliasNameShort", 'checked' => -1, 'position' => 51),
222 's.code_client' => array('label' => "CustomerCodeShort", 'checked' => -1, 'position' => 52),
223 's2.nom' => array('label' => 'ParentCompany', 'position' => 32, 'checked' => 0),
224 's.town' => array('label' => "Town", 'checked' => -1, 'position' => 55),
225 's.zip' => array('label' => "Zip", 'checked' => -1, 'position' => 60),
226 'state.nom' => array('label' => "StateShort", 'checked' => 0, 'position' => 65),
227 'country.code_iso' => array('label' => "Country", 'checked' => 0, 'position' => 70),
228 'typent.code' => array('label' => "ThirdPartyType", 'checked' => $checkedtypetiers, 'position' => 75),
229 'f.fk_mode_reglement' => array('label' => "PaymentMode", 'checked' => 1, 'position' => 80),
230 'f.fk_cond_reglement' => array('label' => "PaymentConditionsShort", 'checked' => 1, 'position' => 85),
231 'f.module_source' => array('label' => "POSModule", 'langs' => 'cashdesk', 'checked' => ($contextpage == 'poslist' ? 1 : 0), 'enabled' => "(isModEnabled('cashdesk') || isModEnabled('takepos') || getDolGlobalInt('INVOICE_SHOW_POS'))", 'position' => 90),
232 'f.pos_source' => array('label' => "POSTerminal", 'langs' => 'cashdesk', 'checked' => ($contextpage == 'poslist' ? 1 : 0), 'enabled' => "(isModEnabled('cashdesk') || isModEnabled('takepos') || getDolGlobalInt('INVOICE_SHOW_POS'))", 'position' => 91),
233 'f.total_ht' => array('label' => "AmountHT", 'checked' => 1, 'position' => 95),
234 'f.total_tva' => array('label' => "AmountVAT", 'checked' => 0, 'position' => 100),
235 'f.total_localtax1' => array('label' => $langs->transcountry("AmountLT1", $mysoc->country_code), 'checked' => 0, 'enabled' => ($mysoc->localtax1_assuj == "1"), 'position' => 110),
236 'f.total_localtax2' => array('label' => $langs->transcountry("AmountLT2", $mysoc->country_code), 'checked' => 0, 'enabled' => ($mysoc->localtax2_assuj == "1"), 'position' => 120),
237 'f.total_ttc' => array('label' => "AmountTTC", 'checked' => 0, 'position' => 130),
238 'dynamount_payed' => array('label' => "Received", 'checked' => 0, 'position' => 140),
239 'rtp' => array('label' => "Rest", 'checked' => 0, 'position' => 150), // Not enabled by default because slow
240 'f.multicurrency_code' => array('label' => 'Currency', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 280),
241 'f.multicurrency_tx' => array('label' => 'CurrencyRate', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 285),
242 'f.multicurrency_total_ht' => array('label' => 'MulticurrencyAmountHT', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 290),
243 'f.multicurrency_total_vat' => array('label' => 'MulticurrencyAmountVAT', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 291),
244 'f.multicurrency_total_ttc' => array('label' => 'MulticurrencyAmountTTC', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 292),
245 'multicurrency_dynamount_payed' => array('label' => 'MulticurrencyAlreadyPaid', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 295),
246 'multicurrency_rtp' => array('label' => 'MulticurrencyRemainderToPay', 'checked' => 0, 'enabled' => (!isModEnabled('multicurrency') ? 0 : 1), 'position' => 296), // Not enabled by default because slow
247 'total_pa' => array('label' => ((getDolGlobalString('MARGIN_TYPE') == '1') ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') ? 0 : 1)),
248 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') ? 0 : 1)),
249 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') || !getDolGlobalString('DISPLAY_MARGIN_RATES') ? 0 : 1)),
250 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (!isModEnabled('margin') || !$user->hasRight('margins', 'liretous') || !getDolGlobalString('DISPLAY_MARK_RATES') ? 0 : 1)),
251 'f.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 500),
252 'f.tms' => array('type' => 'timestamp', 'label' => 'DateModificationShort', 'enabled' => 1, 'visible' => -1, 'notnull' => 1, 'position' => 502),
253 'u.login' => array('label' => "UserAuthor", 'checked' => 1, 'visible' => -1, 'position' => 504),
254 'sale_representative' => array('label' => "SaleRepresentativesOfThirdParty", 'checked' => 0, 'position' => 506),
255 //'f.fk_user_author' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-1, 'position'=>506),
256 //'f.fk_user_modif' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-1, 'notnull'=>-1, 'position'=>508),
257 //'f.fk_user_valid' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>510),
258 //'f.fk_user_closing' =>array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserClosing', 'enabled'=>1, 'visible'=>-1, 'position'=>512),
259 'f.note_public' => array('label' => 'NotePublic', 'checked' => 0, 'position' => 520, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES'))),
260 'f.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'position' => 521, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES'))),
261 'f.fk_fac_rec_source' => array('label' => 'GeneratedFromTemplate', 'checked' => 0, 'position' => 530, 'enabled' => '1'),
262 'f.fk_statut' => array('label' => "Status", 'checked' => 1, 'position' => 1000),
263);
264
265if (getDolGlobalString("INVOICE_USE_SITUATION") && getDolGlobalString('INVOICE_USE_RETAINED_WARRANTY')) {
266 $arrayfields['f.retained_warranty'] = array('label' => $langs->trans("RetainedWarranty"), 'checked' => 0, 'position' => 86);
267}
268
269$subtypearray = $object->getArrayOfInvoiceSubtypes(0);
270if (empty($subtypearray)) {
271 unset($arrayfields['f.subtype']);
272}
273
274// Overwrite $arrayfields from columns into ->fields (transition before removal of $arrayoffields)
275foreach ($object->fields as $key => $val) {
276 // If $val['visible']==0, then we never show the field
277
278 if (!empty($val['visible'])) {
279 $visible = (int) dol_eval($val['visible'], 1, 1, '1');
280 $newkey = '';
281 if (array_key_exists($key, $arrayfields)) {
282 $newkey = $key;
283 } elseif (array_key_exists('f.'.$key, $arrayfields)) {
284 $newkey = 'f.'.$key;
285 } elseif (array_key_exists('s.'.$key, $arrayfields)) {
286 $newkey = 's.'.$key;
287 }
288 if ($newkey) {
289 $arrayfields[$newkey] = array(
290 'label' => $val['label'],
291 'checked' => (($visible < 0) ? 0 : 1),
292 'enabled' => (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
293 'position' => $val['position'],
294 'help' => empty($val['help']) ? '' : $val['help'],
295 );
296 }
297 }
298}
299// Extra fields
300include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
301
302
303$object->fields = dol_sort_array($object->fields, 'position');
304$arrayfields = dol_sort_array($arrayfields, 'position');
305'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
306
307if (!$user->hasRight('societe', 'client', 'voir')) {
308 $search_sale = $user->id;
309}
310
311// Security check
312$fieldid = (!empty($ref) ? 'ref' : 'rowid');
313if (!empty($user->socid)) {
314 $socid = $user->socid;
315}
316$result = restrictedArea($user, 'facture', $id, '', '', 'fk_soc', $fieldid);
317
318
319/*
320 * Actions
321 */
322
323if (GETPOST('cancel', 'alpha')) {
324 $action = 'list';
325 $massaction = '';
326}
327if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
328 $massaction = '';
329}
330
331$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
332$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
333if ($reshook < 0) {
334 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
335}
336
337include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
338
339// Do we click on purge search criteria ?
340if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', 'alpha') || GETPOST('button_removefilter.x', 'alpha')) { // All tests are required to be compatible with all browsers
341 $search_user = '';
342 $search_sale = '';
343 $search_product_category = '';
344 $search_ref = '';
345 $search_refcustomer = '';
346 $search_type = '';
347 $search_subtype = '';
348 $search_project_ref = '';
349 $search_project = '';
350 $search_company = '';
351 $search_company_alias = '';
352 $search_parent_name = '';
353 $search_montant_ht = '';
354 $search_montant_vat = '';
355 $search_montant_localtax1 = '';
356 $search_montant_localtax2 = '';
357 $search_montant_ttc = '';
358 $search_login = '';
359 $search_multicurrency_code = '';
360 $search_multicurrency_tx = '';
361 $search_multicurrency_montant_ht = '';
362 $search_multicurrency_montant_vat = '';
363 $search_multicurrency_montant_ttc = '';
364 $search_status = '';
365 $search_paymentmode = '';
366 $search_paymentterms = '';
367 $search_module_source = '';
368 $search_pos_source = '';
369 $search_town = '';
370 $search_zip = "";
371 $search_state = "";
372 $search_country = '';
373 $search_type_thirdparty = '';
374 $search_customer_code = '';
375 $search_date_startday = '';
376 $search_date_startmonth = '';
377 $search_date_startyear = '';
378 $search_date_endday = '';
379 $search_date_endmonth = '';
380 $search_date_endyear = '';
381 $search_date_start = '';
382 $search_date_end = '';
383 $search_date_valid_startday = '';
384 $search_date_valid_startmonth = '';
385 $search_date_valid_startyear = '';
386 $search_date_valid_endday = '';
387 $search_date_valid_endmonth = '';
388 $search_date_valid_endyear = '';
389 $search_date_valid_start = '';
390 $search_date_valid_end = '';
391 $search_datelimit_startday = '';
392 $search_datelimit_startmonth = '';
393 $search_datelimit_startyear = '';
394 $search_datelimit_endday = '';
395 $search_datelimit_endmonth = '';
396 $search_datelimit_endyear = '';
397 $search_datelimit_start = '';
398 $search_datelimit_end = '';
399 $search_fac_rec_source_title = '';
400 $search_option = '';
401 $search_categ_cus = 0;
402 $toselect = array();
403 $search_array_options = array();
404}
405
406if (empty($reshook)) {
407 $objectclass = 'Facture';
408 $objectlabel = 'Invoices';
409 $permissiontoread = $user->hasRight("facture", "lire");
410 $permissiontoadd = $user->hasRight("facture", "creer");
411 $permissiontodelete = $user->hasRight("facture", "supprimer");
412 $uploaddir = $conf->facture->dir_output;
413 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
414}
415
416if ($action == 'makepayment_confirm' && $user->hasRight('facture', 'paiement')) {
417 require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
418 $arrayofselected = is_array($toselect) ? $toselect : array();
419 if (!empty($arrayofselected)) {
420 $bankid = GETPOSTINT('bankid');
421 $paiementid = GETPOSTINT('paiementid');
422 $paiementdate = dol_mktime(12, 0, 0, GETPOSTINT('datepaimentmonth'), GETPOSTINT('datepaimentday'), GETPOSTINT('datepaimentyear'));
423 if (empty($paiementdate)) {
424 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors');
425 $error++;
426 $action = 'makepayment';
427 }
428
429 if (!$error) {
430 foreach ($arrayofselected as $toselectid) {
431 $errorpayment = 0;
432 $facture = new Facture($db);
433 $result = $facture->fetch($toselectid);
434
435 $db->begin();
436
437 if ($result < 0) {
438 setEventMessage($facture->error, 'errors');
439 $errorpayment++;
440 } else {
441 if ($facture->type != Facture::TYPE_CREDIT_NOTE && $facture->status == Facture::STATUS_VALIDATED && $facture->paye == 0) {
442 $paiementAmount = $facture->getSommePaiement();
443 $totalcreditnotes = $facture->getSumCreditNotesUsed();
444 $totaldeposits = $facture->getSumDepositsUsed();
445
446 $totalallpayments = $paiementAmount + $totalcreditnotes + $totaldeposits;
447 $remaintopay = price2num($facture->total_ttc - $totalallpayments);
448
449 // hook to finalize the remaining amount, considering e.g. cash discount agreements
450 $parameters = array('remaintopay' => $remaintopay);
451 $reshook = $hookmanager->executeHooks('finalizeAmountOfInvoice', $parameters, $facture, $action); // Note that $action and $object may have been modified by some hooks
452 if ($reshook > 0) {
453 if (!empty($remain = $hookmanager->resArray['remaintopay'])) {
454 $remaintopay = $remain;
455 }
456 } elseif ($reshook < 0) {
457 $error++;
458 setEventMessages($facture->ref.' '.$langs->trans("ProcessingError"), $hookmanager->errors, 'errors');
459 }
460
461 if ($remaintopay != 0) {
462 $resultBank = $facture->setBankAccount($bankid);
463 if ($resultBank < 0) {
464 setEventMessages($facture->error, null, 'errors');
465 $errorpayment++;
466 } else {
467 $paiement = new Paiement($db);
468 $paiement->datepaye = $paiementdate;
469 $paiement->amounts[$facture->id] = $remaintopay; // Array with all payments dispatching with invoice id
470 $paiement->multicurrency_amounts[$facture->id] = $remaintopay;
471 $paiement->paiementid = $paiementid;
472 $paiement_id = $paiement->create($user, 1, $facture->thirdparty);
473 if ($paiement_id < 0) {
474 $langs->load("errors");
475 setEventMessages($facture->ref.' '.$langs->trans($paiement->error), $paiement->errors, 'errors');
476 $errorpayment++;
477 } else {
478 $result = $paiement->addPaymentToBank($user, 'payment', '', $bankid, '', '');
479 if ($result < 0) {
480 $langs->load("errors");
481 setEventMessages($facture->ref.' '.$langs->trans($paiement->error), $paiement->errors, 'errors');
482 $errorpayment++;
483 }
484 }
485 }
486 } else {
487 setEventMessage($langs->trans('NoPaymentAvailable', $facture->ref), 'warnings');
488 $errorpayment++;
489 }
490 } else {
491 setEventMessage($langs->trans('BulkPaymentNotPossibleForInvoice', $facture->ref), 'warnings');
492 $errorpayment++;
493 }
494 }
495
496 if (empty($errorpayment)) {
497 setEventMessage($langs->trans('PaymentRegisteredAndInvoiceSetToPaid', $facture->ref));
498 $db->commit();
499 } else {
500 $db->rollback();
501 }
502 }
503 }
504 }
505} elseif ($massaction == 'withdrawrequest') {
506 $langs->load("withdrawals");
507
508 if (!$user->hasRight('prelevement', 'bons', 'creer')) {
509 $error++;
510 setEventMessages($langs->trans("NotEnoughPermissions"), null, 'errors');
511 } else {
512 //Checking error
513 $error = 0;
514
515 $arrayofselected = is_array($toselect) ? $toselect : array();
516 $listofbills = array();
517 foreach ($arrayofselected as $toselectid) {
518 $objecttmp = new Facture($db);
519 $result = $objecttmp->fetch($toselectid);
520 if ($result > 0) {
521 $totalpaid = $objecttmp->getSommePaiement();
522 $totalcreditnotes = $objecttmp->getSumCreditNotesUsed();
523 $totaldeposits = $objecttmp->getSumDepositsUsed();
524 $objecttmp->resteapayer = price2num($objecttmp->total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits, 'MT');
525
526 // hook to finalize the remaining amount, considering e.g. cash discount agreements
527 $parameters = array('remaintopay' => $objecttmp->resteapayer);
528 $reshook = $hookmanager->executeHooks('finalizeAmountOfInvoice', $parameters, $objecttmp, $action); // Note that $action and $object may have been modified by some hooks
529 if ($reshook > 0) {
530 if (!empty($remaintopay = $hookmanager->resArray['remaintopay'])) {
531 $objecttmp->resteapayer = $remaintopay;
532 }
533 } elseif ($reshook < 0) {
534 $error++;
535 setEventMessages($objecttmp->ref.' '.$langs->trans("ProcessingError"), $hookmanager->errors, 'errors');
536 }
537
538 if ($objecttmp->statut == Facture::STATUS_DRAFT) {
539 $error++;
540 setEventMessages($objecttmp->ref.' '.$langs->trans("Draft"), $objecttmp->errors, 'errors');
541 } elseif ($objecttmp->paye || $objecttmp->resteapayer == 0) {
542 $error++;
543 setEventMessages($objecttmp->ref.' '.$langs->trans("AlreadyPaid"), $objecttmp->errors, 'errors');
544 } elseif ($objecttmp->resteapayer < 0) {
545 $error++;
546 setEventMessages($objecttmp->ref.' '.$langs->trans("AmountMustBePositive"), $objecttmp->errors, 'errors');
547 }
548
549 $rsql = "SELECT pfd.rowid, pfd.traite, pfd.date_demande as date_demande";
550 $rsql .= " , pfd.date_traite as date_traite";
551 $rsql .= " , pfd.amount";
552 $rsql .= " , u.rowid as user_id, u.lastname, u.firstname, u.login";
553 $rsql .= " FROM ".MAIN_DB_PREFIX."prelevement_demande as pfd";
554 $rsql .= " , ".MAIN_DB_PREFIX."user as u";
555 $rsql .= " WHERE fk_facture = ".((int) $objecttmp->id);
556 $rsql .= " AND pfd.fk_user_demande = u.rowid";
557 $rsql .= " AND pfd.traite = 0";
558 $rsql .= " ORDER BY pfd.date_demande DESC";
559
560 $result_sql = $db->query($rsql);
561 if ($result_sql) {
562 $numprlv = $db->num_rows($result_sql);
563 }
564
565 if ($numprlv > 0) {
566 $error++;
567 setEventMessages($objecttmp->ref.' '.$langs->trans("RequestAlreadyDone"), $objecttmp->errors, 'warnings');
568 } elseif (!empty($objecttmp->mode_reglement_code) && $objecttmp->mode_reglement_code != 'PRE') {
569 $langs->load("errors");
570 $error++;
571 setEventMessages($objecttmp->ref.' '.$langs->trans("ErrorThisPaymentModeIsNotDirectDebit"), $objecttmp->errors, 'errors');
572 } else {
573 $listofbills[] = $objecttmp; // $listofbills will only contains invoices with good payment method and no request already done
574 }
575 }
576 }
577
578 //Massive withdraw request for request with no errors
579 if (!empty($listofbills)) {
580 $nbwithdrawrequestok = 0;
581 foreach ($listofbills as $aBill) {
582 $db->begin();
583 $result = $aBill->demande_prelevement($user, $aBill->resteapayer, 'direct-debit', 'facture');
584 if ($result > 0) {
585 $db->commit();
586 $nbwithdrawrequestok++;
587 } else {
588 $db->rollback();
589 setEventMessages($aBill->error, $aBill->errors, 'errors');
590 }
591 }
592 if ($nbwithdrawrequestok > 0) {
593 setEventMessages($langs->trans("WithdrawRequestsDone", $nbwithdrawrequestok), null, 'mesgs');
594 }
595 }
596 }
597}
598
599
600
601/*
602 * View
603 */
604
605$form = new Form($db);
606$formother = new FormOther($db);
607$formfile = new FormFile($db);
608$formmargin = null;
609if (isModEnabled('margin')) {
610 $formmargin = new FormMargin($db);
611}
612$bankaccountstatic = new Account($db);
613$facturestatic = new Facture($db);
614$formcompany = new FormCompany($db);
615$companystatic = new Societe($db);
616$companyparent = new Societe($db);
617
618$company_url_list = array();
619
620if ($socid > 0) {
621 $soc = new Societe($db);
622 $soc->fetch($socid);
623 if (empty($search_company)) {
624 $search_company = $soc->name;
625 }
626}
627
628$title = $langs->trans('BillsCustomers').' '.($socid > 0 ? ' - '.$soc->name : '');
629$help_url = 'EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes';
630
631$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
632$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
633
634// Build and execute select
635// --------------------------------------------------------------------
636$sql = 'SELECT';
637if ($search_all) {
638 $sql = 'SELECT DISTINCT';
639}
640$sql .= ' f.rowid as id, f.ref, f.ref_client, f.fk_soc, f.type, f.subtype, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.fk_cond_reglement, f.total_ht, f.total_tva, f.total_ttc,';
641$sql .= ' f.localtax1 as total_localtax1, f.localtax2 as total_localtax2,';
642$sql .= ' f.fk_user_author,';
643$sql .= ' f.fk_multicurrency, f.multicurrency_code, f.multicurrency_tx, f.multicurrency_total_ht, f.multicurrency_total_tva as multicurrency_total_vat, f.multicurrency_total_ttc,';
644$sql .= ' f.datef, f.date_valid, f.date_lim_reglement as datelimite, f.module_source, f.pos_source,';
645$sql .= ' f.paye as paye, f.fk_statut, f.close_code,';
646$sql .= ' f.datec as date_creation, f.tms as date_modification, f.date_closing as date_closing,';
647$sql .= ' f.retained_warranty, f.retained_warranty_date_limit, f.situation_final, f.situation_cycle_ref, f.situation_counter,';
648$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, s.code_fournisseur, s.code_compta as code_compta_client, s.code_compta_fournisseur,';
649$sql .= " s.parent as fk_parent,";
650$sql .= " s2.nom as name2,";
651$sql .= ' typent.code as typent_code,';
652$sql .= ' state.code_departement as state_code, state.nom as state_name,';
653$sql .= ' country.code as country_code,';
654$sql .= ' f.fk_fac_rec_source,';
655$sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label,';
656$sql .= ' u.login, u.lastname, u.firstname, u.email as user_email, u.statut as user_statut, u.entity, u.photo, u.office_phone, u.office_fax, u.user_mobile, u.job, u.gender';
657// We need dynamount_payed to be able to sort on status (value is surely wrong because we can count several lines several times due to other left join or link with contacts. But what we need is just 0 or > 0).
658// A Better solution to be able to sort on already paid or remain to pay is to store amount_payed in a denormalized field.
659// We disable this. It create a bug when searching with search_all and sorting on status. Also it create performance troubles.
660/*
661if (!$search_all) {
662 $sql .= ', SUM(pf.amount) as dynamount_payed, SUM(pf.multicurrency_amount) as multicurrency_dynamount_payed';
663}
664*/
665// Add fields from extrafields
666if (!empty($extrafields->attributes[$object->table_element]['label'])) {
667 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
668 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
669 }
670}
671// Add fields from hooks
672$parameters = array();
673$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
674$sql .= $hookmanager->resPrint;
675$sql = preg_replace('/,\s*$/', '', $sql);
676
677$sqlfields = $sql; // $sql fields to remove for count total
678
679$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
680$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s2 ON s2.rowid = s.parent";
681$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
682$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
683$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
684$sql .= ', '.MAIN_DB_PREFIX.'facture as f';
685if ($sortfield == "f.datef") {
686 $sql .= $db->hintindex('idx_facture_datef');
687}
688if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
689 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (f.rowid = ef.fk_object)";
690}
691if ($search_all) {
692 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facturedet as pd ON f.rowid = pd.fk_facture';
693}
694if (!empty($search_fac_rec_source_title)) {
695 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_rec as facrec ON f.fk_fac_rec_source = facrec.rowid';
696}
697$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = f.fk_projet";
698$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user AS u ON f.fk_user_author = u.rowid';
699// Add table from hooks
700$parameters = array();
701$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
702$sql .= $hookmanager->resPrint;
703
704$sql .= ' WHERE f.fk_soc = s.rowid';
705$sql .= ' AND f.entity IN ('.getEntity('invoice').')';
706if ($socid > 0) {
707 $sql .= ' AND s.rowid = '.((int) $socid);
708}
709if ($userid) {
710 if ($userid == -1) {
711 $sql .= ' AND f.fk_user_author IS NULL';
712 } else {
713 $sql .= ' AND f.fk_user_author = '.((int) $userid);
714 }
715}
716if ($search_ref) {
717 $sql .= natural_search('f.ref', $search_ref);
718}
719if ($search_refcustomer) {
720 $sql .= natural_search('f.ref_client', $search_refcustomer);
721}
722if ($search_type != '' && $search_type != '-1') {
723 $sql .= " AND f.type IN (".$db->sanitize($db->escape($search_type)).")";
724}
725if ($search_subtype != '' && $search_subtype != '-1') {
726 $sql .= " AND f.subtype IN (".$db->sanitize($db->escape($search_subtype)).")";
727}
728if ($search_project_ref) {
729 $sql .= natural_search('p.ref', $search_project_ref);
730}
731if ($search_project) {
732 $sql .= natural_search('p.title', $search_project);
733}
734if (empty($arrayfields['s.name_alias']['checked']) && $search_company) {
735 $sql .= natural_search(array("s.nom", "s.name_alias"), $search_company);
736} else {
737 if ($search_company) {
738 $sql .= natural_search('s.nom', $search_company);
739 }
740 if ($search_company_alias) {
741 $sql .= natural_search('s.name_alias', $search_company_alias);
742 }
743}
744if ($search_parent_name) {
745 $sql .= natural_search('s2.nom', $search_parent_name);
746}
747if ($search_customer_code) {
748 $sql .= natural_search('s.code_client', $search_customer_code);
749}
750if ($search_town) {
751 $sql .= natural_search('s.town', $search_town);
752}
753if ($search_zip) {
754 $sql .= natural_search("s.zip", $search_zip);
755}
756if ($search_state) {
757 $sql .= natural_search("state.nom", $search_state);
758}
759if (strlen(trim($search_country))) {
760 $arrayofcode = getCountriesInEEC();
761 $country_code_in_EEC = $country_code_in_EEC_without_me = '';
762 foreach ($arrayofcode as $key => $value) {
763 $country_code_in_EEC .= ($country_code_in_EEC ? "," : "")."'".$value."'";
764 if ($value != $mysoc->country_code) {
765 $country_code_in_EEC_without_me .= ($country_code_in_EEC_without_me ? "," : "")."'".$value."'";
766 }
767 }
768 if ($search_country == 'special_allnotme') {
769 $sql .= " AND country.code <> '".$db->escape($mysoc->country_code)."'";
770 } elseif ($search_country == 'special_eec') {
771 $sql .= " AND country.code IN (".$db->sanitize($country_code_in_EEC, 1).")";
772 } elseif ($search_country == 'special_eecnotme') {
773 $sql .= " AND country.code IN (".$db->sanitize($country_code_in_EEC_without_me, 1).")";
774 } elseif ($search_country == 'special_noteec') {
775 $sql .= " AND country.code NOT IN (".$db->sanitize($country_code_in_EEC, 1).")";
776 } else {
777 $sql .= natural_search("country.code", $search_country);
778 }
779}
780if ($search_type_thirdparty != '' && $search_type_thirdparty != '-1') {
781 $sql .= " AND s.fk_typent IN (".$db->sanitize($db->escape($search_type_thirdparty)).')';
782}
783if ($search_montant_ht != '') {
784 $sql .= natural_search('f.total_ht', $search_montant_ht, 1);
785}
786if ($search_montant_vat != '') {
787 $sql .= natural_search('f.total_tva', $search_montant_vat, 1);
788}
789if ($search_montant_localtax1 != '') {
790 $sql .= natural_search('f.localtax1', $search_montant_localtax1, 1);
791}
792if ($search_montant_localtax2 != '') {
793 $sql .= natural_search('f.localtax2', $search_montant_localtax2, 1);
794}
795if ($search_montant_ttc != '') {
796 $sql .= natural_search('f.total_ttc', $search_montant_ttc, 1);
797}
798if ($search_multicurrency_code != '') {
799 $sql .= " AND f.multicurrency_code = '".$db->escape($search_multicurrency_code)."'";
800}
801if ($search_multicurrency_tx != '') {
802 $sql .= natural_search('f.multicurrency_tx', $search_multicurrency_tx, 1);
803}
804if ($search_multicurrency_montant_ht != '') {
805 $sql .= natural_search('f.multicurrency_total_ht', $search_multicurrency_montant_ht, 1);
806}
807if ($search_multicurrency_montant_vat != '') {
808 $sql .= natural_search('f.multicurrency_total_tva', $search_multicurrency_montant_vat, 1);
809}
810if ($search_multicurrency_montant_ttc != '') {
811 $sql .= natural_search('f.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1);
812}
813if ($search_login) {
814 $sql .= natural_search(array('u.login', 'u.firstname', 'u.lastname'), $search_login);
815}
816if ($search_status != '-1' && $search_status != '') {
817 if (is_numeric($search_status) && $search_status >= 0) {
818 if ($search_status == '0') {
819 $sql .= " AND f.fk_statut = 0"; // draft
820 }
821 if ($search_status == '1') {
822 $sql .= " AND f.fk_statut = 1"; // unpayed
823 }
824 if ($search_status == '2') {
825 $sql .= " AND f.fk_statut = 2"; // paid Not that some corrupted data may contains f.fk_statut = 1 AND f.paye = 1 (it means paid too but should not happen. If yes, reopen and reclassify billed)
826 }
827 if ($search_status == '3') {
828 $sql .= " AND f.fk_statut = 3"; // abandoned
829 }
830 } else {
831 $sql .= " AND f.fk_statut IN (".$db->sanitize($db->escape($search_status)).")"; // When search_status is '1,2' for example
832 }
833}
834
835if ($search_paymentmode > 0) {
836 $sql .= " AND f.fk_mode_reglement = ".((int) $search_paymentmode);
837}
838if ($search_paymentterms > 0) {
839 $sql .= " AND f.fk_cond_reglement = ".((int) $search_paymentterms);
840}
841if ($search_module_source) {
842 $sql .= natural_search("f.module_source", $search_module_source);
843}
844if ($search_pos_source) {
845 $sql .= natural_search("f.pos_source", $search_pos_source);
846}
847if ($search_date_start) {
848 $sql .= " AND f.datef >= '".$db->idate($search_date_start)."'";
849}
850if ($search_date_end) {
851 $sql .= " AND f.datef <= '".$db->idate($search_date_end)."'";
852}
853if ($search_date_valid_start) {
854 $sql .= " AND f.date_valid >= '".$db->idate($search_date_valid_start)."'";
855}
856if ($search_date_valid_end) {
857 $sql .= " AND f.date_valid <= '".$db->idate($search_date_valid_end)."'";
858}
859if ($search_datelimit_start) {
860 $sql .= " AND f.date_lim_reglement >= '".$db->idate($search_datelimit_start)."'";
861}
862if ($search_datelimit_end) {
863 $sql .= " AND f.date_lim_reglement <= '".$db->idate($search_datelimit_end)."'";
864}
865if ($search_option == 'late') {
866 $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->client->warning_delay)."'";
867}
868/*if ($search_sale > 0) {
869 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
870}*/
871if (!empty($search_fac_rec_source_title)) {
872 $sql .= natural_search('facrec.titre', $search_fac_rec_source_title);
873}
874// Search on user
875if ($search_user > 0) {
876 $sql .= " AND EXISTS (";
877 $sql .= " SELECT ec.fk_c_type_contact, ec.element_id, ec.fk_socpeople";
878 $sql .= " FROM ".MAIN_DB_PREFIX."element_contact as ec";
879 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."c_type_contact as tc";
880 $sql .= " ON ec.fk_c_type_contact = tc.rowid AND tc.element='facture' AND tc.source='internal'";
881 $sql .= " WHERE ec.element_id = f.rowid AND ec.fk_socpeople = ".((int) $search_user).")";
882}
883// Search on sale representative
884if ($search_sale && $search_sale != '-1') {
885 if ($search_sale == -2) {
886 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc)";
887 } elseif ($search_sale > 0) {
888 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = f.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
889 }
890}
891// Search for tag/category ($searchCategoryProductList is an array of ID)
892$searchCategoryProductList = $search_product_category ? array($search_product_category) : array();
893$searchCategoryProductOperator = 0;
894if (!empty($searchCategoryProductList)) {
895 $searchCategoryProductSqlList = array();
896 $listofcategoryid = '';
897 foreach ($searchCategoryProductList as $searchCategoryProduct) {
898 if (intval($searchCategoryProduct) == -2) {
899 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product)";
900 } elseif (intval($searchCategoryProduct) > 0) {
901 if ($searchCategoryProductOperator == 0) {
902 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
903 } else {
904 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
905 }
906 }
907 }
908 if ($listofcategoryid) {
909 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."facturedet as fd WHERE fd.fk_facture = f.rowid AND fd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
910 }
911 if ($searchCategoryProductOperator == 1) {
912 if (!empty($searchCategoryProductSqlList)) {
913 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
914 }
915 } else {
916 if (!empty($searchCategoryProductSqlList)) {
917 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
918 }
919 }
920}
921$searchCategoryCustomerList = $search_categ_cus ? array($search_categ_cus) : array();
922$searchCategoryCustomerOperator = 0;
923// Search for tag/category ($searchCategoryCustomerList is an array of ID)
924if (!empty($searchCategoryCustomerList)) {
925 $searchCategoryCustomerSqlList = array();
926 $listofcategoryid = '';
927 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
928 if (intval($searchCategoryCustomer) == -2) {
929 $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc)";
930 } elseif (intval($searchCategoryCustomer) > 0) {
931 if ($searchCategoryCustomerOperator == 0) {
932 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie = ".((int) $searchCategoryCustomer).")";
933 } else {
934 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
935 }
936 }
937 }
938 if ($listofcategoryid) {
939 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT ck.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as ck WHERE s.rowid = ck.fk_soc AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
940 }
941 if ($searchCategoryCustomerOperator == 1) {
942 if (!empty($searchCategoryCustomerSqlList)) {
943 $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
944 }
945 } else {
946 if (!empty($searchCategoryCustomerSqlList)) {
947 $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
948 }
949 }
950}
951// Add where from extra fields
952include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
953// Add where from hooks
954$parameters = array();
955$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
956$sql .= $hookmanager->resPrint;
957
958if ($search_all) {
959 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
960}
961
962// Add HAVING from hooks
963$parameters = array();
964$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
965$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
966
967// Count total nb of records
968$nbtotalofrecords = '';
969if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
970 /* The fast and low memory method to get and count full list converts the sql into a sql count */
971 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
972 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
973
974 $resql = $db->query($sqlforcount);
975 if ($resql) {
976 $objforcount = $db->fetch_object($resql);
977 $nbtotalofrecords = $objforcount->nbtotalofrecords;
978 } else {
979 dol_print_error($db);
980 }
981
982 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
983 $page = 0;
984 $offset = 0;
985 }
986 $db->free($resql);
987}
988
989// Complete request and execute it with limit
990$sql .= $db->order($sortfield, $sortorder);
991if ($limit) {
992 $sql .= $db->plimit($limit + 1, $offset);
993}
994
995$resql = $db->query($sql);
996if (!$resql) {
997 dol_print_error($db);
998 exit;
999}
1000
1001$num = $db->num_rows($resql);
1002
1003$arrayofselected = is_array($toselect) ? $toselect : array();
1004
1005if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
1006 $obj = $db->fetch_object($resql);
1007 $id = $obj->id;
1008
1009 header("Location: ".DOL_URL_ROOT.'/compta/facture/card.php?id='.$id);
1010 exit;
1011}
1012
1013// Output page
1014// --------------------------------------------------------------------
1015
1016llxHeader('', $title, $help_url, 0, 0, '', '', '', 'bodyforlist');
1017
1018$param = '&socid='.urlencode((string) ($socid));
1019if (!empty($mode)) {
1020 $param .= '&mode='.urlencode($mode);
1021}
1022if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
1023 $param .= '&contextpage='.urlencode($contextpage);
1024}
1025if ($limit > 0 && $limit != $conf->liste_limit) {
1026 $param .= '&limit='.((int) $limit);
1027}
1028if ($search_all) {
1029 $param .= '&search_all='.urlencode($search_all);
1030}
1031if ($search_date_startday) {
1032 $param .= '&search_date_startday='.urlencode((string) ($search_date_startday));
1033}
1034if ($search_date_startmonth) {
1035 $param .= '&search_date_startmonth='.urlencode((string) ($search_date_startmonth));
1036}
1037if ($search_date_startyear) {
1038 $param .= '&search_date_startyear='.urlencode((string) ($search_date_startyear));
1039}
1040if ($search_date_endday) {
1041 $param .= '&search_date_endday='.urlencode((string) ($search_date_endday));
1042}
1043if ($search_date_endmonth) {
1044 $param .= '&search_date_endmonth='.urlencode((string) ($search_date_endmonth));
1045}
1046if ($search_date_endyear) {
1047 $param .= '&search_date_endyear='.urlencode((string) ($search_date_endyear));
1048}
1049if ($search_date_valid_startday) {
1050 $param .= '&search_date_valid_startday='.urlencode((string) ($search_date_valid_startday));
1051}
1052if ($search_date_valid_startmonth) {
1053 $param .= '&search_date_valid_startmonth='.urlencode((string) ($search_date_valid_startmonth));
1054}
1055if ($search_date_valid_startyear) {
1056 $param .= '&search_date_valid_startyear='.urlencode((string) ($search_date_valid_startyear));
1057}
1058if ($search_date_valid_endday) {
1059 $param .= '&search_date_valid_endday='.urlencode((string) ($search_date_valid_endday));
1060}
1061if ($search_date_valid_endmonth) {
1062 $param .= '&search_date_valid_endmonth='.urlencode((string) ($search_date_valid_endmonth));
1063}
1064if ($search_date_valid_endyear) {
1065 $param .= '&search_date_valid_endyear='.urlencode((string) ($search_date_valid_endyear));
1066}
1067if ($search_datelimit_startday) {
1068 $param .= '&search_datelimit_startday='.urlencode((string) ($search_datelimit_startday));
1069}
1070if ($search_datelimit_startmonth) {
1071 $param .= '&search_datelimit_startmonth='.urlencode((string) ($search_datelimit_startmonth));
1072}
1073if ($search_datelimit_startyear) {
1074 $param .= '&search_datelimit_startyear='.urlencode((string) ($search_datelimit_startyear));
1075}
1076if ($search_datelimit_endday) {
1077 $param .= '&search_datelimit_endday='.urlencode((string) ($search_datelimit_endday));
1078}
1079if ($search_datelimit_endmonth) {
1080 $param .= '&search_datelimit_endmonth='.urlencode((string) ($search_datelimit_endmonth));
1081}
1082if ($search_datelimit_endyear) {
1083 $param .= '&search_datelimit_endyear='.urlencode((string) ($search_datelimit_endyear));
1084}
1085if ($search_ref) {
1086 $param .= '&search_ref='.urlencode($search_ref);
1087}
1088if ($search_refcustomer) {
1089 $param .= '&search_refcustomer='.urlencode($search_refcustomer);
1090}
1091if ($search_project_ref) {
1092 $param .= '&search_project_ref='.urlencode($search_project_ref);
1093}
1094if ($search_project) {
1095 $param .= '&search_project='.urlencode($search_project);
1096}
1097if ($search_type != '') {
1098 $param .= '&search_type='.urlencode($search_type);
1099}
1100if ($search_subtype != '') {
1101 $param .= '&search_subtype='.urlencode($search_subtype);
1102}
1103if ($search_company) {
1104 $param .= '&search_company='.urlencode($search_company);
1105}
1106if ($search_company_alias) {
1107 $param .= '&search_company_alias='.urlencode($search_company_alias);
1108}
1109if ($search_parent_name != '') {
1110 $param .= '&search_parent_name='.urlencode($search_parent_name);
1111}
1112if ($search_town) {
1113 $param .= '&search_town='.urlencode($search_town);
1114}
1115if ($search_zip) {
1116 $param .= '&search_zip='.urlencode($search_zip);
1117}
1118if ($search_country) {
1119 $param .= "&search_country=".urlencode($search_country);
1120}
1121if ($search_type_thirdparty != '') {
1122 $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
1123}
1124if ($search_customer_code) {
1125 $param .= '&search_customer_code='.urlencode($search_customer_code);
1126}
1127if ($search_sale > 0) {
1128 $param .= '&search_sale='.urlencode((string) $search_sale);
1129}
1130if ($search_user > 0) {
1131 $param .= '&search_user='.urlencode((string) $search_user);
1132}
1133if ($search_login) {
1134 $param .= '&search_login='.urlencode($search_login);
1135}
1136if ($search_product_category > 0) {
1137 $param .= '&search_product_category='.urlencode((string) $search_product_category);
1138}
1139if ($search_montant_ht != '') {
1140 $param .= '&search_montant_ht='.urlencode($search_montant_ht);
1141}
1142if ($search_montant_vat != '') {
1143 $param .= '&search_montant_vat='.urlencode($search_montant_vat);
1144}
1145if ($search_montant_localtax1 != '') {
1146 $param .= '&search_montant_localtax1='.urlencode($search_montant_localtax1);
1147}
1148if ($search_montant_localtax2 != '') {
1149 $param .= '&search_montant_localtax2='.urlencode($search_montant_localtax2);
1150}
1151if ($search_montant_ttc != '') {
1152 $param .= '&search_montant_ttc='.urlencode($search_montant_ttc);
1153}
1154if ($search_multicurrency_code != '') {
1155 $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
1156}
1157if ($search_multicurrency_tx != '') {
1158 $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
1159}
1160if ($search_multicurrency_montant_ht != '') {
1161 $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
1162}
1163if ($search_multicurrency_montant_vat != '') {
1164 $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat);
1165}
1166if ($search_multicurrency_montant_ttc != '') {
1167 $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
1168}
1169if ($search_status != '') {
1170 $param .= '&search_status='.urlencode($search_status);
1171}
1172if ($search_paymentmode > 0) {
1173 $param .= '&search_paymentmode='.urlencode((string) ($search_paymentmode));
1174}
1175if ($search_paymentterms > 0) {
1176 $param .= '&search_paymentterms='.urlencode((string) ($search_paymentterms));
1177}
1178if ($search_module_source) {
1179 $param .= '&search_module_source='.urlencode($search_module_source);
1180}
1181if ($search_pos_source) {
1182 $param .= '&search_pos_source='.urlencode($search_pos_source);
1183}
1184if ($show_files) {
1185 $param .= '&show_files='.urlencode((string) ($show_files));
1186}
1187if ($search_option) {
1188 $param .= "&search_option=".urlencode($search_option);
1189}
1190if ($optioncss != '') {
1191 $param .= '&optioncss='.urlencode($optioncss);
1192}
1193if ($search_categ_cus > 0) {
1194 $param .= '&search_categ_cus='.urlencode((string) ($search_categ_cus));
1195}
1196if (!empty($search_fac_rec_source_title)) {
1197 $param .= '&search_fac_rec_source_title='.urlencode($search_fac_rec_source_title);
1198}
1199
1200// Add $param from extra fields
1201include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1202// Add $param from hooks
1203$parameters = array('param' => &$param);
1204$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1205$param .= $hookmanager->resPrint;
1206
1207$arrayofmassactions = array(
1208 'validate' => img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
1209 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1210 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1211 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
1212);
1213
1214if ($user->hasRight('facture', 'paiement')) {
1215 $arrayofmassactions['makepayment'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakePaymentAndClassifyPayed");
1216}
1217if (isModEnabled('prelevement') && $user->hasRight('prelevement', 'bons', 'creer')) {
1218 $langs->load("withdrawals");
1219 $arrayofmassactions['withdrawrequest'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("MakeWithdrawRequest");
1220}
1221if ($user->hasRight('facture', 'supprimer')) {
1222 if (getDolGlobalString('INVOICE_CAN_REMOVE_DRAFT_ONLY')) {
1223 $arrayofmassactions['predeletedraft'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Deletedraft");
1224 } elseif (getDolGlobalString('INVOICE_CAN_ALWAYS_BE_REMOVED')) { // mass deletion never possible on invoices on such situation
1225 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
1226 }
1227}
1228if (in_array($massaction, array('presend', 'predelete', 'makepayment'))) {
1229 $arrayofmassactions = array();
1230}
1231$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1232
1233// Show the new button only when this page is not opend from the Extended POS
1234$newcardbutton = '';
1235if ($contextpage != 'poslist') {
1236 $url = DOL_URL_ROOT.'/compta/facture/card.php?action=create';
1237 if (!empty($socid)) {
1238 $url .= '&socid='.$socid;
1239 }
1240 $newcardbutton = '';
1241 $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'));
1242 $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'));
1243 $newcardbutton .= dolGetButtonTitleSeparator();
1244 $newcardbutton .= dolGetButtonTitle($langs->trans('NewBill'), '', 'fa fa-plus-circle', $url, '', $user->hasRight("facture", "creer"));
1245}
1246
1247$i = 0;
1248print '<form method="POST" id="searchFormList" name="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
1249if ($optioncss != '') {
1250 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1251}
1252print '<input type="hidden" name="token" value="'.newToken().'">';
1253print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1254if (!in_array($massaction, array('makepayment'))) {
1255 print '<input type="hidden" name="action" value="list">';
1256}
1257print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1258print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1259print '<input type="hidden" name="search_status" value="'.$search_status.'">';
1260print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
1261print '<input type="hidden" name="socid" value="'.$socid.'">';
1262print '<input type="hidden" name="mode" value="'.$mode.'">';
1263
1264print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'bill', 0, $newcardbutton, '', $limit, 0, 0, 1);
1265
1266$topicmail = "SendBillRef";
1267$modelmail = "facture_send";
1268$objecttmp = new Facture($db);
1269$trackid = 'inv'.$object->id;
1270include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1271
1272if ($massaction == 'makepayment') {
1273 $formconfirm = '';
1274 $formquestion = array(
1275 // 'text' => $langs->trans("ConfirmClone"),
1276 // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
1277 // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
1278 array('type' => 'date', 'name' => 'datepaiment', 'label' => $langs->trans("Date"), 'datenow' => 1),
1279 array('type' => 'other', 'name' => 'paiementid', 'label' => $langs->trans("PaymentMode"), 'value' => $form->select_types_paiements(GETPOST('search_paymentmode'), 'paiementid', '', 0, 0, 1, 0, 1, '', 1)),
1280 array('type' => 'other', 'name' => 'bankid', 'label' => $langs->trans("BankAccount"), 'value' => $form->select_comptes('', 'bankid', 0, '', 0, '', 0, '', 1)),
1281 //array('type' => 'other', 'name' => 'invoicesid', 'label' => '', 'value'=>'<input type="hidden" id="invoicesid" name="invoicesid" value="'.implode('#',GETPOST('toselect','array')).'">'),
1282 );
1283 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans('MakePaymentAndClassifyPayed'), $langs->trans('EnterPaymentReceivedFromCustomer'), 'makepayment_confirm', $formquestion, 1, 0, 200, 500, 1);
1284 print $formconfirm;
1285}
1286
1287if ($search_all) {
1288 foreach ($fieldstosearchall as $key => $val) {
1289 $fieldstosearchall[$key] = $langs->trans($val);
1290 }
1291 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1292}
1293
1294// If the user can view prospects other than his'
1295$moreforfilter = '';
1296if ($user->hasRight("user", "user", "lire")) {
1297 $langs->load("commercial");
1298 $moreforfilter .= '<div class="divsearchfield">';
1299 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1300 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth200');
1301 $moreforfilter .= '</div>';
1302}
1303// If the user can view prospects other than his'
1304if ($user->hasRight("user", "user", "lire")) {
1305 $moreforfilter .= '<div class="divsearchfield">';
1306 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1307 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth200');
1308 $moreforfilter .= '</div>';
1309}
1310// Filter on product tags
1311if (isModEnabled('category') && $user->hasRight("categorie", "lire") && ($user->hasRight("produit", "lire") || $user->hasRight("service", "lire"))) {
1312 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1313 $moreforfilter .= '<div class="divsearchfield">';
1314 $tmptitle = $langs->trans('IncludingProductWithTag');
1315 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
1316 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, 0, 'maxwidth300 widthcentpercentminusx', 1);
1317 $moreforfilter .= '</div>';
1318}
1319if (isModEnabled('category') && $user->hasRight("categorie", "lire")) {
1320 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1321 $moreforfilter .= '<div class="divsearchfield">';
1322 $tmptitle = $langs->trans('CustomersProspectsCategoriesShort');
1323 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $tmptitle);
1324 $moreforfilter .= '</div>';
1325}
1326// alert on due date
1327$moreforfilter .= '<div class="divsearchfield">';
1328$moreforfilter .= '<label for="search_option">'.$langs->trans('Alert').' </label><input type="checkbox" name="search_option" id="search_option" value="late"'.($search_option == 'late' ? ' checked' : '').'>';
1329$moreforfilter .= '</div>';
1330
1331$parameters = array();
1332$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1333if (empty($reshook)) {
1334 $moreforfilter .= $hookmanager->resPrint;
1335} else {
1336 $moreforfilter = $hookmanager->resPrint;
1337}
1338
1339if (!empty($moreforfilter)) {
1340 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1341 print $moreforfilter;
1342 print '</div>';
1343}
1344
1345$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1346$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
1347
1348// Show the massaction checkboxes only when this page is not opend from the Extended POS
1349if ($massactionbutton && $contextpage != 'poslist') {
1350 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
1351}
1352
1353print '<div class="div-table-responsive">';
1354print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1355
1356// Fields title search
1357// --------------------------------------------------------------------
1358print '<tr class="liste_titre_filter">';
1359
1360// Action column
1361if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1362 print '<td class="liste_titre center maxwidthsearch actioncolumn">';
1363 $searchpicto = $form->showFilterButtons('left');
1364 print $searchpicto;
1365 print '</td>';
1366}
1367
1368if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER_IN_LIST')) {
1369 print '<td class="liste_titre">';
1370 print '</td>';
1371}
1372// Ref
1373if (!empty($arrayfields['f.ref']['checked'])) {
1374 print '<td class="liste_titre" align="left">';
1375 print '<input class="flat maxwidth50imp" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
1376 print '</td>';
1377}
1378// Ref customer
1379if (!empty($arrayfields['f.ref_client']['checked'])) {
1380 print '<td class="liste_titre">';
1381 print '<input class="flat maxwidth50imp" type="text" name="search_refcustomer" value="'.dol_escape_htmltag($search_refcustomer).'">';
1382 print '</td>';
1383}
1384// Type
1385if (!empty($arrayfields['f.type']['checked'])) {
1386 print '<td class="liste_titre maxwidthonsmartphone">';
1387 $listtype = array(
1388 Facture::TYPE_STANDARD => $langs->trans("InvoiceStandard"),
1389 Facture::TYPE_DEPOSIT => $langs->trans("InvoiceDeposit"),
1390 Facture::TYPE_CREDIT_NOTE => $langs->trans("InvoiceAvoir"),
1391 Facture::TYPE_REPLACEMENT => $langs->trans("InvoiceReplacement"),
1392 );
1393 if (getDolGlobalString('INVOICE_USE_SITUATION')) {
1394 $listtype[Facture::TYPE_SITUATION] = $langs->trans("InvoiceSituation");
1395 }
1396 //$listtype[Facture::TYPE_PROFORMA]=$langs->trans("InvoiceProForma"); // A proformat invoice is not an invoice but must be an order.
1397 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1398 print $form->selectarray('search_type', $listtype, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
1399 print '</td>';
1400}
1401// Invoice Subtype
1402if (!empty($arrayfields['f.subtype']['checked'])) {
1403 print '<td class="liste_titre maxwidthonsmartphone" align="center">';
1404 print $form->selectarray('search_subtype', $subtypearray, $search_subtype, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
1405 print '</td>';
1406}
1407// Date invoice
1408if (!empty($arrayfields['f.datef']['checked'])) {
1409 print '<td class="liste_titre center">';
1410 print '<div class="nowrapfordate">';
1411 print $form->selectDate($search_date_start ? $search_date_start : -1, 'search_date_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1412 print '</div>';
1413 print '<div class="nowrapfordate">';
1414 print $form->selectDate($search_date_end ? $search_date_end : -1, 'search_date_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1415 print '</div>';
1416 print '</td>';
1417}
1418// Date valid
1419if (!empty($arrayfields['f.date_valid']['checked'])) {
1420 print '<td class="liste_titre center">';
1421 print '<div class="nowrapfordate">';
1422 print $form->selectDate($search_date_valid_start ? $search_date_valid_start : -1, 'search_date_valid_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1423 print '</div>';
1424 print '<div class="nowrapfordate">';
1425 print $form->selectDate($search_date_valid_end ? $search_date_valid_end : -1, 'search_date_valid_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1426 print '</div>';
1427 print '</td>';
1428}
1429// Date due
1430if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
1431 print '<td class="liste_titre center">';
1432 print '<div class="nowrapfordate">';
1433 print $form->selectDate($search_datelimit_start ? $search_datelimit_start : -1, 'search_datelimit_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1434 print '</div>';
1435 print '<div class="nowrapfordate">';
1436 print $form->selectDate($search_datelimit_end ? $search_datelimit_end : -1, 'search_datelimit_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1437 print '</div>';
1438 print '</td>';
1439}
1440// Project ref
1441if (!empty($arrayfields['p.ref']['checked'])) {
1442 print '<td class="liste_titre"><input class="flat maxwidth50imp" type="text" name="search_project_ref" value="'.dol_escape_htmltag($search_project_ref).'"></td>';
1443}
1444// Project label
1445if (!empty($arrayfields['p.title']['checked'])) {
1446 print '<td class="liste_titre"><input class="flat maxwidth50imp" type="text" name="search_project" value="'.dol_escape_htmltag($search_project).'"></td>';
1447}
1448// Thirdparty
1449if (!empty($arrayfields['s.nom']['checked'])) {
1450 print '<td class="liste_titre"><input class="flat maxwidth75imp" type="text" name="search_company" value="'.dol_escape_htmltag($search_company).'"'.($socid > 0 ? " disabled" : "").'></td>';
1451}
1452// Alias
1453if (!empty($arrayfields['s.name_alias']['checked'])) {
1454 print '<td class="liste_titre"><input class="flat maxwidth75imp" type="text" name="search_company_alias" value="'.dol_escape_htmltag($search_company_alias).'"></td>';
1455}
1456// Parent company
1457if (!empty($arrayfields['s2.nom']['checked'])) {
1458 print '<td class="liste_titre">';
1459 print '<input class="flat maxwidth100" type="text" name="search_parent_name" value="'.dol_escape_htmltag($search_parent_name).'">';
1460 print '</td>';
1461}
1462// Customer Code
1463if (!empty($arrayfields['s.code_client']['checked'])) {
1464 print '<td class="liste_titre"><input class="flat maxwidth75imp" type="text" name="search_customer_code" value="'.dol_escape_htmltag($search_customer_code).'"></td>';
1465}
1466// Town
1467if (!empty($arrayfields['s.town']['checked'])) {
1468 print '<td class="liste_titre"><input class="flat maxwidth75imp" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'"></td>';
1469}
1470// Zip
1471if (!empty($arrayfields['s.zip']['checked'])) {
1472 print '<td class="liste_titre"><input class="flat maxwidth50imp" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'"></td>';
1473}
1474// State
1475if (!empty($arrayfields['state.nom']['checked'])) {
1476 print '<td class="liste_titre">';
1477 print '<input class="flat maxwidth50imp" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1478 print '</td>';
1479}
1480// Country
1481if (!empty($arrayfields['country.code_iso']['checked'])) {
1482 print '<td class="liste_titre center">';
1483 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth150imp maxwidth150', 'code2', 1, 0, 1, null, 1);
1484 print '</td>';
1485}
1486// Company type
1487if (!empty($arrayfields['typent.code']['checked'])) {
1488 print '<td class="liste_titre maxwidthonsmartphone center">';
1489 print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (!getDolGlobalString('SOCIETE_SORT_ON_TYPEENT') ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), 'maxwidth100', 1);
1490 print '</td>';
1491}
1492// Payment mode
1493if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
1494 print '<td class="liste_titre">';
1495 print $form->select_types_paiements($search_paymentmode, 'search_paymentmode', '', 0, 1, 1, 0, 1, 'minwidth100 maxwidth100', 1);
1496 print '</td>';
1497}
1498// Payment terms
1499if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
1500 print '<td class="liste_titre left">';
1501 print $form->getSelectConditionsPaiements($search_paymentterms, 'search_paymentterms', -1, 1, 1, 'minwidth100 maxwidth100');
1502 print '</td>';
1503}
1504// Module source
1505if (!empty($arrayfields['f.module_source']['checked'])) {
1506 print '<td class="liste_titre">';
1507 print '<input class="flat maxwidth75" type="text" name="search_module_source" value="'.dol_escape_htmltag($search_module_source).'">';
1508 print '</td>';
1509}
1510// POS Terminal
1511if (!empty($arrayfields['f.pos_source']['checked'])) {
1512 print '<td class="liste_titre">';
1513 print '<input class="flat maxwidth50" type="text" name="search_pos_source" value="'.dol_escape_htmltag($search_pos_source).'">';
1514 print '</td>';
1515}
1516if (!empty($arrayfields['f.total_ht']['checked'])) {
1517 // Amount without tax
1518 print '<td class="liste_titre right">';
1519 print '<input class="flat" type="text" size="4" name="search_montant_ht" value="'.dol_escape_htmltag($search_montant_ht).'">';
1520 print '</td>';
1521}
1522if (!empty($arrayfields['f.total_tva']['checked'])) {
1523 // Amount vat
1524 print '<td class="liste_titre right">';
1525 print '<input class="flat" type="text" size="4" name="search_montant_vat" value="'.dol_escape_htmltag($search_montant_vat).'">';
1526 print '</td>';
1527}
1528if (!empty($arrayfields['f.total_localtax1']['checked'])) {
1529 // Localtax1
1530 print '<td class="liste_titre right">';
1531 print '<input class="flat" type="text" size="4" name="search_montant_localtax1" value="'.dol_escape_htmltag($search_montant_localtax1).'">';
1532 print '</td>';
1533}
1534if (!empty($arrayfields['f.total_localtax2']['checked'])) {
1535 // Localtax2
1536 print '<td class="liste_titre right">';
1537 print '<input class="flat" type="text" size="4" name="search_montant_localtax2" value="'.dol_escape_htmltag($search_montant_localtax2).'">';
1538 print '</td>';
1539}
1540if (!empty($arrayfields['f.total_ttc']['checked'])) {
1541 // Amount inc tax
1542 print '<td class="liste_titre right">';
1543 print '<input class="flat" type="text" size="4" name="search_montant_ttc" value="'.dol_escape_htmltag($search_montant_ttc).'">';
1544 print '</td>';
1545}
1546if (!empty($arrayfields['u.login']['checked'])) {
1547 // Author
1548 print '<td class="liste_titre" align="center">';
1549 print '<input class="flat" size="4" type="text" name="search_login" value="'.dol_escape_htmltag($search_login).'">';
1550 print '</td>';
1551}
1552if (!empty($arrayfields['sale_representative']['checked'])) {
1553 print '<td class="liste_titre"></td>';
1554}
1555if (!empty($arrayfields['f.retained_warranty']['checked'])) {
1556 print '<td class="liste_titre" align="right">';
1557 print '</td>';
1558}
1559if (!empty($arrayfields['dynamount_payed']['checked'])) {
1560 print '<td class="liste_titre right">';
1561 print '</td>';
1562}
1563if (!empty($arrayfields['rtp']['checked'])) {
1564 print '<td class="liste_titre">';
1565 print '</td>';
1566}
1567if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
1568 // Currency
1569 print '<td class="liste_titre">';
1570 print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
1571 print '</td>';
1572}
1573if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
1574 // Currency rate
1575 print '<td class="liste_titre">';
1576 print '<input class="flat" type="text" size="4" name="search_multicurrency_tx" value="'.dol_escape_htmltag($search_multicurrency_tx).'">';
1577 print '</td>';
1578}
1579if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
1580 // Amount
1581 print '<td class="liste_titre right">';
1582 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ht" value="'.dol_escape_htmltag($search_multicurrency_montant_ht).'">';
1583 print '</td>';
1584}
1585if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
1586 // Amount
1587 print '<td class="liste_titre right">';
1588 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_vat" value="'.dol_escape_htmltag($search_multicurrency_montant_vat).'">';
1589 print '</td>';
1590}
1591if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
1592 // Amount
1593 print '<td class="liste_titre right">';
1594 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ttc" value="'.dol_escape_htmltag($search_multicurrency_montant_ttc).'">';
1595 print '</td>';
1596}
1597if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
1598 print '<td class="liste_titre">';
1599 print '</td>';
1600}
1601if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
1602 print '<td class="liste_titre right">';
1603 print '</td>';
1604}
1605if (!empty($arrayfields['total_pa']['checked'])) {
1606 print '<td class="liste_titre right">';
1607 print '</td>';
1608}
1609if (!empty($arrayfields['total_margin']['checked'])) {
1610 print '<td class="liste_titre right">';
1611 print '</td>';
1612}
1613if (!empty($arrayfields['total_margin_rate']['checked'])) {
1614 print '<td class="liste_titre right">';
1615 print '</td>';
1616}
1617if (!empty($arrayfields['total_mark_rate']['checked'])) {
1618 print '<td class="liste_titre right">';
1619 print '</td>';
1620}
1621
1622// Extra fields
1623include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1624
1625// Fields from hook
1626$parameters = array('arrayfields' => $arrayfields);
1627$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1628print $hookmanager->resPrint;
1629// Date creation
1630if (!empty($arrayfields['f.datec']['checked'])) {
1631 print '<td class="liste_titre">';
1632 print '</td>';
1633}
1634// Date modification
1635if (!empty($arrayfields['f.tms']['checked'])) {
1636 print '<td class="liste_titre">';
1637 print '</td>';
1638}
1639// Date closing
1640if (!empty($arrayfields['f.date_closing']['checked'])) {
1641 print '<td class="liste_titre">';
1642 print '</td>';
1643}
1644if (!empty($arrayfields['f.note_public']['checked'])) {
1645 // Note public
1646 print '<td class="liste_titre">';
1647 print '</td>';
1648}
1649if (!empty($arrayfields['f.note_private']['checked'])) {
1650 // Note private
1651 print '<td class="liste_titre">';
1652 print '</td>';
1653}
1654if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) {
1655 // Template Invoice
1656 print '<td class="liste_titre maxwidthonsmartphone right">';
1657 print '<input class="flat maxwidth50imp" type="text" name="search_fac_rec_source_title" id="search_fac_rec_source_title" value="'.dol_escape_htmltag($search_fac_rec_source_title).'">';
1658 print '</td>';
1659}
1660// Status
1661if (!empty($arrayfields['f.fk_statut']['checked'])) {
1662 print '<td class="liste_titre center parentonrightofpage">';
1663 $liststatus = array('0' => $langs->trans("BillShortStatusDraft"), '0,1' => $langs->trans("BillShortStatusDraft").'+'.$langs->trans("BillShortStatusNotPaid"), '1' => $langs->trans("BillShortStatusNotPaid"), '1,2' => $langs->trans("BillShortStatusNotPaid").'+'.$langs->trans("BillShortStatusPaid"), '2' => $langs->trans("BillShortStatusPaid"), '3' => $langs->trans("BillShortStatusCanceled"));
1664 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1665 print $form->selectarray('search_status', $liststatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage', 1);
1666 print '</td>';
1667}
1668// Action column
1669if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1670 print '<td class="liste_titre center maxwidthsearch actioncolumn">';
1671 $searchpicto = $form->showFilterButtons();
1672 print $searchpicto;
1673 print '</td>';
1674}
1675print "</tr>\n";
1676
1677$totalarray = array();
1678$totalarray['nbfield'] = 0;
1679
1680// Fields title label
1681// --------------------------------------------------------------------
1682print '<tr class="liste_titre">';
1683if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1684 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
1685 $totalarray['nbfield']++;
1686}
1687if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER_IN_LIST')) {
1688 print_liste_field_titre('#', $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder);
1689 $totalarray['nbfield']++;
1690}
1691if (!empty($arrayfields['f.ref']['checked'])) {
1692 print_liste_field_titre($arrayfields['f.ref']['label'], $_SERVER['PHP_SELF'], 'f.ref', '', $param, '', $sortfield, $sortorder);
1693 $totalarray['nbfield']++;
1694}
1695if (!empty($arrayfields['f.ref_client']['checked'])) {
1696 print_liste_field_titre($arrayfields['f.ref_client']['label'], $_SERVER["PHP_SELF"], 'f.ref_client', '', $param, '', $sortfield, $sortorder);
1697 $totalarray['nbfield']++;
1698}
1699if (!empty($arrayfields['f.type']['checked'])) {
1700 print_liste_field_titre($arrayfields['f.type']['label'], $_SERVER["PHP_SELF"], 'f.type', '', $param, '', $sortfield, $sortorder);
1701 $totalarray['nbfield']++;
1702}
1703if (!empty($arrayfields['f.subtype']['checked'])) {
1704 print_liste_field_titre($arrayfields['f.subtype']['label'], $_SERVER["PHP_SELF"], 'f.subtype', '', $param, '', $sortfield, $sortorder);
1705}
1706if (!empty($arrayfields['f.datef']['checked'])) {
1707 print_liste_field_titre($arrayfields['f.datef']['label'], $_SERVER['PHP_SELF'], 'f.datef', '', $param, '', $sortfield, $sortorder, 'center ');
1708 $totalarray['nbfield']++;
1709}
1710if (!empty($arrayfields['f.date_valid']['checked'])) {
1711 print_liste_field_titre($arrayfields['f.date_valid']['label'], $_SERVER['PHP_SELF'], 'f.date_valid', '', $param, '', $sortfield, $sortorder, 'center ');
1712 $totalarray['nbfield']++;
1713}
1714if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
1715 print_liste_field_titre($arrayfields['f.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], "f.date_lim_reglement", '', $param, '', $sortfield, $sortorder, 'center ');
1716 $totalarray['nbfield']++;
1717}
1718if (!empty($arrayfields['p.ref']['checked'])) {
1719 $langs->load("projects");
1720 print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER['PHP_SELF'], "p.ref", '', $param, '', $sortfield, $sortorder);
1721 $totalarray['nbfield']++;
1722}
1723if (!empty($arrayfields['p.title']['checked'])) {
1724 print_liste_field_titre($arrayfields['p.title']['label'], $_SERVER['PHP_SELF'], "p.title", '', $param, '', $sortfield, $sortorder);
1725 $totalarray['nbfield']++;
1726}
1727if (!empty($arrayfields['s.nom']['checked'])) {
1728 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER['PHP_SELF'], 's.nom', '', $param, '', $sortfield, $sortorder);
1729 $totalarray['nbfield']++;
1730}
1731if (!empty($arrayfields['s.name_alias']['checked'])) {
1732 print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER['PHP_SELF'], 's.name_alias', '', $param, '', $sortfield, $sortorder);
1733 $totalarray['nbfield']++;
1734}
1735if (!empty($arrayfields['s2.nom']['checked'])) {
1736 print_liste_field_titre($arrayfields['s2.nom']['label'], $_SERVER['PHP_SELF'], 's2.nom', '', $param, '', $sortfield, $sortorder);
1737 $totalarray['nbfield']++;
1738}
1739if (!empty($arrayfields['s.code_client']['checked'])) {
1740 print_liste_field_titre($arrayfields['s.code_client']['label'], $_SERVER['PHP_SELF'], 's.code_client', '', $param, '', $sortfield, $sortorder);
1741 $totalarray['nbfield']++;
1742}
1743if (!empty($arrayfields['s.town']['checked'])) {
1744 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1745 $totalarray['nbfield']++;
1746}
1747if (!empty($arrayfields['s.zip']['checked'])) {
1748 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1749 $totalarray['nbfield']++;
1750}
1751if (!empty($arrayfields['state.nom']['checked'])) {
1752 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1753 $totalarray['nbfield']++;
1754}
1755if (!empty($arrayfields['country.code_iso']['checked'])) {
1756 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1757 $totalarray['nbfield']++;
1758}
1759if (!empty($arrayfields['typent.code']['checked'])) {
1760 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1761 $totalarray['nbfield']++;
1762}
1763if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
1764 print_liste_field_titre($arrayfields['f.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_mode_reglement", "", $param, "", $sortfield, $sortorder);
1765 $totalarray['nbfield']++;
1766}
1767if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
1768 print_liste_field_titre($arrayfields['f.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "f.fk_cond_reglement", "", $param, "", $sortfield, $sortorder);
1769 $totalarray['nbfield']++;
1770}
1771if (!empty($arrayfields['f.module_source']['checked'])) {
1772 print_liste_field_titre($arrayfields['f.module_source']['label'], $_SERVER["PHP_SELF"], "f.module_source", "", $param, "", $sortfield, $sortorder);
1773 $totalarray['nbfield']++;
1774}
1775if (!empty($arrayfields['f.pos_source']['checked'])) {
1776 print_liste_field_titre($arrayfields['f.pos_source']['label'], $_SERVER["PHP_SELF"], "f.pos_source", "", $param, "", $sortfield, $sortorder);
1777 $totalarray['nbfield']++;
1778}
1779if (!empty($arrayfields['f.total_ht']['checked'])) {
1780 print_liste_field_titre($arrayfields['f.total_ht']['label'], $_SERVER['PHP_SELF'], 'f.total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
1781 $totalarray['nbfield']++;
1782}
1783if (!empty($arrayfields['f.total_tva']['checked'])) {
1784 print_liste_field_titre($arrayfields['f.total_tva']['label'], $_SERVER['PHP_SELF'], 'f.total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
1785 $totalarray['nbfield']++;
1786}
1787if (!empty($arrayfields['f.total_localtax1']['checked'])) {
1788 print_liste_field_titre($arrayfields['f.total_localtax1']['label'], $_SERVER['PHP_SELF'], 'f.localtax1', '', $param, '', $sortfield, $sortorder, 'right ');
1789 $totalarray['nbfield']++;
1790}
1791if (!empty($arrayfields['f.total_localtax2']['checked'])) {
1792 print_liste_field_titre($arrayfields['f.total_localtax2']['label'], $_SERVER['PHP_SELF'], 'f.localtax2', '', $param, '', $sortfield, $sortorder, 'right ');
1793 $totalarray['nbfield']++;
1794}
1795if (!empty($arrayfields['f.total_ttc']['checked'])) {
1796 print_liste_field_titre($arrayfields['f.total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
1797 $totalarray['nbfield']++;
1798}
1799if (!empty($arrayfields['u.login']['checked'])) {
1800 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, '', $sortfield, $sortorder, 'center ');
1801 $totalarray['nbfield']++;
1802}
1803if (!empty($arrayfields['sale_representative']['checked'])) {
1804 print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder);
1805 $totalarray['nbfield']++;
1806}
1807if (!empty($arrayfields['f.retained_warranty']['checked'])) {
1808 print_liste_field_titre($arrayfields['f.retained_warranty']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1809 $totalarray['nbfield']++;
1810}
1811if (!empty($arrayfields['dynamount_payed']['checked'])) {
1812 print_liste_field_titre($arrayfields['dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1813 $totalarray['nbfield']++;
1814}
1815if (!empty($arrayfields['rtp']['checked'])) {
1816 print_liste_field_titre($arrayfields['rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1817 $totalarray['nbfield']++;
1818}
1819if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
1820 print_liste_field_titre($arrayfields['f.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_code', '', $param, '', $sortfield, $sortorder);
1821 $totalarray['nbfield']++;
1822}
1823if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
1824 print_liste_field_titre($arrayfields['f.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
1825 $totalarray['nbfield']++;
1826}
1827if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
1828 print_liste_field_titre($arrayfields['f.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
1829 $totalarray['nbfield']++;
1830}
1831if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
1832 print_liste_field_titre($arrayfields['f.multicurrency_total_vat']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
1833 $totalarray['nbfield']++;
1834}
1835if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
1836 print_liste_field_titre($arrayfields['f.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'f.multicurrency_total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
1837 $totalarray['nbfield']++;
1838}
1839if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
1840 print_liste_field_titre($arrayfields['multicurrency_dynamount_payed']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1841 $totalarray['nbfield']++;
1842}
1843if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
1844 print_liste_field_titre($arrayfields['multicurrency_rtp']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1845 $totalarray['nbfield']++;
1846}
1847if (!empty($arrayfields['total_pa']['checked'])) {
1848 print_liste_field_titre($arrayfields['total_pa']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1849 $totalarray['nbfield']++;
1850}
1851if (!empty($arrayfields['total_margin']['checked'])) {
1852 print_liste_field_titre($arrayfields['total_margin']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1853 $totalarray['nbfield']++;
1854}
1855if (!empty($arrayfields['total_margin_rate']['checked'])) {
1856 print_liste_field_titre($arrayfields['total_margin_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1857 $totalarray['nbfield']++;
1858}
1859if (!empty($arrayfields['total_mark_rate']['checked'])) {
1860 print_liste_field_titre($arrayfields['total_mark_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, 'right ');
1861 $totalarray['nbfield']++;
1862}
1863// Extra fields
1864include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1865// Hook fields
1866$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => $totalarray);
1867$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1868print $hookmanager->resPrint;
1869if (!empty($arrayfields['f.datec']['checked'])) {
1870 print_liste_field_titre($arrayfields['f.datec']['label'], $_SERVER["PHP_SELF"], "f.datec", "", $param, '', $sortfield, $sortorder, 'nowraponall center ');
1871 $totalarray['nbfield']++;
1872}
1873if (!empty($arrayfields['f.tms']['checked'])) {
1874 print_liste_field_titre($arrayfields['f.tms']['label'], $_SERVER["PHP_SELF"], "f.tms", "", $param, '', $sortfield, $sortorder, 'nowraponall center ');
1875 $totalarray['nbfield']++;
1876}
1877if (!empty($arrayfields['f.date_closing']['checked'])) {
1878 print_liste_field_titre($arrayfields['f.date_closing']['label'], $_SERVER["PHP_SELF"], "f.date_closing", "", $param, '', $sortfield, $sortorder, 'nowraponall center ');
1879 $totalarray['nbfield']++;
1880}
1881if (!empty($arrayfields['f.note_public']['checked'])) {
1882 print_liste_field_titre($arrayfields['f.note_public']['label'], $_SERVER["PHP_SELF"], "f.note_public", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1883 $totalarray['nbfield']++;
1884}
1885if (!empty($arrayfields['f.note_private']['checked'])) {
1886 print_liste_field_titre($arrayfields['f.note_private']['label'], $_SERVER["PHP_SELF"], "f.note_private", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1887 $totalarray['nbfield']++;
1888}
1889if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) {
1890 print_liste_field_titre($arrayfields['f.fk_fac_rec_source']['label'], $_SERVER["PHP_SELF"], "facrec.titre", "", $param, '', $sortfield, $sortorder);
1891 $totalarray['nbfield']++;
1892}
1893if (!empty($arrayfields['f.fk_statut']['checked'])) {
1894 print_liste_field_titre($arrayfields['f.fk_statut']['label'], $_SERVER["PHP_SELF"], "f.fk_statut,f.paye,f.type", "", $param, '', $sortfield, $sortorder, 'center ');
1895 $totalarray['nbfield']++;
1896}
1897if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1898 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
1899 $totalarray['nbfield']++;
1900}
1901
1902print "</tr>\n";
1903
1904$projectstatic = new Project($db);
1905$discount = new DiscountAbsolute($db);
1906$userstatic = new User($db);
1907
1908// Loop on record
1909// --------------------------------------------------------------------
1910if ($num > 0) {
1911 $i = 0;
1912 $savnbfield = $totalarray['nbfield'];
1913 $totalarray = array();
1914 $totalarray['nbfield'] = 0;
1915 $totalarray['val'] = array();
1916 $totalarray['val']['f.total_ht'] = 0;
1917 $totalarray['val']['f.total_tva'] = 0;
1918 $totalarray['val']['f.total_localtax1'] = 0;
1919 $totalarray['val']['f.total_localtax1'] = 0;
1920 $totalarray['val']['f.total_ttc'] = 0;
1921 $totalarray['val']['totalam'] = 0;
1922 $totalarray['val']['rtp'] = 0;
1923
1924 $typenArray = $formcompany->typent_array(1);
1925
1926 $with_margin_info = false;
1927 if (isModEnabled('margin') && (
1928 !empty($arrayfields['total_pa']['checked'])
1929 || !empty($arrayfields['total_margin']['checked'])
1930 || !empty($arrayfields['total_margin_rate']['checked'])
1931 || !empty($arrayfields['total_mark_rate']['checked'])
1932 )
1933 ) {
1934 $with_margin_info = true;
1935 }
1936 $total_ht = 0;
1937 $total_margin = 0;
1938
1939 $imaxinloop = ($limit ? min($num, $limit) : $num);
1940 while ($i < $imaxinloop) {
1941 $obj = $db->fetch_object($resql);
1942
1943 $datelimit = $db->jdate($obj->datelimite);
1944
1945 $facturestatic->id = $obj->id;
1946 $facturestatic->ref = $obj->ref;
1947 $facturestatic->ref_client = $obj->ref_client; // deprecated
1948 $facturestatic->ref_customer = $obj->ref_client;
1949 $facturestatic->type = $obj->type;
1950 $facturestatic->subtype = $obj->subtype;
1951 $facturestatic->total_ht = $obj->total_ht;
1952 $facturestatic->total_tva = $obj->total_tva;
1953 $facturestatic->total_ttc = $obj->total_ttc;
1954 $facturestatic->multicurrency_code = $obj->multicurrency_code;
1955 $facturestatic->multicurrency_tx = $obj->multicurrency_tx;
1956 $facturestatic->multicurrency_total_ht = $obj->multicurrency_total_ht;
1957 $facturestatic->multicurrency_total_tva = $obj->multicurrency_total_vat;
1958 $facturestatic->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1959 $facturestatic->statut = $obj->fk_statut; // deprecated
1960 $facturestatic->status = $obj->fk_statut;
1961 $facturestatic->close_code = $obj->close_code;
1962 $facturestatic->total_ttc = $obj->total_ttc;
1963 $facturestatic->paye = $obj->paye;
1964 $facturestatic->socid = $obj->fk_soc;
1965
1966 $facturestatic->date = $db->jdate($obj->datef);
1967 $facturestatic->date_validation = $db->jdate($obj->date_valid);
1968 $facturestatic->date_lim_reglement = $db->jdate($obj->datelimite);
1969
1970 $facturestatic->note_public = $obj->note_public;
1971 $facturestatic->note_private = $obj->note_private;
1972
1973 if (getDolGlobalString('INVOICE_USE_SITUATION') && getDolGlobalString('INVOICE_USE_RETAINED_WARRANTY')) {
1974 $facturestatic->retained_warranty = $obj->retained_warranty;
1975 $facturestatic->retained_warranty_date_limit = $obj->retained_warranty_date_limit;
1976 $facturestatic->situation_final = $obj->retained_warranty_date_limit;
1977 $facturestatic->situation_final = $obj->retained_warranty_date_limit;
1978 $facturestatic->situation_cycle_ref = $obj->situation_cycle_ref;
1979 $facturestatic->situation_counter = $obj->situation_counter;
1980 }
1981
1982 $companystatic->id = $obj->socid;
1983 $companystatic->name = $obj->name;
1984 $companystatic->name_alias = $obj->alias;
1985 $companystatic->client = $obj->client;
1986 $companystatic->fournisseur = $obj->fournisseur;
1987 $companystatic->code_client = $obj->code_client;
1988 $companystatic->code_compta_client = $obj->code_compta_client;
1989 $companystatic->code_fournisseur = $obj->code_fournisseur;
1990 $companystatic->code_compta_fournisseur = $obj->code_compta_fournisseur;
1991 $companystatic->email = $obj->email;
1992 $companystatic->phone = $obj->phone;
1993 $companystatic->fax = $obj->fax;
1994 $companystatic->address = $obj->address;
1995 $companystatic->zip = $obj->zip;
1996 $companystatic->town = $obj->town;
1997 $companystatic->country_code = $obj->country_code;
1998
1999 $projectstatic->id = $obj->project_id;
2000 $projectstatic->ref = $obj->project_ref;
2001 $projectstatic->title = $obj->project_label;
2002
2003 $paiement = $facturestatic->getSommePaiement();
2004 $totalcreditnotes = $facturestatic->getSumCreditNotesUsed();
2005 $totaldeposits = $facturestatic->getSumDepositsUsed();
2006 $totalpay = $paiement + $totalcreditnotes + $totaldeposits;
2007 $remaintopay = $obj->total_ttc - $totalpay;
2008
2009 $multicurrency_paiement = $facturestatic->getSommePaiement(1);
2010 $multicurrency_totalcreditnotes = $facturestatic->getSumCreditNotesUsed(1);
2011 $multicurrency_totaldeposits = $facturestatic->getSumDepositsUsed(1);
2012
2013 $totalpay = $paiement + $totalcreditnotes + $totaldeposits;
2014 $remaintopay = price2num($facturestatic->total_ttc - $totalpay);
2015
2016 $multicurrency_totalpay = $multicurrency_paiement + $multicurrency_totalcreditnotes + $multicurrency_totaldeposits;
2017 $multicurrency_remaintopay = price2num($facturestatic->multicurrency_total_ttc - $multicurrency_totalpay);
2018
2019 if ($facturestatic->status == Facture::STATUS_CLOSED && $facturestatic->close_code == 'discount_vat') { // If invoice closed with discount for anticipated payment
2020 $remaintopay = 0;
2021 $multicurrency_remaintopay = 0;
2022 }
2023 if ($facturestatic->type == Facture::TYPE_CREDIT_NOTE && $obj->paye == 1) { // If credit note closed, we take into account the amount not yet consumed
2024 $remaincreditnote = $discount->getAvailableDiscounts($companystatic, '', 'rc.fk_facture_source='.$facturestatic->id);
2025 $remaintopay = -$remaincreditnote;
2026 $totalpay = price2num($facturestatic->total_ttc - $remaintopay);
2027 $multicurrency_remaincreditnote = $discount->getAvailableDiscounts($companystatic, '', 'rc.fk_facture_source='.$facturestatic->id, 0, 0, 1);
2028 $multicurrency_remaintopay = -$multicurrency_remaincreditnote;
2029 $multicurrency_totalpay = price2num($facturestatic->multicurrency_total_ttc - $multicurrency_remaintopay);
2030 }
2031
2032 $facturestatic->alreadypaid = $paiement;
2033 $facturestatic->totalpaid = $paiement;
2034
2035 $marginInfo = array();
2036 if ($with_margin_info === true) {
2037 $facturestatic->fetch_lines();
2038 $marginInfo = $formmargin->getMarginInfosArray($facturestatic);
2039 $total_ht += $obj->total_ht;
2040 $total_margin += $marginInfo['total_margin'];
2041 }
2042
2043 $object = $facturestatic;
2044
2045 if ($mode == 'kanban') {
2046 if ($i == 0) {
2047 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
2048 print '<div class="box-flex-container kanban">';
2049 }
2050 // Output Kanban
2051 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2052 $selected = 0;
2053 if (in_array($object->id, $arrayofselected)) {
2054 $selected = 1;
2055 }
2056 }
2057
2058 $arraydata = array('alreadypaid' => $paiement, 'thirdparty' => $companystatic->getNomUrl(1, '', 12), 'userauthor' => $userstatic->getNomUrl(1), 'selected' => in_array($object->id, $arrayofselected));
2059 print $facturestatic->getKanbanView('', $arraydata);
2060 if ($i == ($imaxinloop - 1)) {
2061 print '</div>';
2062 print '</td></tr>';
2063 }
2064 } else {
2065 // Show line of result
2066 $j = 0;
2067 print '<tr data-rowid="'.$object->id.'" class="oddeven"';
2068 if ($contextpage == 'poslist') {
2069 print ' onclick="parent.$(\'#poslines\').load(\'invoice.php?action=history&placeid='.$obj->id.'\', function() {parent.$.colorbox.close();';
2070 if (strpos($obj->ref, 'PROV') !== false) {
2071 //If is a draft invoice, load var to be able to add products
2072 $place = str_replace(")", "", str_replace("(PROV-POS".$_SESSION["takeposterminal"]."-", "", $obj->ref));
2073 print 'parent.place=\''.dol_escape_js($place).'\'';
2074 }
2075 print '});"';
2076 }
2077 print '>';
2078
2079 // Action column
2080 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2081 print '<td class="nowrap center">';
2082 if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2083 $selected = 0;
2084 if (in_array($obj->id, $arrayofselected)) {
2085 $selected = 1;
2086 }
2087 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
2088 }
2089 print '</td>';
2090 if (!$i) {
2091 $totalarray['nbfield']++;
2092 }
2093 }
2094
2095 // No
2096 if (getDolGlobalString('MAIN_VIEW_LINE_NUMBER_IN_LIST')) {
2097 print '<td>'.(($offset * $limit) + $i).'</td>';
2098 if (!$i) {
2099 $totalarray['nbfield']++;
2100 }
2101 }
2102
2103 // Ref
2104 if (!empty($arrayfields['f.ref']['checked'])) {
2105 print '<td class="nowraponall">';
2106
2107 print '<table class="nobordernopadding"><tr class="nocellnopadd">';
2108
2109 print '<td class="nobordernopadding nowraponall">';
2110 if ($contextpage == 'poslist') {
2111 print dol_escape_htmltag($obj->ref);
2112 } else {
2113 print $facturestatic->getNomUrl(1, '', 200, 0, '', 0, 1);
2114 }
2115
2116 $filename = dol_sanitizeFileName($obj->ref);
2117 $filepath = $conf->facture->multidir_output[$obj->entity] ?? $conf->facture->dir_output;
2118 $filedir = $filepath . '/' . $filename;
2119
2120 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->id;
2121 print $formfile->getDocumentsLink($facturestatic->element, $filename, $filedir);
2122 print '</td>';
2123 print '</tr>';
2124 print '</table>';
2125
2126 print "</td>\n";
2127 if (!$i) {
2128 $totalarray['nbfield']++;
2129 }
2130 }
2131
2132 // Customer ref
2133 if (!empty($arrayfields['f.ref_client']['checked'])) {
2134 print '<td class="nowrap tdoverflowmax200">';
2135 print dol_escape_htmltag($obj->ref_client);
2136 print '</td>';
2137 if (!$i) {
2138 $totalarray['nbfield']++;
2139 }
2140 }
2141
2142 // Type
2143 if (!empty($arrayfields['f.type']['checked'])) {
2144 print '<td class="nowraponall tdoverflowmax100" title="'.$facturestatic->getLibType().'">';
2145 print $facturestatic->getLibType(2);
2146 print "</td>";
2147 if (!$i) {
2148 $totalarray['nbfield']++;
2149 }
2150 }
2151
2152 // Invoice Subtype
2153 if (!empty($arrayfields['f.subtype']['checked'])) {
2154 $labeltoshow = '';
2155 if ($facturestatic->subtype > 0) {
2156 $labeltoshow = $facturestatic->getSubtypeLabel('facture');
2157 }
2158 print '<td class="nowraponall tdoverflowmax300" title="'.$labeltoshow.'">';
2159 print $labeltoshow;
2160 print "</td>";
2161 if (!$i) {
2162 $totalarray['nbfield']++;
2163 }
2164 }
2165
2166 // Date
2167 if (!empty($arrayfields['f.datef']['checked'])) {
2168 print '<td align="center" class="nowraponall">';
2169 print dol_print_date($db->jdate($obj->datef), 'day');
2170 print '</td>';
2171 if (!$i) {
2172 $totalarray['nbfield']++;
2173 }
2174 }
2175
2176 // Date
2177 if (!empty($arrayfields['f.date_valid']['checked'])) {
2178 print '<td align="center" class="nowraponall">';
2179 print dol_print_date($db->jdate($obj->date_valid), 'day');
2180 print '</td>';
2181 if (!$i) {
2182 $totalarray['nbfield']++;
2183 }
2184 }
2185
2186 // Date limit
2187 if (!empty($arrayfields['f.date_lim_reglement']['checked'])) {
2188 print '<td align="center" class="nowraponall">'.dol_print_date($datelimit, 'day');
2189 if ($facturestatic->hasDelay()) {
2190 print img_warning($langs->trans('Alert').' - '.$langs->trans('Late'));
2191 }
2192 print '</td>';
2193 if (!$i) {
2194 $totalarray['nbfield']++;
2195 }
2196 }
2197
2198 // Project ref
2199 if (!empty($arrayfields['p.ref']['checked'])) {
2200 print '<td class="nocellnopadd nowraponall">';
2201 if ($obj->project_id > 0) {
2202 print $projectstatic->getNomUrl(1);
2203 }
2204 print '</td>';
2205 if (!$i) {
2206 $totalarray['nbfield']++;
2207 }
2208 }
2209
2210 // Project title
2211 if (!empty($arrayfields['p.title']['checked'])) {
2212 print '<td class="nowraponall">';
2213 if ($obj->project_id > 0) {
2214 print dol_escape_htmltag($projectstatic->title);
2215 }
2216 print '</td>';
2217 if (!$i) {
2218 $totalarray['nbfield']++;
2219 }
2220 }
2221
2222 // Third party
2223 if (!empty($arrayfields['s.nom']['checked'])) {
2224 print '<td class="tdoverflowmax150">';
2225 if ($contextpage == 'poslist') {
2226 print dol_escape_htmltag($companystatic->name);
2227 } else {
2228 print $companystatic->getNomUrl(1, 'customer', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
2229 }
2230 print '</td>';
2231 if (!$i) {
2232 $totalarray['nbfield']++;
2233 }
2234 }
2235 // Alias
2236 if (!empty($arrayfields['s.name_alias']['checked'])) {
2237 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($companystatic->name_alias).'">';
2238 print dol_escape_htmltag($companystatic->name_alias);
2239 print '</td>';
2240 if (!$i) {
2241 $totalarray['nbfield']++;
2242 }
2243 }
2244 // Parent company
2245 if (!empty($arrayfields['s2.nom']['checked'])) {
2246 print '<td class="tdoverflowmax200">';
2247 if ($obj->fk_parent > 0) {
2248 if (!isset($company_url_list[$obj->fk_parent])) {
2249 $companyparent = new Societe($db);
2250 $res = $companyparent->fetch($obj->fk_parent);
2251 if ($res > 0) {
2252 $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1);
2253 }
2254 }
2255 if (isset($company_url_list[$obj->fk_parent])) {
2256 print $company_url_list[$obj->fk_parent];
2257 }
2258 }
2259 print "</td>";
2260 if (!$i) {
2261 $totalarray['nbfield']++;
2262 }
2263 }
2264 // Customer Code
2265 if (!empty($arrayfields['s.code_client']['checked'])) {
2266 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($companystatic->code_client).'">';
2267 print dol_escape_htmltag($companystatic->code_client);
2268 print '</td>';
2269 if (!$i) {
2270 $totalarray['nbfield']++;
2271 }
2272 }
2273 // Town
2274 if (!empty($arrayfields['s.town']['checked'])) {
2275 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->town).'">';
2276 print dol_escape_htmltag($obj->town);
2277 print '</td>';
2278 if (!$i) {
2279 $totalarray['nbfield']++;
2280 }
2281 }
2282 // Zip
2283 if (!empty($arrayfields['s.zip']['checked'])) {
2284 print '<td class="nowraponall">';
2285 print dol_escape_htmltag($obj->zip);
2286 print '</td>';
2287 if (!$i) {
2288 $totalarray['nbfield']++;
2289 }
2290 }
2291 // State
2292 if (!empty($arrayfields['state.nom']['checked'])) {
2293 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->state_name).'">'.dol_escape_htmltag($obj->state_name)."</td>\n";
2294 if (!$i) {
2295 $totalarray['nbfield']++;
2296 }
2297 }
2298 // Country
2299 if (!empty($arrayfields['country.code_iso']['checked'])) {
2300 $tmparray = getCountry($obj->fk_pays, 'all');
2301 print '<td class="center tdoverflowmax100" title="'.dol_escape_htmltag($tmparray['label']).'">';
2302 print dol_escape_htmltag($tmparray['label']);
2303 print '</td>';
2304 if (!$i) {
2305 $totalarray['nbfield']++;
2306 }
2307 }
2308 // Type ent
2309 if (!empty($arrayfields['typent.code']['checked'])) {
2310 print '<td class="center">';
2311 if (!is_array($typenArray) || count($typenArray) == 0) {
2312 $typenArray = $formcompany->typent_array(1);
2313 }
2314 if (!empty($obj->typent_code)) {
2315 print $typenArray[$obj->typent_code];
2316 }
2317 print '</td>';
2318 if (!$i) {
2319 $totalarray['nbfield']++;
2320 }
2321 }
2322 // Staff
2323 if (!empty($arrayfields['staff.code']['checked'])) {
2324 print '<td class="center">';
2325 if (!is_array($conf->cache['staff']) || count($conf->cache['staff']) == 0) {
2326 $conf->cache['staff'] = $formcompany->effectif_array(1);
2327 }
2328 print $conf->cache['staff'][$obj->staff_code];
2329 print '</td>';
2330 if (!$i) {
2331 $totalarray['nbfield']++;
2332 }
2333 }
2334
2335 // Payment mode
2336 if (!empty($arrayfields['f.fk_mode_reglement']['checked'])) {
2337 $s = $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1, 0, '', 1);
2338 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($s).'">';
2339 print $s;
2340 print '</td>';
2341 if (!$i) {
2342 $totalarray['nbfield']++;
2343 }
2344 }
2345
2346 // Payment terms
2347 if (!empty($arrayfields['f.fk_cond_reglement']['checked'])) {
2348 $s = $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', -1, -1, 1);
2349 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($s).'">';
2350 print $s;
2351 print '</td>';
2352 if (!$i) {
2353 $totalarray['nbfield']++;
2354 }
2355 }
2356
2357 // Module Source
2358 if (!empty($arrayfields['f.module_source']['checked'])) {
2359 print '<td>';
2360 print dol_escape_htmltag($obj->module_source);
2361 print '</td>';
2362 if (!$i) {
2363 $totalarray['nbfield']++;
2364 }
2365 }
2366
2367 // POS Terminal
2368 if (!empty($arrayfields['f.pos_source']['checked'])) {
2369 print '<td>';
2370 print dol_escape_htmltag($obj->pos_source);
2371 print '</td>';
2372 if (!$i) {
2373 $totalarray['nbfield']++;
2374 }
2375 }
2376
2377 // Amount HT
2378 if (!empty($arrayfields['f.total_ht']['checked'])) {
2379 print '<td class="right nowraponall amount">'.price($obj->total_ht)."</td>\n";
2380 if (!$i) {
2381 $totalarray['nbfield']++;
2382 }
2383 if (!$i) {
2384 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ht';
2385 }
2386 $totalarray['val']['f.total_ht'] += $obj->total_ht;
2387 }
2388 // Amount VAT
2389 if (!empty($arrayfields['f.total_tva']['checked'])) {
2390 print '<td class="right nowraponall amount">'.price($obj->total_tva)."</td>\n";
2391 if (!$i) {
2392 $totalarray['nbfield']++;
2393 }
2394 if (!$i) {
2395 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_tva';
2396 }
2397 $totalarray['val']['f.total_tva'] += $obj->total_tva;
2398 }
2399 // Amount LocalTax1
2400 if (!empty($arrayfields['f.total_localtax1']['checked'])) {
2401 print '<td class="right nowraponall amount">'.price($obj->total_localtax1)."</td>\n";
2402 if (!$i) {
2403 $totalarray['nbfield']++;
2404 }
2405 if (!$i) {
2406 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax1';
2407 }
2408 $totalarray['val']['f.total_localtax1'] += $obj->total_localtax1;
2409 }
2410 // Amount LocalTax2
2411 if (!empty($arrayfields['f.total_localtax2']['checked'])) {
2412 print '<td class="right nowraponall amount">'.price($obj->total_localtax2)."</td>\n";
2413 if (!$i) {
2414 $totalarray['nbfield']++;
2415 }
2416 if (!$i) {
2417 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_localtax2';
2418 }
2419 $totalarray['val']['f.total_localtax2'] += $obj->total_localtax2;
2420 }
2421 // Amount TTC
2422 if (!empty($arrayfields['f.total_ttc']['checked'])) {
2423 print '<td class="right nowraponall amount">'.price($obj->total_ttc)."</td>\n";
2424 if (!$i) {
2425 $totalarray['nbfield']++;
2426 }
2427 if (!$i) {
2428 $totalarray['pos'][$totalarray['nbfield']] = 'f.total_ttc';
2429 }
2430 $totalarray['val']['f.total_ttc'] += $obj->total_ttc;
2431 }
2432
2433 $userstatic->id = $obj->fk_user_author;
2434 $userstatic->login = $obj->login;
2435 $userstatic->lastname = $obj->lastname;
2436 $userstatic->firstname = $obj->firstname;
2437 $userstatic->email = $obj->user_email;
2438 $userstatic->status = $obj->user_statut;
2439 $userstatic->entity = $obj->entity;
2440 $userstatic->photo = $obj->photo;
2441 $userstatic->office_phone = $obj->office_phone;
2442 $userstatic->office_fax = $obj->office_fax;
2443 $userstatic->user_mobile = $obj->user_mobile;
2444 $userstatic->job = $obj->job;
2445 $userstatic->gender = $obj->gender;
2446
2447 // Author
2448 if (!empty($arrayfields['u.login']['checked'])) {
2449 print '<td class="tdoverflowmax200">';
2450 if ($userstatic->id) {
2451 print $userstatic->getNomUrl(-1);
2452 } else {
2453 print '&nbsp;';
2454 }
2455 print "</td>\n";
2456 if (!$i) {
2457 $totalarray['nbfield']++;
2458 }
2459 }
2460
2461 if (!empty($arrayfields['sale_representative']['checked'])) {
2462 // Sales representatives
2463 print '<td>';
2464 if ($obj->socid > 0) {
2465 $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user);
2466 if ($listsalesrepresentatives < 0) {
2467 dol_print_error($db);
2468 }
2469 $nbofsalesrepresentative = count($listsalesrepresentatives);
2470 if ($nbofsalesrepresentative > 6) {
2471 // We print only number
2472 print $nbofsalesrepresentative;
2473 } elseif ($nbofsalesrepresentative > 0) {
2474 $j = 0;
2475 foreach ($listsalesrepresentatives as $val) {
2476 $userstatic->id = $val['id'];
2477 $userstatic->lastname = $val['lastname'];
2478 $userstatic->firstname = $val['firstname'];
2479 $userstatic->email = $val['email'];
2480 $userstatic->status = $val['statut'];
2481 $userstatic->entity = $val['entity'];
2482 $userstatic->photo = $val['photo'];
2483 $userstatic->login = $val['login'];
2484 $userstatic->office_phone = $val['office_phone'];
2485 $userstatic->office_fax = $val['office_fax'];
2486 $userstatic->user_mobile = $val['user_mobile'];
2487 $userstatic->job = $val['job'];
2488 $userstatic->gender = $val['gender'];
2489 //print '<div class="float">':
2490 print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2);
2491 $j++;
2492 if ($j < $nbofsalesrepresentative) {
2493 print ' ';
2494 }
2495 //print '</div>';
2496 }
2497 }
2498 //else print $langs->trans("NoSalesRepresentativeAffected");
2499 } else {
2500 print '&nbsp;';
2501 }
2502 print '</td>';
2503 if (!$i) {
2504 $totalarray['nbfield']++;
2505 }
2506 }
2507
2508 if (!empty($arrayfields['f.retained_warranty']['checked'])) {
2509 print '<td align="right">'.(!empty($obj->retained_warranty) ? price($obj->retained_warranty).'%' : '&nbsp;').'</td>';
2510 if (!$i) {
2511 $totalarray['nbfield']++;
2512 }
2513 }
2514
2515 if (!empty($arrayfields['dynamount_payed']['checked'])) {
2516 print '<td class="right nowraponall amount">'.(!empty($totalpay) ? price($totalpay, 0, $langs) : '&nbsp;').'</td>'; // TODO Use a denormalized field
2517 if (!$i) {
2518 $totalarray['nbfield']++;
2519 }
2520 if (!$i) {
2521 $totalarray['pos'][$totalarray['nbfield']] = 'totalam';
2522 }
2523 $totalarray['val']['totalam'] += $totalpay;
2524 }
2525
2526 // Pending amount
2527 if (!empty($arrayfields['rtp']['checked'])) {
2528 print '<td class="right nowraponall amount">';
2529 print(!empty($remaintopay) ? price($remaintopay, 0, $langs) : '&nbsp;');
2530 print '</td>'; // TODO Use a denormalized field
2531 if (!$i) {
2532 $totalarray['nbfield']++;
2533 }
2534 if (!$i) {
2535 $totalarray['pos'][$totalarray['nbfield']] = 'rtp';
2536 }
2537 $totalarray['val']['rtp'] += $remaintopay;
2538 }
2539
2540
2541 // Currency
2542 if (!empty($arrayfields['f.multicurrency_code']['checked'])) {
2543 print '<td class="nowraponall tdoverflowmax125" title="'.dol_escape_htmltag($obj->multicurrency_code.' - '.$langs->transnoentitiesnoconv('Currency'.$obj->multicurrency_code)).'">';
2544 if (!getDolGlobalString('MAIN_SHOW_ONLY_CODE_MULTICURRENCY')) {
2545 print $langs->transnoentitiesnoconv('Currency'.$obj->multicurrency_code);
2546 } else {
2547 print dol_escape_htmltag($obj->multicurrency_code);
2548 }
2549 print "</td>\n";
2550 if (!$i) {
2551 $totalarray['nbfield']++;
2552 }
2553 }
2554
2555 // Currency rate
2556 if (!empty($arrayfields['f.multicurrency_tx']['checked'])) {
2557 print '<td class="nowraponall">';
2558 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
2559 print "</td>\n";
2560 if (!$i) {
2561 $totalarray['nbfield']++;
2562 }
2563 }
2564 // Amount HT
2565 if (!empty($arrayfields['f.multicurrency_total_ht']['checked'])) {
2566 print '<td class="right nowraponall amount">'.price($obj->multicurrency_total_ht)."</td>\n";
2567 if (!$i) {
2568 $totalarray['nbfield']++;
2569 }
2570 }
2571 // Amount VAT
2572 if (!empty($arrayfields['f.multicurrency_total_vat']['checked'])) {
2573 print '<td class="right nowraponall amount">'.price($obj->multicurrency_total_vat)."</td>\n";
2574 if (!$i) {
2575 $totalarray['nbfield']++;
2576 }
2577 }
2578 // Amount TTC
2579 if (!empty($arrayfields['f.multicurrency_total_ttc']['checked'])) {
2580 print '<td class="right nowraponall amount">'.price($obj->multicurrency_total_ttc)."</td>\n";
2581 if (!$i) {
2582 $totalarray['nbfield']++;
2583 }
2584 }
2585 // Dyn amount
2586 if (!empty($arrayfields['multicurrency_dynamount_payed']['checked'])) {
2587 print '<td class="right nowraponall amount">'.(!empty($multicurrency_totalpay) ? price($multicurrency_totalpay, 0, $langs) : '&nbsp;').'</td>'; // TODO Use a denormalized field
2588 if (!$i) {
2589 $totalarray['nbfield']++;
2590 }
2591 }
2592
2593 // Pending amount
2594 if (!empty($arrayfields['multicurrency_rtp']['checked'])) {
2595 print '<td class="right nowraponall">';
2596 print(!empty($multicurrency_remaintopay) ? price($multicurrency_remaintopay, 0, $langs) : '&nbsp;');
2597 print '</td>'; // TODO Use a denormalized field ?
2598 if (!$i) {
2599 $totalarray['nbfield']++;
2600 }
2601 }
2602
2603 // Total buying or cost price
2604 if (!empty($arrayfields['total_pa']['checked'])) {
2605 print '<td class="right nowrap">'.price($marginInfo['pa_total'], 0, $langs, 1, -1, 'MT').'</td>';
2606 if (!$i) {
2607 $totalarray['nbfield']++;
2608 $totalarray['pos'][$totalarray['nbfield']] = 'total_pa';
2609 }
2610 if (empty($totalarray['val']['total_pa'])) {
2611 $totalarray['val']['total_pa'] = 0;
2612 }
2613 $totalarray['val']['total_pa'] += $marginInfo['pa_total'];
2614 }
2615 // Total margin
2616 if (!empty($arrayfields['total_margin']['checked'])) {
2617 print '<td class="right nowrap">'.price($marginInfo['total_margin'], 0, $langs, 1, -1, 'MT').'</td>';
2618 if (!$i) {
2619 $totalarray['nbfield']++;
2620 $totalarray['pos'][$totalarray['nbfield']] = 'total_margin';
2621 }
2622 if (empty($totalarray['val']['total_margin'])) {
2623 $totalarray['val']['total_margin'] = 0;
2624 }
2625 $totalarray['val']['total_margin'] += $marginInfo['total_margin'];
2626 }
2627 // Total margin rate
2628 if (!empty($arrayfields['total_margin_rate']['checked'])) {
2629 print '<td class="right nowrap">'.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], 0, '', 0, 0, 2).'%').'</td>';
2630 if (!$i) {
2631 $totalarray['nbfield']++;
2632 }
2633 }
2634 // Total mark rate
2635 if (!empty($arrayfields['total_mark_rate']['checked'])) {
2636 print '<td class="right nowrap">'.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], 0, '', 0, 0, 2).'%').'</td>';
2637 if (!$i) {
2638 $totalarray['nbfield']++;
2639 $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate';
2640 }
2641 if ($i >= $imaxinloop - 1) {
2642 if (!empty($total_ht)) {
2643 $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT');
2644 } else {
2645 $totalarray['val']['total_mark_rate'] = '';
2646 }
2647 }
2648 }
2649
2650 // Extra fields
2651 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
2652 // Fields from hook
2653 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
2654 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2655 print $hookmanager->resPrint;
2656 // Date creation
2657 if (!empty($arrayfields['f.datec']['checked'])) {
2658 print '<td class="nowraponall center">';
2659 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
2660 print '</td>';
2661 if (!$i) {
2662 $totalarray['nbfield']++;
2663 }
2664 }
2665 // Date modification
2666 if (!empty($arrayfields['f.tms']['checked'])) {
2667 print '<td class="nowraponall center">';
2668 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
2669 print '</td>';
2670 if (!$i) {
2671 $totalarray['nbfield']++;
2672 }
2673 }
2674 // Date closing
2675 if (!empty($arrayfields['f.date_closing']['checked'])) {
2676 print '<td class="nowraponall center">';
2677 print dol_print_date($db->jdate($obj->date_closing), 'dayhour', 'tzuser');
2678 print '</td>';
2679 if (!$i) {
2680 $totalarray['nbfield']++;
2681 }
2682 }
2683 // Note public
2684 if (!empty($arrayfields['f.note_public']['checked'])) {
2685 print '<td class="sensiblehtmlcontent center">';
2686 print dolPrintHTML($obj->note_public);
2687 print '</td>';
2688 if (!$i) {
2689 $totalarray['nbfield']++;
2690 }
2691 }
2692 // Note private
2693 if (!empty($arrayfields['f.note_private']['checked'])) {
2694 print '<td class="center">';
2695 print dolPrintHTML($obj->note_private);
2696 print '</td>';
2697 if (!$i) {
2698 $totalarray['nbfield']++;
2699 }
2700 }
2701 // Template Invoice
2702 if (!empty($arrayfields['f.fk_fac_rec_source']['checked'])) {
2703 print '<td class="center">';
2704 if (!empty($obj->fk_fac_rec_source)) {
2705 $facrec = new FactureRec($db);
2706 $result = $facrec->fetch($obj->fk_fac_rec_source);
2707 if ($result < 0) {
2708 setEventMessages($facrec->error, $facrec->errors, 'errors');
2709 } else {
2710 print $facrec->getNomUrl();
2711 }
2712 }
2713 print '</td>';
2714 if (!$i) {
2715 $totalarray['nbfield']++;
2716 }
2717 }
2718 // Status
2719 if (!empty($arrayfields['f.fk_statut']['checked'])) {
2720 print '<td class="nowrap center">';
2721 print $facturestatic->getLibStatut(5, $paiement);
2722 print "</td>";
2723 if (!$i) {
2724 $totalarray['nbfield']++;
2725 }
2726 }
2727
2728 // Action column (Show the massaction button only when this page is not opend from the Extended POS)
2729
2730 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2731 print '<td class="nowrap center">';
2732 if (($massactionbutton || $massaction) && $contextpage != 'poslist') { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2733 $selected = 0;
2734 if (in_array($obj->id, $arrayofselected)) {
2735 $selected = 1;
2736 }
2737 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
2738 }
2739 print '</td>';
2740 if (!$i) {
2741 $totalarray['nbfield']++;
2742 }
2743 }
2744
2745 print '</tr>'."\n";
2746 }
2747
2748 $i++;
2749 }
2750
2751 // Use correct digits number for totals
2752 $totalarray['val']['total_pa'] = (isset($totalarray['val']['total_pa']) ? price2num($totalarray['val']['total_pa'], 'MT') : null);
2753 $totalarray['val']['total_margin'] = (isset($totalarray['val']['total_margin']) ? price2num($totalarray['val']['total_margin'], 'MT') : null);
2754
2755 // Show total line
2756 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
2757}
2758
2759// If no record found
2760if ($num == 0) {
2761 $colspan = 1;
2762 foreach ($arrayfields as $key => $val) {
2763 if (!empty($val['checked'])) {
2764 $colspan++;
2765 }
2766 }
2767 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2768}
2769
2770$db->free($resql);
2771
2772$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
2773$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2774print $hookmanager->resPrint;
2775
2776print '</table>'."\n";
2777print '</div>'."\n";
2778
2779print '</form>'."\n";
2780
2781// Show the file area only when this page is not opend from the Extended POS
2782if ($contextpage != 'poslist') {
2783 $hidegeneratedfilelistifempty = 1;
2784 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
2785 $hidegeneratedfilelistifempty = 0;
2786 }
2787
2788 // Show list of available documents
2789 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
2790 $urlsource .= str_replace('&amp;', '&', $param);
2791
2792 $filedir = $diroutputmassaction;
2793 $genallowed = $user->hasRight("facture", "lire");
2794 $delallowed = $user->hasRight("facture", "creer");
2795 $title = '';
2796
2797 print $formfile->showdocuments('massfilesarea_invoices', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
2798}
2799
2800// End of page
2801llxFooter();
2802$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage bank accounts.
Class to manage absolute discounts.
Class to manage standard extra fields.
Class to manage invoices.
const TYPE_REPLACEMENT
Replacement invoice.
const STATUS_DRAFT
Draft status.
const TYPE_STANDARD
Standard invoice.
const TYPE_SITUATION
Situation invoice.
const STATUS_VALIDATED
Validated (need to be paid)
const TYPE_DEPOSIT
Deposit invoice.
const TYPE_CREDIT_NOTE
Credit note invoice.
const STATUS_CLOSED
Classified paid.
Class to manage invoice templates.
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 to manage payments of customer invoices.
Class to manage projects.
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.
getCountriesInEEC()
Return list of countries that are inside the EEC (European Economic Community) Note: Try to keep this...
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.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.