dolibarr 20.0.2
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2013 Christophe Battarel <christophe.battarel@altairis.fr>
8 * Copyright (C) 2013 Cédric Salvado <csalvador@gpcsolutions.fr>
9 * Copyright (C) 2015-2024 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2015 Marcos García <marcosgdf@gmail.com>
11 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
12 * Copyright (C) 2016-2023 Ferran Marcet <fmarcet@2byte.es>
13 * Copyright (C) 2018-2023 Charlene Benke <charlene@patas-monkey.com>
14 * Copyright (C) 2021-2024 Anthony Berton <anthony.berton@bb2a.fr>
15 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
16 * Copyright (C) 2024 Noé Cendrier <noe.cendrier@altairis.fr>
17 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
18 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
19 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
20 *
21 * This program is free software; you can redistribute it and/or modify
22 * it under the terms of the GNU General Public License as published by
23 * the Free Software Foundation; either version 3 of the License, or
24 * (at your option) any later version.
25 *
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * GNU General Public License for more details.
30 *
31 * You should have received a copy of the GNU General Public License
32 * along with this program. If not, see <https://www.gnu.org/licenses/>.
33 */
34
42// Load Dolibarr environment
43require '../main.inc.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
45require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
46require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.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.'/commande/class/commande.class.php';
54require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
55require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
56require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
57
58// Load translation files required by the page
59$langs->loadLangs(array('orders', 'sendings', 'deliveries', 'companies', 'compta', 'bills', 'stocks', 'products'));
60
61// Get Parameters
62$action = GETPOST('action', 'aZ09');
63$massaction = GETPOST('massaction', 'alpha');
64$show_files = GETPOSTINT('show_files');
65$confirm = GETPOST('confirm', 'alpha');
66$toselect = GETPOST('toselect', 'array');
67$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'orderlist';
68$optioncss = GETPOST('optioncss', 'alpha');
69$mode = GETPOST('mode', 'alpha');
70
71if (getDolGlobalInt('MAIN_SEE_SUBORDINATES')) {
72 $userschilds = $user->getAllChildIds();
73}
74
75// Search Parameters
76$search_datecloture_start = GETPOSTINT('search_datecloture_start');
77if (empty($search_datecloture_start)) {
78 $search_datecloture_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datecloture_startmonth'), GETPOSTINT('search_datecloture_startday'), GETPOSTINT('search_datecloture_startyear'));
79}
80$search_datecloture_end = GETPOSTINT('search_datecloture_end');
81if (empty($search_datecloture_end)) {
82 $search_datecloture_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datecloture_endmonth'), GETPOSTINT('search_datecloture_endday'), GETPOSTINT('search_datecloture_endyear'));
83}
84$search_dateorder_start = dol_mktime(0, 0, 0, GETPOSTINT('search_dateorder_start_month'), GETPOSTINT('search_dateorder_start_day'), GETPOSTINT('search_dateorder_start_year'));
85$search_dateorder_end = dol_mktime(23, 59, 59, GETPOSTINT('search_dateorder_end_month'), GETPOSTINT('search_dateorder_end_day'), GETPOSTINT('search_dateorder_end_year'));
86$search_datedelivery_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datedelivery_start_month'), GETPOSTINT('search_datedelivery_start_day'), GETPOSTINT('search_datedelivery_start_year'));
87$search_datedelivery_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datedelivery_end_month'), GETPOSTINT('search_datedelivery_end_day'), GETPOSTINT('search_datedelivery_end_year'));
88
89$socid = GETPOSTINT('socid');
90
91$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
92$search_product_category = GETPOST('search_product_category', 'intcomma');
93$search_id = GETPOST('search_id', 'int');
94$search_ref = GETPOST('search_ref', 'alpha') != '' ? GETPOST('search_ref', 'alpha') : GETPOST('sref', 'alpha');
95$search_ref_customer = GETPOST('search_ref_customer', 'alpha');
96$search_company = GETPOST('search_company', 'alpha');
97$search_company_alias = GETPOST('search_company_alias', 'alpha');
98$search_parent_name = trim(GETPOST('search_parent_name', 'alphanohtml'));
99$search_town = GETPOST('search_town', 'alpha');
100$search_zip = GETPOST('search_zip', 'alpha');
101$search_state = GETPOST('search_state', 'alpha');
102$search_country = GETPOST('search_country', 'aZ09');
103$search_type_thirdparty = GETPOST('search_type_thirdparty', 'intcomma');
104$search_user = GETPOST('search_user', 'intcomma');
105$search_sale = GETPOST('search_sale', 'intcomma');
106$search_total_ht = GETPOST('search_total_ht', 'alpha');
107$search_total_vat = GETPOST('search_total_vat', 'alpha');
108$search_total_ttc = GETPOST('search_total_ttc', 'alpha');
109$search_warehouse = GETPOST('search_warehouse', 'intcomma');
110
111$search_multicurrency_code = GETPOST('search_multicurrency_code', 'alpha');
112$search_multicurrency_tx = GETPOST('search_multicurrency_tx', 'alpha');
113$search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'alpha');
114$search_multicurrency_montant_vat = GETPOST('search_multicurrency_montant_vat', 'alpha');
115$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha');
116
117$search_login = GETPOST('search_login', 'alpha');
118$search_categ_cus = GETPOST("search_categ_cus", 'intcomma');
119$search_billed = GETPOST('search_billed', 'intcomma');
120$search_status = GETPOST('search_status', 'intcomma');
121$search_project_ref = GETPOST('search_project_ref', 'alpha');
122$search_project = GETPOST('search_project', 'alpha');
123$search_shippable = GETPOST('search_shippable', 'aZ09');
124
125$search_fk_cond_reglement = GETPOST('search_fk_cond_reglement', 'intcomma');
126$search_fk_shipping_method = GETPOST('search_fk_shipping_method', 'intcomma');
127$search_fk_mode_reglement = GETPOST('search_fk_mode_reglement', 'intcomma');
128$search_fk_input_reason = GETPOST('search_fk_input_reason', 'intcomma');
129
130$search_option = GETPOST('search_option', 'alpha');
131if ($search_option == 'late') {
132 $search_status = '-2';
133}
134
135$diroutputmassaction = $conf->commande->multidir_output[$conf->entity].'/temp/massgeneration/'.$user->id;
136
137// Load variable for pagination
138$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
139$sortfield = GETPOST('sortfield', 'aZ09comma');
140$sortorder = GETPOST('sortorder', 'aZ09comma');
141$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
142if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
143 // If $page is not defined, or '' or -1 or if we click on clear filters
144 $page = 0;
145}
146$offset = $limit * $page;
147$pageprev = $page - 1;
148$pagenext = $page + 1;
149if (!$sortfield) {
150 $sortfield = 'c.ref';
151}
152if (!$sortorder) {
153 $sortorder = 'DESC';
154}
155
156$show_shippable_command = GETPOST('show_shippable_command', 'aZ09');
157
158// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
159$object = new Commande($db);
160$hookmanager->initHooks(array('orderlist'));
161$extrafields = new ExtraFields($db);
162
163// fetch optionals attributes and labels
164$extrafields->fetch_name_optionals_label($object->table_element);
165$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
166
167// List of fields to search into when doing a "search in all"
168$fieldstosearchall = array(
169 'c.ref' => 'Ref',
170 'c.ref_client' => 'RefCustomerOrder',
171 'pd.description' => 'Description',
172 's.nom' => "ThirdParty",
173 's.name_alias' => "AliasNameShort",
174 's.zip' => "Zip",
175 's.town' => "Town",
176 'c.note_public' => 'NotePublic',
177);
178if (empty($user->socid)) {
179 $fieldstosearchall["c.note_private"] = "NotePrivate";
180}
181
182$checkedtypetiers = 0;
183$arrayfields = array(
184 'c.rowid' => array('label' => "ID", 'checked' => 1, 'enabled' => getDolGlobalInt('MAIN_SHOW_TECHNICAL_ID'), 'position' => 1),
185 'c.ref' => array('label' => "Ref", 'checked' => 1, 'position' => 5, 'searchall' => 1),
186 'c.ref_client' => array('label' => "RefCustomerOrder", 'checked' => -1, 'position' => 10, 'searchall' => 1),
187 'p.ref' => array('label' => "ProjectRef", 'checked' => -1, 'enabled' => (!isModEnabled('project') ? 0 : 1), 'position' => 20),
188 'p.title' => array('label' => "ProjectLabel", 'checked' => 0, 'enabled' => (!isModEnabled('project') ? 0 : 1), 'position' => 25),
189 's.nom' => array('label' => "ThirdParty", 'checked' => 1, 'position' => 30, 'searchall' => 1),
190 's.name_alias' => array('label' => "AliasNameShort", 'checked' => -1, 'position' => 31, 'searchall' => 1),
191 's2.nom' => array('label' => 'ParentCompany', 'position' => 32, 'checked' => 0),
192 's.town' => array('label' => "Town", 'checked' => -1, 'position' => 35, 'searchall' => 1),
193 's.zip' => array('label' => "Zip", 'checked' => -1, 'position' => 40, 'searchall' => 1),
194 'state.nom' => array('label' => "StateShort", 'checked' => 0, 'position' => 45),
195 'country.code_iso' => array('label' => "Country", 'checked' => 0, 'position' => 50),
196 'typent.code' => array('label' => "ThirdPartyType", 'checked' => $checkedtypetiers, 'position' => 55),
197 'c.date_commande' => array('label' => "OrderDateShort", 'checked' => 1, 'position' => 60, 'csslist' => 'nowraponall'),
198 'c.date_delivery' => array('label' => "DateDeliveryPlanned", 'checked' => 1, 'enabled' => !getDolGlobalString('ORDER_DISABLE_DELIVERY_DATE'), 'position' => 65, 'csslist' => 'nowraponall'),
199 'c.fk_shipping_method' => array('label' => "SendingMethod", 'checked' => -1, 'position' => 66 , 'enabled' => isModEnabled("shipping")),
200 'c.fk_cond_reglement' => array('label' => "PaymentConditionsShort", 'checked' => -1, 'position' => 67),
201 'c.fk_mode_reglement' => array('label' => "PaymentMode", 'checked' => -1, 'position' => 68),
202 'c.fk_input_reason' => array('label' => "Origin", 'checked' => -1, 'position' => 69),
203 'c.total_ht' => array('label' => "AmountHT", 'checked' => 1, 'position' => 75),
204 'c.total_vat' => array('label' => "AmountVAT", 'checked' => 0, 'position' => 80),
205 'c.total_ttc' => array('label' => "AmountTTC", 'checked' => 0, 'position' => 85),
206 'c.multicurrency_code' => array('label' => 'Currency', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1), 'position' => 90),
207 'c.multicurrency_tx' => array('label' => 'CurrencyRate', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1), 'position' => 95),
208 'c.multicurrency_total_ht' => array('label' => 'MulticurrencyAmountHT', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1), 'position' => 100),
209 'c.multicurrency_total_vat' => array('label' => 'MulticurrencyAmountVAT', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1), 'position' => 105),
210 'c.multicurrency_total_ttc' => array('label' => 'MulticurrencyAmountTTC', 'checked' => 0, 'enabled' => (!isModEnabled("multicurrency") ? 0 : 1), 'position' => 110),
211 'u.login' => array('label' => "Author", 'checked' => 1, 'position' => 115),
212 'sale_representative' => array('label' => "SaleRepresentativesOfThirdParty", 'checked' => 0, 'position' => 116),
213 'total_pa' => array('label' => (getDolGlobalString('MARGIN_TYPE') == '1' ? 'BuyingPrice' : 'CostPrice'), 'checked' => 0, 'position' => 300, 'enabled' => (!isModEnabled('margin') || !$user->hasRight("margins", "liretous") ? 0 : 1)),
214 'total_margin' => array('label' => 'Margin', 'checked' => 0, 'position' => 301, 'enabled' => (!isModEnabled('margin') || !$user->hasRight("margins", "liretous") ? 0 : 1)),
215 'total_margin_rate' => array('label' => 'MarginRate', 'checked' => 0, 'position' => 302, 'enabled' => (!isModEnabled('margin') || !$user->hasRight("margins", "liretous") || !getDolGlobalString('DISPLAY_MARGIN_RATES') ? 0 : 1)),
216 'total_mark_rate' => array('label' => 'MarkRate', 'checked' => 0, 'position' => 303, 'enabled' => (!isModEnabled('margin') || !$user->hasRight("margins", "liretous") || !getDolGlobalString('DISPLAY_MARK_RATES') ? 0 : 1)),
217 'c.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 120),
218 'c.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 125),
219 'c.date_cloture' => array('label' => "DateClosing", 'checked' => 0, 'position' => 130),
220 'c.note_public' => array('label' => 'NotePublic', 'checked' => 0, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES')), 'position' => 135, 'searchall' => 1),
221 'c.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'enabled' => (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'position' => 140),
222 'shippable' => array('label' => "Shippable", 'checked' => 1,'enabled' => (isModEnabled("shipping")), 'position' => 990),
223 'c.facture' => array('label' => "Billed", 'checked' => 1, 'enabled' => (!getDolGlobalString('WORKFLOW_BILL_ON_SHIPMENT')), 'position' => 995),
224 'c.import_key' => array('type' => 'varchar(14)', 'label' => 'ImportId', 'enabled' => 1, 'visible' => -2, 'position' => 999),
225 'c.fk_statut' => array('label' => "Status", 'checked' => 1, 'position' => 1000)
226);
227
228$parameters = array('fieldstosearchall' => $fieldstosearchall);
229$reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
230if ($reshook > 0) {
231 $fieldstosearchall = empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall'];
232} elseif ($reshook == 0) {
233 $fieldstosearchall = array_merge($fieldstosearchall, empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall']);
234}
235
236// Extra fields
237include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
238
239$object->fields = dol_sort_array($object->fields, 'position');
240//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
241$arrayfields = dol_sort_array($arrayfields, 'position');
242'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
243
244
245// Security check
246$id = GETPOSTINT('orderid', GETPOSTINT('id'));
247if ($user->socid) {
248 $socid = $user->socid;
249}
250
251$permissiontoreadallthirdparty = $user->hasRight('societe', 'client', 'voir');
252
253
254$result = restrictedArea($user, 'commande', $id, '');
255
256$error = 0;
257
258
259/*
260 * Actions
261 */
262
263if (GETPOST('cancel', 'alpha')) {
264 $action = 'list';
265 $massaction = '';
266}
267if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') {
268 $massaction = '';
269}
270
271$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
272$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
273if ($reshook < 0) {
274 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
275}
276
277if (empty($reshook)) {
278 // Selection of new fields
279 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
280
281 // Purge search criteria
282 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
283 $search_user = '';
284 $search_sale = '';
285 $search_product_category = '';
286 $search_id = '';
287 $search_ref = '';
288 $search_ref_customer = '';
289 $search_company = '';
290 $search_company_alias = '';
291 $search_parent_name = '';
292 $search_town = '';
293 $search_zip = "";
294 $search_state = "";
295 $search_type = '';
296 $search_country = '';
297 $search_type_thirdparty = '';
298 $search_total_ht = '';
299 $search_total_vat = '';
300 $search_total_ttc = '';
301 $search_warehouse = '';
302 $search_multicurrency_code = '';
303 $search_multicurrency_tx = '';
304 $search_multicurrency_montant_ht = '';
305 $search_multicurrency_montant_vat = '';
306 $search_multicurrency_montant_ttc = '';
307 $search_login = '';
308 $search_dateorder_start = '';
309 $search_dateorder_end = '';
310 $search_datedelivery_start = '';
311 $search_datedelivery_end = '';
312 $search_project_ref = '';
313 $search_project = '';
314 $search_status = '';
315 $search_billed = '';
316 $toselect = array();
317 $search_array_options = array();
318 $search_categ_cus = 0;
319 $search_datecloture_start = '';
320 $search_datecloture_end = '';
321 $search_fk_cond_reglement = '';
322 $search_fk_shipping_method = '';
323 $search_fk_mode_reglement = '';
324 $search_fk_input_reason = '';
325 $search_option = '';
326 }
327 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
328 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
329 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
330 }
331
332 // Mass actions
333 $objectclass = 'Commande';
334 $objectlabel = 'Orders';
335 $permissiontoread = $user->hasRight("commande", "lire");
336 $permissiontoadd = $user->hasRight("commande", "creer");
337 $permissiontodelete = $user->hasRight("commande", "supprimer");
338 if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
339 $permissiontovalidate = $user->hasRight("commande", "order_advance", "validate");
340 $permissiontoclose = $user->hasRight("commande", "order_advance", "close");
341 $permissiontocancel = $user->hasRight("commande", "order_advance", "annuler");
342 $permissiontosendbymail = $user->hasRight("commande", "order_advance", "send");
343 } else {
344 $permissiontovalidate = $user->hasRight("commande", "creer");
345 $permissiontoclose = $user->hasRight("commande", "creer");
346 $permissiontocancel = $user->hasRight("commande", "creer");
347 $permissiontosendbymail = $user->hasRight("commande", "creer");
348 }
349 $uploaddir = $conf->commande->multidir_output[$conf->entity];
350 $triggersendname = 'ORDER_SENTBYMAIL';
351 $year = "";
352 $month = "";
353 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
354
355 if ($massaction == 'confirm_createbills') { // Create bills from orders.
356 $orders = GETPOST('toselect', 'array');
357 $createbills_onebythird = GETPOSTINT('createbills_onebythird');
358 $validate_invoices = GETPOSTINT('validate_invoices');
359
360 $errors = array();
361
362 $TFact = array();
363 $TFactThird = array();
364 $TFactThirdNbLines = array();
365
366 $nb_bills_created = 0;
367 $lastid = 0;
368 $lastref = '';
369
370 $db->begin();
371
372 $nbOrders = is_array($orders) ? count($orders) : 1;
373
374 foreach ($orders as $id_order) {
375 $cmd = new Commande($db);
376 if ($cmd->fetch($id_order) <= 0) {
377 continue;
378 }
379 $cmd->fetch_thirdparty();
380
381 $objecttmp = new Facture($db);
382 if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) {
383 // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we reuse it.
384 $objecttmp = $TFactThird[$cmd->socid];
385 } else {
386 // If we want one invoice per order or if there is no first invoice yet for this thirdparty.
387 $objecttmp->socid = $cmd->socid;
388 $objecttmp->thirdparty = $cmd->thirdparty;
389
390 $objecttmp->type = $objecttmp::TYPE_STANDARD;
391 $objecttmp->cond_reglement_id = !empty($cmd->cond_reglement_id) ? $cmd->cond_reglement_id : $cmd->thirdparty->cond_reglement_id;
392 $objecttmp->mode_reglement_id = !empty($cmd->mode_reglement_id) ? $cmd->mode_reglement_id : $cmd->thirdparty->mode_reglement_id;
393
394 $objecttmp->fk_project = $cmd->fk_project;
395 $objecttmp->multicurrency_code = $cmd->multicurrency_code;
396 if (empty($createbills_onebythird)) {
397 $objecttmp->ref_client = $cmd->ref_client;
398 }
399
400 $datefacture = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
401 if (empty($datefacture)) {
402 $datefacture = dol_now();
403 }
404
405 $objecttmp->date = $datefacture;
406 $objecttmp->origin = 'commande';
407 $objecttmp->origin_id = $id_order;
408
409 $objecttmp->array_options = $cmd->array_options; // Copy extrafields
410
411 $res = $objecttmp->create($user);
412
413 if ($res > 0) {
414 $nb_bills_created++;
415 $lastref = $objecttmp->ref;
416 $lastid = $objecttmp->id;
417
418 $TFactThird[$cmd->socid] = $objecttmp;
419 $TFactThirdNbLines[$cmd->socid] = 0; //init nblines to have lines ordered by expedition and rang
420 } else {
421 $langs->load("errors");
422 $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]);
423 $error++;
424 }
425 }
426
427 if ($objecttmp->id > 0) {
428 $res = $objecttmp->add_object_linked($objecttmp->origin, $id_order);
429
430 if ($res == 0) {
431 $errors[] = $cmd->ref.' : '.$langs->trans($objecttmp->errors[0]);
432 $error++;
433 }
434
435 if (!$error) {
436 $lines = $cmd->lines;
437 if (empty($lines) && method_exists($cmd, 'fetch_lines')) {
438 $cmd->fetch_lines();
439 $lines = $cmd->lines;
440 }
441
442 $fk_parent_line = 0;
443 $num = count($lines);
444
445 for ($i = 0; $i < $num; $i++) {
446 $desc = ($lines[$i]->desc ? $lines[$i]->desc : '');
447 // If we build one invoice for several orders, we must put the ref of order on the invoice line
448 if (!empty($createbills_onebythird)) {
449 $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day'));
450 }
451
452 if ($lines[$i]->subprice < 0 && !getDolGlobalString('INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN')) {
453 // Negative line, we create a discount line
454 $discount = new DiscountAbsolute($db);
455 $discount->fk_soc = $objecttmp->socid;
456 $discount->socid = $objecttmp->socid;
457 $discount->amount_ht = abs($lines[$i]->total_ht);
458 $discount->amount_tva = abs($lines[$i]->total_tva);
459 $discount->amount_ttc = abs($lines[$i]->total_ttc);
460 $discount->tva_tx = $lines[$i]->tva_tx;
461 $discount->fk_user = $user->id;
462 $discount->description = $desc;
463 $discountid = $discount->create($user);
464 if ($discountid > 0) {
465 $result = $objecttmp->insert_discount($discountid);
466 //$result=$discount->link_to_invoice($lineid,$id);
467 } else {
468 setEventMessages($discount->error, $discount->errors, 'errors');
469 $error++;
470 break;
471 }
472 } else {
473 // Positive line
474 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
475 // Date start
476 $date_start = false;
477 if ($lines[$i]->date_debut_prevue) {
478 $date_start = $lines[$i]->date_debut_prevue;
479 }
480 if ($lines[$i]->date_debut_reel) {
481 $date_start = $lines[$i]->date_debut_reel;
482 }
483 if ($lines[$i]->date_start) {
484 $date_start = $lines[$i]->date_start;
485 }
486 //Date end
487 $date_end = false;
488 if ($lines[$i]->date_fin_prevue) {
489 $date_end = $lines[$i]->date_fin_prevue;
490 }
491 if ($lines[$i]->date_fin_reel) {
492 $date_end = $lines[$i]->date_fin_reel;
493 }
494 if ($lines[$i]->date_end) {
495 $date_end = $lines[$i]->date_end;
496 }
497 // Reset fk_parent_line for no child products and special product
498 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
499 $fk_parent_line = 0;
500 }
501
502 // Extrafields
503 if (method_exists($lines[$i], 'fetch_optionals')) {
504 $lines[$i]->fetch_optionals();
505 $array_options = $lines[$i]->array_options;
506 }
507
508 $objecttmp->context['createfromclone'] = 'createfromclone';
509
510 $rang = ($nbOrders > 1) ? -1 : $lines[$i]->rang;
511 //there may already be rows from previous orders
512 if (!empty($createbills_onebythird)) {
513 $TFactThirdNbLines[$cmd->socid]++;
514 $rang = $TFactThirdNbLines[$cmd->socid];
515 }
516
517 $result = $objecttmp->addline(
518 $desc,
519 $lines[$i]->subprice,
520 $lines[$i]->qty,
521 $lines[$i]->tva_tx,
522 $lines[$i]->localtax1_tx,
523 $lines[$i]->localtax2_tx,
524 $lines[$i]->fk_product,
525 $lines[$i]->remise_percent,
526 $date_start,
527 $date_end,
528 0,
529 $lines[$i]->info_bits,
530 $lines[$i]->fk_remise_except,
531 'HT',
532 0,
533 $product_type,
534 $rang,
535 $lines[$i]->special_code,
536 $objecttmp->origin,
537 $lines[$i]->rowid,
538 $fk_parent_line,
539 $lines[$i]->fk_fournprice,
540 $lines[$i]->pa_ht,
541 $lines[$i]->label,
542 $array_options,
543 100,
544 0,
545 $lines[$i]->fk_unit
546 );
547 if ($result > 0) {
548 $lineid = $result;
549 } else {
550 $lineid = 0;
551 $error++;
552 $errors[] = $objecttmp->error;
553 break;
554 }
555 // Defined the new fk_parent_line
556 if ($result > 0 && $lines[$i]->product_type == 9) {
557 $fk_parent_line = $result;
558 }
559 }
560 }
561 }
562 }
563
564 //$cmd->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module.
565
566 if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) {
567 $TFactThird[$cmd->socid] = $objecttmp;
568 } else {
569 $TFact[$objecttmp->id] = $objecttmp;
570 }
571 }
572
573 // Build doc with all invoices
574 $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird;
575 $toselect = array();
576
577 if (!$error && $validate_invoices) {
578 $massaction = $action = 'builddoc';
579
580 foreach ($TAllFact as &$objecttmp) {
581 $result = $objecttmp->validate($user);
582 if ($result <= 0) {
583 $error++;
584 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
585 break;
586 }
587
588 $id = $objecttmp->id; // For builddoc action
589
590 // Builddoc
591 $donotredirect = 1;
592 $upload_dir = $conf->facture->dir_output;
593 $permissiontoadd = $user->hasRight('facture', 'creer');
594
595 // Call action to build doc
596 $savobject = $object;
597 $object = $objecttmp;
598 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
599 $object = $savobject;
600 }
601
602 $massaction = $action = 'confirm_createbills';
603 }
604
605 if (!$error) {
606 $db->commit();
607
608 if ($nb_bills_created == 1) {
609 if (getDolGlobalInt('MAIN_MASSACTION_CREATEBILLS_REDIRECT_IF_ONE') == 1) {
610 // Redirect to generated invoice if unique
611 header('Location: '.DOL_URL_ROOT.'/compta/facture/card.php?id='.urlencode((string) $lastid));
612 exit;
613 }
614 $texttoshow = $langs->trans('BillXCreated', '{s1}');
615 $texttoshow = str_replace('{s1}', '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?id='.urlencode((string) ($lastid)).'">'.$lastref.'</a>', $texttoshow);
616 setEventMessages($texttoshow, null, 'mesgs');
617 } else {
618 if (getDolGlobalInt('MAIN_MASSACTION_CREATEBILLS_REDIRECT_IF_MANY') == 1) {
619 // Redirect to invoice list
620 header("Location: ".DOL_URL_ROOT.'/compta/facture/list.php?mainmenu=billing&leftmenu=customers_bills');
621 exit;
622 }
623 setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs');
624 }
625
626 // Make a redirect to avoid to bill twice if we make a refresh or back
627 $param = '';
628 if (!empty($mode)) {
629 $param .= '&mode='.urlencode($mode);
630 }
631 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
632 $param .= '&contextpage='.urlencode($contextpage);
633 }
634 if ($limit > 0 && $limit != $conf->liste_limit) {
635 $param .= '&limit='.((int) $limit);
636 }
637 if ($optioncss != '') {
638 $param .= '&optioncss='.urlencode($optioncss);
639 }
640 if ($search_all) {
641 $param .= '&search_all='.urlencode($search_all);
642 }
643 if ($show_files) {
644 $param .= '&show_files='.urlencode((string) ($show_files));
645 }
646 if ($socid > 0) {
647 $param .= '&socid='.urlencode((string) ($socid));
648 }
649 if ($search_status != '') {
650 $param .= '&search_status='.urlencode($search_status);
651 }
652 if ($search_option) {
653 $param .= "&search_option=".urlencode($search_option);
654 }
655 if ($search_orderday) {
656 $param .= '&search_orderday='.urlencode($search_orderday);
657 }
658 if ($search_ordermonth) {
659 $param .= '&search_ordermonth='.urlencode($search_ordermonth);
660 }
661 if ($search_orderyear) {
662 $param .= '&search_orderyear='.urlencode($search_orderyear);
663 }
664 if ($search_deliveryday) {
665 $param .= '&search_deliveryday='.urlencode($search_deliveryday);
666 }
667 if ($search_deliverymonth) {
668 $param .= '&search_deliverymonth='.urlencode($search_deliverymonth);
669 }
670 if ($search_deliveryyear) {
671 $param .= '&search_deliveryyear='.urlencode($search_deliveryyear);
672 }
673 if ($search_id) {
674 $param .= '&search_id='.urlencode((string) $search_id);
675 }
676 if ($search_ref) {
677 $param .= '&search_ref='.urlencode($search_ref);
678 }
679 if ($search_company) {
680 $param .= '&search_company='.urlencode($search_company);
681 }
682 if ($search_ref_customer) {
683 $param .= '&search_ref_customer='.urlencode($search_ref_customer);
684 }
685 if ($search_user > 0) {
686 $param .= '&search_user='.urlencode((string) ($search_user));
687 }
688 if ($search_sale > 0) {
689 $param .= '&search_sale='.urlencode((string) ($search_sale));
690 }
691 if ($search_total_ht != '') {
692 $param .= '&search_total_ht='.urlencode($search_total_ht);
693 }
694 if ($search_total_vat != '') {
695 $param .= '&search_total_vat='.urlencode($search_total_vat);
696 }
697 if ($search_total_ttc != '') {
698 $param .= '&search_total_ttc='.urlencode($search_total_ttc);
699 }
700 if ($search_project_ref >= 0) {
701 $param .= "&search_project_ref=".urlencode($search_project_ref);
702 }
703 if ($search_billed != '') {
704 $param .= '&search_billed='.urlencode($search_billed);
705 }
706
707 header("Location: ".$_SERVER['PHP_SELF'].'?'.$param);
708 exit;
709 } else {
710 $db->rollback();
711
712 $action = 'create';
713 $_GET["origin"] = $_POST["origin"]; // Keep GET and POST here ?
714 $_GET["originid"] = $_POST["originid"]; // Keep GET and POST here ?
715 if (!empty($errors)) {
716 setEventMessages(null, $errors, 'errors');
717 } else {
718 setEventMessages("Error", null, 'errors');
719 }
720 $error++;
721 }
722 }
723}
724if ($action == 'validate' && $permissiontoadd) {
725 if (GETPOST('confirm') == 'yes') {
726 $objecttmp = new $objectclass($db);
727 $db->begin();
728 $error = 0;
729 foreach ($toselect as $checked) {
730 if ($objecttmp->fetch($checked)) {
731 if ($objecttmp->statut == 0) {
732 if (!empty($objecttmp->fk_warehouse)) {
733 $idwarehouse = $objecttmp->fk_warehouse;
734 } else {
735 $idwarehouse = 0;
736 }
737 if ($objecttmp->valid($user, $idwarehouse)) {
738 setEventMessages($langs->trans('hasBeenValidated', $objecttmp->ref), null, 'mesgs');
739 } else {
740 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
741 $error++;
742 }
743 } else {
744 $langs->load("errors");
745 setEventMessages($langs->trans('ErrorIsNotADraft', $objecttmp->ref), null, 'errors');
746 $error++;
747 }
748 } else {
749 dol_print_error($db);
750 $error++;
751 }
752 }
753 if ($error) {
754 $db->rollback();
755 } else {
756 $db->commit();
757 }
758 }
759}
760if ($action == 'shipped' && $permissiontoadd) {
761 if (GETPOST('confirm') == 'yes') {
762 $objecttmp = new $objectclass($db);
763 $db->begin();
764 $error = 0;
765 foreach ($toselect as $checked) {
766 if ($objecttmp->fetch($checked)) {
767 if ($objecttmp->statut == 1 || $objecttmp->statut == 2) {
768 if ($objecttmp->cloture($user)) {
769 setEventMessages($langs->trans('StatusOrderDelivered', $objecttmp->ref), null, 'mesgs');
770 } else {
771 setEventMessages($langs->trans('ErrorOrderStatusCantBeSetToDelivered'), null, 'errors');
772 $error++;
773 }
774 } else {
775 $langs->load("errors");
776 setEventMessages($langs->trans('ErrorIsNotADraft', $objecttmp->ref), null, 'errors');
777 $error++;
778 }
779 } else {
780 dol_print_error($db);
781 $error++;
782 }
783 }
784 if ($error) {
785 $db->rollback();
786 } else {
787 $db->commit();
788 }
789 }
790}
791
792// Closed records
793if (!$error && $massaction === 'setbilled' && $permissiontoclose) {
794 $db->begin();
795
796 $objecttmp = new $objectclass($db);
797 $nbok = 0;
798 foreach ($toselect as $toselectid) {
799 $result = $objecttmp->fetch($toselectid);
800 if ($result > 0) {
801 $result = $objecttmp->classifyBilled($user, 0);
802 if ($result <= 0) {
803 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
804 $error++;
805 break;
806 } else {
807 $nbok++;
808 }
809 } else {
810 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
811 $error++;
812 break;
813 }
814 }
815
816 if (!$error) {
817 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
818 $db->commit();
819 } else {
820 $db->rollback();
821 }
822}
823
824
825/*
826 * View
827 */
828
829$form = new Form($db);
830$formother = new FormOther($db);
831$formfile = new FormFile($db);
832$formmargin = null;
833if (isModEnabled('margin')) {
834 $formmargin = new FormMargin($db);
835}
836$companystatic = new Societe($db);
837$company_url_list = array();
838$formcompany = new FormCompany($db);
839$projectstatic = new Project($db);
840
841$now = dol_now();
842
843$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
844$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
845
846$title = $langs->trans("Orders");
847$help_url = "EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
848
849// Build and execute select
850// --------------------------------------------------------------------
851$sql = 'SELECT';
852if ($search_all) {
853 $sql = 'SELECT DISTINCT';
854}
855$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,';
856$sql .= " s.parent as fk_parent,";
857$sql .= " s2.nom as name2,";
858$sql .= " typent.code as typent_code,";
859$sql .= " state.code_departement as state_code, state.nom as state_name,";
860$sql .= " country.code as country_code,";
861$sql .= ' c.rowid, c.ref, c.total_ht, c.total_tva, c.total_ttc, c.ref_client, c.fk_user_author,';
862$sql .= ' c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva as multicurrency_total_vat, c.multicurrency_total_ttc,';
863$sql .= ' c.date_valid, c.date_commande, c.note_public, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,';
864$sql .= ' c.date_creation as date_creation, c.tms as date_modification, c.date_cloture as date_cloture,';
865$sql .= ' p.rowid as project_id, p.ref as project_ref, p.title as project_label,';
866$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,';
867$sql .= ' c.fk_cond_reglement,c.deposit_percent,c.fk_mode_reglement,c.fk_shipping_method,';
868$sql .= ' c.fk_input_reason, c.import_key';
869
870// Add fields from extrafields
871if (!empty($extrafields->attributes[$object->table_element]['label'])) {
872 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
873 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
874 }
875}
876
877// Add fields from hooks
878$parameters = array();
879$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
880$sql .= $hookmanager->resPrint;
881$sql = preg_replace('/,\s*$/', '', $sql);
882
883$sqlfields = $sql; // $sql fields to remove for count total
884
885$sql .= ' FROM '.MAIN_DB_PREFIX.'societe as s';
886$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s2 ON s2.rowid = s.parent";
887$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
888$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
889$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
890$sql .= ', '.MAIN_DB_PREFIX.'commande as c';
891if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
892 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."commande_extrafields as ef on (c.rowid = ef.fk_object)";
893}
894if ($search_all) {
895 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commandedet as pd ON c.rowid=pd.fk_commande';
896}
897$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = c.fk_projet";
898$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON c.fk_user_author = u.rowid';
899// Add table from hooks
900$parameters = array();
901$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
902$sql .= $hookmanager->resPrint;
903
904$sql .= ' WHERE c.fk_soc = s.rowid';
905$sql .= ' AND c.entity IN ('.getEntity('commande').')';
906if ($socid > 0) {
907 $sql .= ' AND s.rowid = '.((int) $socid);
908}
909
910// Restriction on sale representative
911if (!$permissiontoreadallthirdparty) {
912 $sql .= " AND (EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc AND sc.fk_user = ".((int) $user->id).")";
913 if (getDolGlobalInt('MAIN_SEE_SUBORDINATES') && $userschilds) {
914 $sql .= " OR EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc AND sc.fk_user IN (".$db->sanitize(implode(',', $userschilds))."))";
915 }
916 $sql .= ")";
917}
918
919if ($search_id > 0) {
920 $sql .= natural_search('c.rowid', $search_id);
921}
922if ($search_ref) {
923 $sql .= natural_search('c.ref', $search_ref);
924}
925if ($search_ref_customer) {
926 $sql .= natural_search('c.ref_client', $search_ref_customer);
927}
928if ($search_all) {
929 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
930}
931if ($search_billed != '' && $search_billed >= 0) {
932 $sql .= ' AND c.facture = '.((int) $search_billed);
933}
934if ($search_status != '') {
935 if ($search_status <= 3 && $search_status >= -1) { // status from -1 to 3 are real status (other are virtual combination)
936 if ($search_status == 1 && !isModEnabled('shipping')) {
937 $sql .= ' AND c.fk_statut IN (1,2)'; // If module expedition disabled, we include order with status "sent" into "validated"
938 } else {
939 $sql .= ' AND c.fk_statut = '.((int) $search_status); // draft, validated, in process or canceled
940 }
941 }
942 if ($search_status == -2) { // "validated + in progress"
943 //$sql.= ' AND c.fk_statut IN (1,2,3) AND c.facture = 0';
944 $sql .= " AND (c.fk_statut IN (1,2))";
945 }
946 if ($search_status == -3) { // "validated + in progress + shipped"
947 //$sql.= ' AND c.fk_statut in (1,2,3)';
948 //$sql.= ' AND c.facture = 0'; // invoice not created
949 $sql .= ' AND (c.fk_statut IN (1,2,3))'; // validated, in process or closed
950 }
951}
952if ($search_option == 'late') {
953 $sql .= " AND c.date_commande < '".$db->idate(dol_now() - $conf->commande->client->warning_delay)."'";
954}
955if ($search_datecloture_start) {
956 $sql .= " AND c.date_cloture >= '".$db->idate($search_datecloture_start)."'";
957}
958if ($search_datecloture_end) {
959 $sql .= " AND c.date_cloture <= '".$db->idate($search_datecloture_end)."'";
960}
961if ($search_dateorder_start) {
962 $sql .= " AND c.date_commande >= '".$db->idate($search_dateorder_start)."'";
963}
964if ($search_dateorder_end) {
965 $sql .= " AND c.date_commande <= '".$db->idate($search_dateorder_end)."'";
966}
967if ($search_datedelivery_start) {
968 $sql .= " AND c.date_livraison >= '".$db->idate($search_datedelivery_start)."'";
969}
970if ($search_datedelivery_end) {
971 $sql .= " AND c.date_livraison <= '".$db->idate($search_datedelivery_end)."'";
972}
973if ($search_town) {
974 $sql .= natural_search('s.town', $search_town);
975}
976if ($search_zip) {
977 $sql .= natural_search("s.zip", $search_zip);
978}
979if ($search_state) {
980 $sql .= natural_search("state.nom", $search_state);
981}
982if ($search_country) {
983 $sql .= " AND s.fk_pays IN (".$db->sanitize($search_country).')';
984}
985if ($search_type_thirdparty && $search_type_thirdparty != '-1') {
986 $sql .= " AND s.fk_typent IN (".$db->sanitize($search_type_thirdparty).')';
987}
988if (empty($arrayfields['s.name_alias']['checked']) && $search_company) {
989 $sql .= natural_search(array("s.nom", "s.name_alias"), $search_company);
990} else {
991 if ($search_company) {
992 $sql .= natural_search('s.nom', $search_company);
993 }
994 if ($search_company_alias) {
995 $sql .= natural_search('s.name_alias', $search_company_alias);
996 }
997}
998if ($search_parent_name) {
999 $sql .= natural_search('s2.nom', $search_parent_name);
1000}
1001if ($search_total_ht != '') {
1002 $sql .= natural_search('c.total_ht', $search_total_ht, 1);
1003}
1004if ($search_total_vat != '') {
1005 $sql .= natural_search('c.total_tva', $search_total_vat, 1);
1006}
1007if ($search_total_ttc != '') {
1008 $sql .= natural_search('c.total_ttc', $search_total_ttc, 1);
1009}
1010if ($search_warehouse != '' && $search_warehouse > 0) {
1011 $sql .= natural_search('c.fk_warehouse', $search_warehouse, 1);
1012}
1013if ($search_multicurrency_code != '') {
1014 $sql .= " AND c.multicurrency_code = '".$db->escape($search_multicurrency_code)."'";
1015}
1016if ($search_multicurrency_tx != '') {
1017 $sql .= natural_search('c.multicurrency_tx', $search_multicurrency_tx, 1);
1018}
1019if ($search_multicurrency_montant_ht != '') {
1020 $sql .= natural_search('c.multicurrency_total_ht', $search_multicurrency_montant_ht, 1);
1021}
1022if ($search_multicurrency_montant_vat != '') {
1023 $sql .= natural_search('c.multicurrency_total_tva', $search_multicurrency_montant_vat, 1);
1024}
1025if ($search_multicurrency_montant_ttc != '') {
1026 $sql .= natural_search('c.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1);
1027}
1028if ($search_login) {
1029 $sql .= natural_search(array("u.login", "u.firstname", "u.lastname"), $search_login);
1030}
1031if ($search_project_ref != '') {
1032 $sql .= natural_search("p.ref", $search_project_ref);
1033}
1034if ($search_project != '') {
1035 $sql .= natural_search("p.title", $search_project);
1036}
1037if ($search_fk_cond_reglement > 0) {
1038 $sql .= " AND c.fk_cond_reglement = ".((int) $search_fk_cond_reglement);
1039}
1040if ($search_fk_shipping_method > 0) {
1041 $sql .= " AND c.fk_shipping_method = ".((int) $search_fk_shipping_method);
1042}
1043if ($search_fk_mode_reglement > 0) {
1044 $sql .= " AND c.fk_mode_reglement = ".((int) $search_fk_mode_reglement);
1045}
1046if ($search_fk_input_reason > 0) {
1047 $sql .= " AND c.fk_input_reason = ".((int) $search_fk_input_reason);
1048}
1049// Search on user
1050if ($search_user > 0) {
1051 $sql .= " AND EXISTS (";
1052 $sql .= " SELECT ec.fk_c_type_contact, ec.element_id, ec.fk_socpeople";
1053 $sql .= " FROM ".MAIN_DB_PREFIX."element_contact as ec";
1054 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."c_type_contact as tc";
1055 $sql .= " ON ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal'";
1056 $sql .= " WHERE ec.element_id = c.rowid AND ec.fk_socpeople = ".((int) $search_user).")";
1057}
1058// Search on sale representative
1059if ($search_sale && $search_sale != '-1') {
1060 if ($search_sale == -2) {
1061 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc)";
1062 } elseif ($search_sale > 0) {
1063 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
1064 }
1065}
1066// Search for tag/category ($searchCategoryCustomerList is an array of ID)
1067$searchCategoryCustomerOperator = -1;
1068$searchCategoryCustomerList = array($search_categ_cus);
1069if (!empty($searchCategoryCustomerList)) {
1070 $searchCategoryCustomerSqlList = array();
1071 $listofcategoryid = '';
1072 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
1073 if (intval($searchCategoryCustomer) == -2) {
1074 $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc)";
1075 } elseif (intval($searchCategoryCustomer) > 0) {
1076 if ($searchCategoryCustomerOperator == 0) {
1077 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie = ".((int) $searchCategoryCustomer).")";
1078 } else {
1079 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
1080 }
1081 }
1082 }
1083 if ($listofcategoryid) {
1084 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
1085 }
1086 if ($searchCategoryCustomerOperator == 1) {
1087 if (!empty($searchCategoryCustomerSqlList)) {
1088 $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
1089 }
1090 } else {
1091 if (!empty($searchCategoryCustomerSqlList)) {
1092 $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
1093 }
1094 }
1095}
1096// Search for tag/category ($searchCategoryProductList is an array of ID)
1097$searchCategoryProductOperator = -1;
1098$searchCategoryProductList = array($search_product_category);
1099if (!empty($searchCategoryProductList)) {
1100 $searchCategoryProductSqlList = array();
1101 $listofcategoryid = '';
1102 foreach ($searchCategoryProductList as $searchCategoryProduct) {
1103 if (intval($searchCategoryProduct) == -2) {
1104 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product)";
1105 } elseif (intval($searchCategoryProduct) > 0) {
1106 if ($searchCategoryProductOperator == 0) {
1107 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
1108 } else {
1109 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
1110 }
1111 }
1112 }
1113 if ($listofcategoryid) {
1114 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commandedet as cd WHERE cd.fk_commande = c.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
1115 }
1116 if ($searchCategoryProductOperator == 1) {
1117 if (!empty($searchCategoryProductSqlList)) {
1118 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
1119 }
1120 } else {
1121 if (!empty($searchCategoryProductSqlList)) {
1122 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
1123 }
1124 }
1125}
1126// Add where from extra fields
1127include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
1128// Add where from hooks
1129$parameters = array();
1130$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1131$sql .= $hookmanager->resPrint;
1132
1133// Add HAVING from hooks
1134$parameters = array();
1135$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1136$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
1137//print $sql;
1138
1139// Count total nb of records
1140$nbtotalofrecords = '';
1141if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
1142 /* The fast and low memory method to get and count full list converts the sql into a sql count */
1143 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
1144 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
1145 $resql = $db->query($sqlforcount);
1146 if ($resql) {
1147 $objforcount = $db->fetch_object($resql);
1148 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1149 } else {
1150 dol_print_error($db);
1151 }
1152
1153 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than paging size (filtering), goto and load page 0
1154 $page = 0;
1155 $offset = 0;
1156 }
1157 $db->free($resql);
1158}
1159
1160$sql .= $db->order($sortfield, $sortorder);
1161if ($limit) {
1162 $sql .= $db->plimit($limit + 1, $offset);
1163}
1164//print $sql;
1165
1166$resql = $db->query($sql);
1167if (!$resql) {
1168 dol_print_error($db);
1169 exit;
1170}
1171
1172if ($socid > 0) {
1173 $soc = new Societe($db);
1174 $soc->fetch($socid);
1175 $title = $langs->trans('CustomersOrders').' - '.$soc->name;
1176 if (empty($search_company)) {
1177 $search_company = $soc->name;
1178 }
1179} else {
1180 $title = $langs->trans('CustomersOrders');
1181}
1182if (strval($search_status) == '0') {
1183 $title .= ' - '.$langs->trans('StatusOrderDraftShort');
1184}
1185if ($search_status == 1) {
1186 $title .= ' - '.$langs->trans('StatusOrderValidatedShort');
1187}
1188if ($search_status == 2) {
1189 $title .= ' - '.$langs->trans('StatusOrderSentShort');
1190}
1191if ($search_status == 3) {
1192 $title .= ' - '.$langs->trans('StatusOrderToBillShort');
1193}
1194if ($search_status == -1) {
1195 $title .= ' - '.$langs->trans('StatusOrderCanceledShort');
1196}
1197if ($search_status == -2) {
1198 $title .= ' - '.$langs->trans('StatusOrderToProcessShort');
1199}
1200if ($search_status == -3) {
1201 $title .= ' - '.$langs->trans('StatusOrderValidated').', '.(!isModEnabled('shipping') ? '' : $langs->trans("StatusOrderSent").', ').$langs->trans('StatusOrderToBill');
1202}
1203if ($search_status == -4) {
1204 $title .= ' - '.$langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort");
1205}
1206
1207$num = $db->num_rows($resql);
1208
1209$arrayofselected = is_array($toselect) ? $toselect : array();
1210
1211if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
1212 $obj = $db->fetch_object($resql);
1213 $id = $obj->rowid;
1214 header("Location: ".DOL_URL_ROOT.'/commande/card.php?id='.$id);
1215 exit;
1216}
1217
1218// Output page
1219// --------------------------------------------------------------------
1220
1221llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-order page-list');
1222
1223$arrayofselected = is_array($toselect) ? $toselect : array();
1224
1225$param = '';
1226if (!empty($mode)) {
1227 $param .= '&mode='.urlencode($mode);
1228}
1229if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
1230 $param .= '&contextpage='.urlencode($contextpage);
1231}
1232if ($limit > 0 && $limit != $conf->liste_limit) {
1233 $param .= '&limit='.((int) $limit);
1234}
1235if ($search_all) {
1236 $param .= '&search_all='.urlencode($search_all);
1237}
1238if ($socid > 0) {
1239 $param .= '&socid='.((int) $socid);
1240}
1241if ($search_status != '') {
1242 $param .= '&search_status='.urlencode($search_status);
1243}
1244if ($search_option) {
1245 $param .= "&search_option=".urlencode($search_option);
1246}
1247if ($search_datecloture_start) {
1248 $param .= '&search_datecloture_startday='.dol_print_date($search_datecloture_start, '%d').'&search_datecloture_startmonth='.dol_print_date($search_datecloture_start, '%m').'&search_datecloture_startyear='.dol_print_date($search_datecloture_start, '%Y');
1249}
1250if ($search_datecloture_end) {
1251 $param .= '&search_datecloture_endday='.dol_print_date($search_datecloture_end, '%d').'&search_datecloture_endmonth='.dol_print_date($search_datecloture_end, '%m').'&search_datecloture_endyear='.dol_print_date($search_datecloture_end, '%Y');
1252}
1253if ($search_dateorder_start) {
1254 $param .= '&search_dateorder_start_day='.dol_print_date($search_dateorder_start, '%d').'&search_dateorder_start_month='.dol_print_date($search_dateorder_start, '%m').'&search_dateorder_start_year='.dol_print_date($search_dateorder_start, '%Y');
1255}
1256if ($search_dateorder_end) {
1257 $param .= '&search_dateorder_end_day='.dol_print_date($search_dateorder_end, '%d').'&search_dateorder_end_month='.dol_print_date($search_dateorder_end, '%m').'&search_dateorder_end_year='.dol_print_date($search_dateorder_end, '%Y');
1258}
1259if ($search_datedelivery_start) {
1260 $param .= '&search_datedelivery_start_day='.dol_print_date($search_datedelivery_start, '%d').'&search_datedelivery_start_month='.dol_print_date($search_datedelivery_start, '%m').'&search_datedelivery_start_year='.dol_print_date($search_datedelivery_start, '%Y');
1261}
1262if ($search_datedelivery_end) {
1263 $param .= '&search_datedelivery_end_day='.dol_print_date($search_datedelivery_end, '%d').'&search_datedelivery_end_month='.dol_print_date($search_datedelivery_end, '%m').'&search_datedelivery_end_year='.dol_print_date($search_datedelivery_end, '%Y');
1264}
1265if ($search_id) {
1266 $param .= '&search_id='.urlencode((string) $search_id);
1267}
1268if ($search_ref) {
1269 $param .= '&search_ref='.urlencode($search_ref);
1270}
1271if ($search_company) {
1272 $param .= '&search_company='.urlencode($search_company);
1273}
1274if ($search_company_alias) {
1275 $param .= '&search_company_alias='.urlencode($search_company_alias);
1276}
1277if ($search_parent_name != '') {
1278 $param .= '&search_parent_name='.urlencode($search_parent_name);
1279}
1280if ($search_ref_customer) {
1281 $param .= '&search_ref_customer='.urlencode($search_ref_customer);
1282}
1283if ($search_user > 0) {
1284 $param .= '&search_user='.urlencode((string) ($search_user));
1285}
1286if ($search_sale > 0) {
1287 $param .= '&search_sale='.urlencode((string) ($search_sale));
1288}
1289if ($search_total_ht != '') {
1290 $param .= '&search_total_ht='.urlencode($search_total_ht);
1291}
1292if ($search_total_vat != '') {
1293 $param .= '&search_total_vat='.urlencode($search_total_vat);
1294}
1295if ($search_total_ttc != '') {
1296 $param .= '&search_total_ttc='.urlencode($search_total_ttc);
1297}
1298if ($search_warehouse != '') {
1299 $param .= '&search_warehouse='.urlencode((string) ($search_warehouse));
1300}
1301if ($search_login) {
1302 $param .= '&search_login='.urlencode($search_login);
1303}
1304if ($search_multicurrency_code != '') {
1305 $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
1306}
1307if ($search_multicurrency_tx != '') {
1308 $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
1309}
1310if ($search_multicurrency_montant_ht != '') {
1311 $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
1312}
1313if ($search_multicurrency_montant_vat != '') {
1314 $param .= '&search_multicurrency_montant_vat='.urlencode($search_multicurrency_montant_vat);
1315}
1316if ($search_multicurrency_montant_ttc != '') {
1317 $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
1318}
1319if ($search_project_ref >= 0) {
1320 $param .= "&search_project_ref=".urlencode($search_project_ref);
1321}
1322if ($search_town != '') {
1323 $param .= '&search_town='.urlencode($search_town);
1324}
1325if ($search_zip != '') {
1326 $param .= '&search_zip='.urlencode($search_zip);
1327}
1328if ($search_state != '') {
1329 $param .= '&search_state='.urlencode($search_state);
1330}
1331if ($search_country != '') {
1332 $param .= '&search_country='.urlencode((string) ($search_country));
1333}
1334if ($search_type_thirdparty && $search_type_thirdparty != '-1') {
1335 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
1336}
1337if ($search_product_category != '') {
1338 $param .= '&search_product_category='.urlencode((string) ($search_product_category));
1339}
1340if (($search_categ_cus > 0) || ($search_categ_cus == -2)) {
1341 $param .= '&search_categ_cus='.urlencode((string) ($search_categ_cus));
1342}
1343if ($show_files) {
1344 $param .= '&show_files='.urlencode((string) ($show_files));
1345}
1346if ($optioncss != '') {
1347 $param .= '&optioncss='.urlencode($optioncss);
1348}
1349if ($search_billed != '') {
1350 $param .= '&search_billed='.urlencode($search_billed);
1351}
1352if ($search_fk_cond_reglement > 0) {
1353 $param .= '&search_fk_cond_reglement='.urlencode((string) ($search_fk_cond_reglement));
1354}
1355if ($search_fk_shipping_method > 0) {
1356 $param .= '&search_fk_shipping_method='.urlencode((string) ($search_fk_shipping_method));
1357}
1358if ($search_fk_mode_reglement > 0) {
1359 $param .= '&search_fk_mode_reglement='.urlencode((string) ($search_fk_mode_reglement));
1360}
1361if ($search_fk_input_reason > 0) {
1362 $param .= '&search_fk_input_reason='.urlencode((string) ($search_fk_input_reason));
1363}
1364
1365// Add $param from extra fields
1366include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1367
1368// Add $param from hooks
1369$parameters = array();
1370$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1371$param .= $hookmanager->resPrint;
1372
1373// List of mass actions available
1374$arrayofmassactions = array(
1375 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1376 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1377);
1378if ($permissiontovalidate) {
1379 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate");
1380}
1381if ($permissiontoclose) {
1382 $arrayofmassactions['preshipped'] = img_picto('', 'dolly', 'class="pictofixedwidth"').$langs->trans("ClassifyShipped");
1383}
1384if (isModEnabled('invoice') && $user->hasRight("facture", "creer")) {
1385 $arrayofmassactions['createbills'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisCustomer");
1386}
1387if ($permissiontoclose) {
1388 $arrayofmassactions['setbilled'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("ClassifyBilled");
1389}
1390if ($permissiontocancel) {
1391 $arrayofmassactions['cancelorders'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("CancelOrder");
1392}
1393if (!empty($permissiontodelete)) {
1394 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
1395}
1396if ($permissiontosendbymail) {
1397 $arrayofmassactions['presend'] = img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail");
1398}
1399if (in_array($massaction, array('presend', 'predelete', 'createbills'))) {
1400 $arrayofmassactions = array();
1401}
1402$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1403
1404$url = DOL_URL_ROOT.'/commande/card.php?action=create';
1405if (!empty($socid)) {
1406 $url .= '&socid='.$socid;
1407}
1408$newcardbutton = '';
1409$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'));
1410$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'));
1411$newcardbutton .= dolGetButtonTitleSeparator();
1412$newcardbutton .= dolGetButtonTitle($langs->trans('NewOrder'), '', 'fa fa-plus-circle', $url, '', ($contextpage == 'orderlist' || $contextpage == 'billableorders') && $permissiontoadd);
1413
1414// Lines of title fields
1415print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
1416if ($optioncss != '') {
1417 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1418}
1419print '<input type="hidden" name="token" value="'.newToken().'">';
1420print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1421print '<input type="hidden" name="action" value="list">';
1422print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1423print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1424print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
1425print '<input type="hidden" name="search_status" value="'.$search_status.'">';
1426print '<input type="hidden" name="socid" value="'.$socid.'">';
1427print '<input type="hidden" name="page_y" value="">';
1428print '<input type="hidden" name="mode" value="'.$mode.'">';
1429
1430
1431print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'order', 0, $newcardbutton, '', $limit, 0, 0, 1);
1432
1433$topicmail = "SendOrderRef";
1434$modelmail = "order_send";
1435$objecttmp = new Commande($db);
1436$trackid = 'ord'.$object->id;
1437include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1438
1439if ($massaction == 'prevalidate') {
1440 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1);
1441}
1442if ($massaction == 'preshipped') {
1443 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("CloseOrder"), $langs->trans("ConfirmCloseOrder"), "shipped", null, '', 0, 200, 500, 1);
1444}
1445
1446if ($massaction == 'createbills') {
1447 print '<input type="hidden" name="massaction" value="confirm_createbills">';
1448
1449 print '<table class="noborder centpercent">';
1450 print '<tr>';
1451 print '<td>';
1452 print $langs->trans('DateInvoice');
1453 print '</td>';
1454 print '<td>';
1455 print $form->selectDate('', '', 0, 0, 0, '', 1, 1);
1456 print '</td>';
1457 print '</tr>';
1458 print '<tr>';
1459 print '<td>';
1460 print $langs->trans('CreateOneBillByThird');
1461 print '</td>';
1462 print '<td>';
1463 print $form->selectyesno('createbills_onebythird', getDolGlobalString('MAIN_ORDERLIST_CREATEBILLS_ONEBYTHIRD', 'no'), 1);
1464 print '</td>';
1465 print '</tr>';
1466 print '<tr>';
1467 print '<td>';
1468 print $langs->trans('ValidateInvoices');
1469 print '</td>';
1470 print '<td>';
1471 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_BILL')) {
1472 print $form->selectyesno('validate_invoices', 0, 1, 1);
1473 $langs->load("errors");
1474 print ' ('.$langs->trans("WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal").')';
1475 } else {
1476 print $form->selectyesno('validate_invoices', 0, 1);
1477 }
1478 if (!empty($conf->workflow->enabled) && getDolGlobalString('WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER')) {
1479 print ' &nbsp; &nbsp; <span class="opacitymedium">'.$langs->trans("IfValidateInvoiceIsNoOrderStayUnbilled").'</span>';
1480 } else {
1481 print ' &nbsp; &nbsp; <span class="opacitymedium">'.$langs->trans("OptionToSetOrderBilledNotEnabled").'</span>';
1482 }
1483 print '</td>';
1484 print '</tr>';
1485 print '</table>';
1486
1487 print '<div class="center">';
1488 print '<input type="submit" class="button" id="createbills" name="createbills" value="'.$langs->trans('CreateInvoiceForThisCustomer').'"> ';
1489 print '<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1490 print '</div>';
1491 print '<br><br>';
1492}
1493
1494if ($search_all) {
1495 $setupstring = '';
1496 foreach ($fieldstosearchall as $key => $val) {
1497 $fieldstosearchall[$key] = $langs->trans($val);
1498 $setupstring .= $key."=".$val.";";
1499 }
1500 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
1501 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1502}
1503
1504$moreforfilter = '';
1505
1506// If the user can view prospects? sales other than his own
1507if ($user->hasRight("user", "user", "lire")) {
1508 $langs->load("commercial");
1509 $moreforfilter .= '<div class="divsearchfield">';
1510 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1511 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx');
1512 $moreforfilter .= '</div>';
1513}
1514// If the user can view other users
1515if ($user->hasRight("user", "user", "lire")) {
1516 $moreforfilter .= '<div class="divsearchfield">';
1517 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1518 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth250 widthcentpercentminusx');
1519 $moreforfilter .= '</div>';
1520}
1521
1522// If the user can view other products/services than his own
1523if (isModEnabled('category') && $user->hasRight("categorie", "lire") && ($user->hasRight("produit", "lire") || $user->hasRight("service", "lire"))) {
1524 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1525 $moreforfilter .= '<div class="divsearchfield">';
1526 $tmptitle = $langs->trans('IncludingProductWithTag');
1527 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
1528 $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);
1529 $moreforfilter .= '</div>';
1530}
1531// If Categories are enabled & user has rights to see
1532if (isModEnabled('category') && $user->hasRight("categorie", "lire")) {
1533 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1534 $moreforfilter .= '<div class="divsearchfield">';
1535 $tmptitle = $langs->trans('CustomersProspectsCategoriesShort');
1536 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $tmptitle, 'maxwidth300 widthcentpercentminusx');
1537 $moreforfilter .= '</div>';
1538}
1539// If Stock is enabled
1540if (isModEnabled('stock') && getDolGlobalString('WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER')) {
1541 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
1542 $formproduct = new FormProduct($db);
1543 $moreforfilter .= '<div class="divsearchfield">';
1544 $tmptitle = $langs->trans('Warehouse');
1545 $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', 1, 0, 0, $tmptitle, 0, 0, array(), 'maxwidth250 widthcentpercentminusx');
1546 $moreforfilter .= '</div>';
1547}
1548
1549$parameters = array();
1550$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1551if (empty($reshook)) {
1552 $moreforfilter .= $hookmanager->resPrint;
1553} else {
1554 $moreforfilter = $hookmanager->resPrint;
1555}
1556
1557if (!empty($moreforfilter)) {
1558 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1559 print $moreforfilter;
1560 print '</div>';
1561}
1562
1563$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1564$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
1565$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
1566$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
1567
1568if (GETPOSTINT('autoselectall')) {
1569 $selectedfields .= '<script>';
1570 $selectedfields .= ' $(document).ready(function() {';
1571 $selectedfields .= ' console.log("Autoclick on checkforselects");';
1572 $selectedfields .= ' $("#checkforselects").click();';
1573 $selectedfields .= ' $("#massaction").val("createbills").change();';
1574 $selectedfields .= ' });';
1575 $selectedfields .= '</script>';
1576}
1577
1578print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
1579print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1580
1581// Fields title search
1582// --------------------------------------------------------------------
1583print '<tr class="liste_titre_filter">';
1584// Action column
1585if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1586 print '<td class="liste_titre center maxwidthsearch">';
1587 $searchpicto = $form->showFilterButtons('left');
1588 print $searchpicto;
1589 print '</td>';
1590}
1591
1592// Line numbering
1593if (!empty($arrayfields['c.rowid']['checked'])) {
1594 print '<td class="liste_titre">';
1595 print '<input class="flat" size="6" type="text" name="search_id" value="'.dol_escape_htmltag($search_id).'">';
1596 print '</td>';
1597}
1598
1599// Ref
1600if (!empty($arrayfields['c.ref']['checked'])) {
1601 print '<td class="liste_titre">';
1602 print '<input class="flat" size="6" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
1603 print '</td>';
1604}
1605// Ref customer
1606if (!empty($arrayfields['c.ref_client']['checked'])) {
1607 print '<td class="liste_titre" align="left">';
1608 print '<input class="flat" type="text" size="6" name="search_ref_customer" value="'.dol_escape_htmltag($search_ref_customer).'">';
1609 print '</td>';
1610}
1611// Project ref
1612if (!empty($arrayfields['p.ref']['checked'])) {
1613 print '<td class="liste_titre"><input type="text" class="flat" size="6" name="search_project_ref" value="'.dol_escape_htmltag($search_project_ref).'"></td>';
1614}
1615// Project title
1616if (!empty($arrayfields['p.title']['checked'])) {
1617 print '<td class="liste_titre"><input type="text" class="flat" size="6" name="search_project" value="'.dol_escape_htmltag($search_project).'"></td>';
1618}
1619// Thirpdarty
1620if (!empty($arrayfields['s.nom']['checked'])) {
1621 print '<td class="liste_titre" align="left">';
1622 print '<input class="flat maxwidth100" type="text" name="search_company" value="'.dol_escape_htmltag($search_company).'">';
1623 print '</td>';
1624}
1625// Alias
1626if (!empty($arrayfields['s.name_alias']['checked'])) {
1627 print '<td class="liste_titre" align="left">';
1628 print '<input class="flat maxwidth100" type="text" name="search_company_alias" value="'.dol_escape_htmltag($search_company_alias).'">';
1629 print '</td>';
1630}
1631// Parent company
1632if (!empty($arrayfields['s2.nom']['checked'])) {
1633 print '<td class="liste_titre">';
1634 print '<input class="flat maxwidth100" type="text" name="search_parent_name" value="'.dol_escape_htmltag($search_parent_name).'">';
1635 print '</td>';
1636}
1637// Town
1638if (!empty($arrayfields['s.town']['checked'])) {
1639 print '<td class="liste_titre"><input class="flat width50" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'"></td>';
1640}
1641// Zip
1642if (!empty($arrayfields['s.zip']['checked'])) {
1643 print '<td class="liste_titre"><input class="flat width50" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'"></td>';
1644}
1645// State
1646if (!empty($arrayfields['state.nom']['checked'])) {
1647 print '<td class="liste_titre">';
1648 print '<input class="flat width50" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1649 print '</td>';
1650}
1651// Country
1652if (!empty($arrayfields['country.code_iso']['checked'])) {
1653 print '<td class="liste_titre" align="center">';
1654 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1655 print '</td>';
1656}
1657// Company type
1658if (!empty($arrayfields['typent.code']['checked'])) {
1659 print '<td class="liste_titre maxwidthonsmartphone" align="center">';
1660 print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (!getDolGlobalString('SOCIETE_SORT_ON_TYPEENT') ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1);
1661 print '</td>';
1662}
1663// Date order
1664if (!empty($arrayfields['c.date_commande']['checked'])) {
1665 print '<td class="liste_titre center">';
1666 print '<div class="nowrapfordate">';
1667 print $form->selectDate($search_dateorder_start ? $search_dateorder_start : -1, 'search_dateorder_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1668 print '</div>';
1669 print '<div class="nowrapfordate">';
1670 print $form->selectDate($search_dateorder_end ? $search_dateorder_end : -1, 'search_dateorder_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1671 print '</div>';
1672 print '</td>';
1673}
1674if (!empty($arrayfields['c.date_delivery']['checked'])) {
1675 print '<td class="liste_titre center">';
1676 print '<div class="nowrapfordate">';
1677 print $form->selectDate($search_datedelivery_start ? $search_datedelivery_start : -1, 'search_datedelivery_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1678 print '</div>';
1679 print '<div class="nowrapfordate">';
1680 print $form->selectDate($search_datedelivery_end ? $search_datedelivery_end : -1, 'search_datedelivery_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1681 print '</div>';
1682 print '</td>';
1683}
1684// Shipping Method
1685if (!empty($arrayfields['c.fk_shipping_method']['checked'])) {
1686 print '<td class="liste_titre">';
1687 $form->selectShippingMethod($search_fk_shipping_method, 'search_fk_shipping_method', '', 1, '', 1);
1688 print '</td>';
1689}
1690// Payment term
1691if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) {
1692 print '<td class="liste_titre">';
1693 print $form->getSelectConditionsPaiements($search_fk_cond_reglement, 'search_fk_cond_reglement', 1, 1, 1);
1694 print '</td>';
1695}
1696// Payment mode
1697if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) {
1698 print '<td class="liste_titre">';
1699 print $form->select_types_paiements($search_fk_mode_reglement, 'search_fk_mode_reglement', '', 0, 1, 1, 0, -1, '', 1);
1700 print '</td>';
1701}
1702// Channel
1703if (!empty($arrayfields['c.fk_input_reason']['checked'])) {
1704 print '<td class="liste_titre">';
1705 $form->selectInputReason($search_fk_input_reason, 'search_fk_input_reason', '', 1, '', 1);
1706 print '</td>';
1707}
1708// Amount HT / net
1709if (!empty($arrayfields['c.total_ht']['checked'])) {
1710 print '<td class="liste_titre right">';
1711 print '<input class="flat" type="text" size="4" name="search_total_ht" value="'.dol_escape_htmltag($search_total_ht).'">';
1712 print '</td>';
1713}
1714// Amount of VAT
1715if (!empty($arrayfields['c.total_vat']['checked'])) {
1716 print '<td class="liste_titre right">';
1717 print '<input class="flat" type="text" size="4" name="search_total_vat" value="'.dol_escape_htmltag($search_total_vat).'">';
1718 print '</td>';
1719}
1720// Total Amount (TTC / gross)
1721if (!empty($arrayfields['c.total_ttc']['checked'])) {
1722 print '<td class="liste_titre right">';
1723 print '<input class="flat" type="text" size="5" name="search_total_ttc" value="'.$search_total_ttc.'">';
1724 print '</td>';
1725}
1726// Currency
1727if (!empty($arrayfields['c.multicurrency_code']['checked'])) {
1728 print '<td class="liste_titre">';
1729 print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
1730 print '</td>';
1731}
1732// Currency rate
1733if (!empty($arrayfields['c.multicurrency_tx']['checked'])) {
1734 print '<td class="liste_titre">';
1735 print '<input class="flat" type="text" size="4" name="search_multicurrency_tx" value="'.dol_escape_htmltag($search_multicurrency_tx).'">';
1736 print '</td>';
1737}
1738// Amount HT/net in foreign currency
1739if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) {
1740 print '<td class="liste_titre right">';
1741 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ht" value="'.dol_escape_htmltag($search_multicurrency_montant_ht).'">';
1742 print '</td>';
1743}
1744// VAT in foreign currency
1745if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) {
1746 print '<td class="liste_titre right">';
1747 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_vat" value="'.dol_escape_htmltag($search_multicurrency_montant_vat).'">';
1748 print '</td>';
1749}
1750// Amount/Total (TTC / gross) in foreign currency
1751if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) {
1752 print '<td class="liste_titre right">';
1753 print '<input class="flat width75" type="text" name="search_multicurrency_montant_ttc" value="'.dol_escape_htmltag($search_multicurrency_montant_ttc).'">';
1754 print '</td>';
1755}
1756// Author
1757if (!empty($arrayfields['u.login']['checked'])) {
1758 print '<td class="liste_titre">';
1759 print '<input class="flat width75" type="text" name="search_login" value="'.dol_escape_htmltag($search_login).'">';
1760 print '</td>';
1761}
1762// Sales Representative
1763if (!empty($arrayfields['sale_representative']['checked'])) {
1764 print '<td class="liste_titre"></td>';
1765}
1766if (!empty($arrayfields['total_pa']['checked'])) {
1767 print '<td class="liste_titre right">';
1768 print '</td>';
1769}
1770if (!empty($arrayfields['total_margin']['checked'])) {
1771 print '<td class="liste_titre right">';
1772 print '</td>';
1773}
1774if (!empty($arrayfields['total_margin_rate']['checked'])) {
1775 print '<td class="liste_titre right">';
1776 print '</td>';
1777}
1778if (!empty($arrayfields['total_mark_rate']['checked'])) {
1779 print '<td class="liste_titre right">';
1780 print '</td>';
1781}
1782
1783// Date creation
1784if (!empty($arrayfields['c.datec']['checked'])) {
1785 print '<td class="liste_titre">';
1786 print '</td>';
1787}
1788// Date modification
1789if (!empty($arrayfields['c.tms']['checked'])) {
1790 print '<td class="liste_titre">';
1791 print '</td>';
1792}
1793// Date cloture
1794if (!empty($arrayfields['c.date_cloture']['checked'])) {
1795 print '<td class="liste_titre center">';
1796 print '<div class="nowrapfordate">';
1797 print $form->selectDate($search_datecloture_start ? $search_datecloture_start : -1, 'search_datecloture_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1798 print '</div>';
1799 print '<div class="nowrapfordate">';
1800 print $form->selectDate($search_datecloture_end ? $search_datecloture_end : -1, 'search_datecloture_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1801 print '</div>';
1802 print '</td>';
1803}
1804// Note public
1805if (!empty($arrayfields['c.note_public']['checked'])) {
1806 print '<td class="liste_titre">';
1807 print '</td>';
1808}
1809// Note private
1810if (!empty($arrayfields['c.note_private']['checked'])) {
1811 print '<td class="liste_titre">';
1812 print '</td>';
1813}
1814// Shippable
1815if (!empty($arrayfields['shippable']['checked'])) {
1816 print '<td class="liste_titre maxwidthonsmartphone" align="center">';
1817 //print $form->selectyesno('search_shippable', $search_shippable, 1, 0, 1, 1);
1818 if (getDolGlobalString('ORDER_SHIPABLE_STATUS_DISABLED_BY_DEFAULT')) {
1819 print '<input type="checkbox" name="show_shippable_command" value="1"'.($show_shippable_command ? ' checked' : '').'>';
1820 print $langs->trans('ShowShippableStatus');
1821 } else {
1822 $show_shippable_command = 1;
1823 }
1824 print '</td>';
1825}
1826
1827// Extra fields
1828include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1829
1830// Fields from hook
1831$parameters = array('arrayfields' => $arrayfields);
1832$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1833print $hookmanager->resPrint;
1834
1835// Status billed
1836if (!empty($arrayfields['c.facture']['checked'])) {
1837 print '<td class="liste_titre maxwidthonsmartphone center">';
1838 print $form->selectyesno('search_billed', $search_billed, 1, 0, 1, 1);
1839 print '</td>';
1840}
1841
1842// Import key
1843if (!empty($arrayfields['c.import_key']['checked'])) {
1844 print '<td class="liste_titre maxwidthonsmartphone center">';
1845 print '</td>';
1846}
1847
1848// Status
1849if (!empty($arrayfields['c.fk_statut']['checked'])) {
1850 print '<td class="liste_titre center parentonrightofpage">';
1851 $liststatus = array(
1852 Commande::STATUS_DRAFT => $langs->trans("StatusOrderDraftShort"),
1853 Commande::STATUS_VALIDATED => $langs->trans("StatusOrderValidated"),
1854 Commande::STATUS_SHIPMENTONPROCESS => $langs->trans("StatusOrderSentShort"),
1855 -2 => $langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort"),
1856 -3 => $langs->trans("StatusOrderValidatedShort").'+'.$langs->trans("StatusOrderSentShort").'+'.$langs->trans("StatusOrderDelivered"),
1857 Commande::STATUS_CLOSED => $langs->trans("StatusOrderDelivered"),
1858 Commande::STATUS_CANCELED => $langs->trans("StatusOrderCanceledShort")
1859 );
1860 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1861 print $form->selectarray('search_status', $liststatus, $search_status, -5, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage', 1);
1862 print '</td>';
1863}
1864// Action column
1865if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1866 print '<td class="liste_titre center maxwidthsearch">';
1867 $searchpicto = $form->showFilterButtons();
1868 print $searchpicto;
1869 print '</td>';
1870}
1871print '</tr>'."\n";
1872
1873$totalarray = array(
1874 'nbfield' => 0,
1875 'val' => array(
1876 'c.total_ht' => 0,
1877 'c.total_tva' => 0,
1878 'c.total_ttc' => 0,
1879 ),
1880 'pos' => array(),
1881);
1882
1883
1884// Fields title label
1885// --------------------------------------------------------------------
1886print '<tr class="liste_titre">';
1887
1888// Action column
1889if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1890 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center ');
1891 $totalarray['nbfield']++;
1892}
1893if (!empty($arrayfields['c.rowid']['checked'])) {
1894 print_liste_field_titre($arrayfields['c.rowid']['label'], $_SERVER["PHP_SELF"], 'c.rowid', '', $param, '', $sortfield, $sortorder, 'center ');
1895 $totalarray['nbfield']++;
1896}
1897if (!empty($arrayfields['c.ref']['checked'])) {
1898 print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder);
1899 $totalarray['nbfield']++;
1900}
1901if (!empty($arrayfields['c.ref_client']['checked'])) {
1902 print_liste_field_titre($arrayfields['c.ref_client']['label'], $_SERVER["PHP_SELF"], 'c.ref_client', '', $param, '', $sortfield, $sortorder);
1903 $totalarray['nbfield']++;
1904}
1905if (!empty($arrayfields['p.ref']['checked'])) {
1906 print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
1907 $totalarray['nbfield']++;
1908}
1909if (!empty($arrayfields['p.title']['checked'])) {
1910 print_liste_field_titre($arrayfields['p.title']['label'], $_SERVER["PHP_SELF"], "p.title", "", $param, '', $sortfield, $sortorder);
1911 $totalarray['nbfield']++;
1912}
1913if (!empty($arrayfields['s.nom']['checked'])) {
1914 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], 's.nom', '', $param, '', $sortfield, $sortorder);
1915 $totalarray['nbfield']++;
1916}
1917if (!empty($arrayfields['s.name_alias']['checked'])) {
1918 print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], 's.name_alias', '', $param, '', $sortfield, $sortorder);
1919 $totalarray['nbfield']++;
1920}
1921if (!empty($arrayfields['s2.nom']['checked'])) {
1922 print_liste_field_titre($arrayfields['s2.nom']['label'], $_SERVER['PHP_SELF'], 's2.nom', '', $param, '', $sortfield, $sortorder);
1923 $totalarray['nbfield']++;
1924}
1925if (!empty($arrayfields['s.town']['checked'])) {
1926 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1927 $totalarray['nbfield']++;
1928}
1929if (!empty($arrayfields['s.zip']['checked'])) {
1930 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1931 $totalarray['nbfield']++;
1932}
1933if (!empty($arrayfields['state.nom']['checked'])) {
1934 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1935 $totalarray['nbfield']++;
1936}
1937if (!empty($arrayfields['country.code_iso']['checked'])) {
1938 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1939 $totalarray['nbfield']++;
1940}
1941if (!empty($arrayfields['typent.code']['checked'])) {
1942 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1943 $totalarray['nbfield']++;
1944}
1945if (!empty($arrayfields['c.date_commande']['checked'])) {
1946 print_liste_field_titre($arrayfields['c.date_commande']['label'], $_SERVER["PHP_SELF"], 'c.date_commande', '', $param, '', $sortfield, $sortorder, 'center ');
1947 $totalarray['nbfield']++;
1948}
1949if (!empty($arrayfields['c.date_delivery']['checked'])) {
1950 print_liste_field_titre($arrayfields['c.date_delivery']['label'], $_SERVER["PHP_SELF"], 'c.date_livraison', '', $param, '', $sortfield, $sortorder, 'center ');
1951 $totalarray['nbfield']++;
1952}
1953if (!empty($arrayfields['c.fk_shipping_method']['checked'])) {
1954 print_liste_field_titre($arrayfields['c.fk_shipping_method']['label'], $_SERVER["PHP_SELF"], "c.fk_shipping_method", "", $param, '', $sortfield, $sortorder);
1955 $totalarray['nbfield']++;
1956}
1957if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) {
1958 print_liste_field_titre($arrayfields['c.fk_cond_reglement']['label'], $_SERVER["PHP_SELF"], "c.fk_cond_reglement", "", $param, '', $sortfield, $sortorder);
1959 $totalarray['nbfield']++;
1960}
1961if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) {
1962 print_liste_field_titre($arrayfields['c.fk_mode_reglement']['label'], $_SERVER["PHP_SELF"], "c.fk_mode_reglement", "", $param, '', $sortfield, $sortorder);
1963 $totalarray['nbfield']++;
1964}
1965if (!empty($arrayfields['c.fk_input_reason']['checked'])) {
1966 print_liste_field_titre($arrayfields['c.fk_input_reason']['label'], $_SERVER["PHP_SELF"], "c.fk_input_reason", "", $param, '', $sortfield, $sortorder);
1967 $totalarray['nbfield']++;
1968}
1969if (!empty($arrayfields['c.total_ht']['checked'])) {
1970 print_liste_field_titre($arrayfields['c.total_ht']['label'], $_SERVER["PHP_SELF"], 'c.total_ht', '', $param, '', $sortfield, $sortorder, 'right ');
1971 $totalarray['nbfield']++;
1972}
1973if (!empty($arrayfields['c.total_vat']['checked'])) {
1974 print_liste_field_titre($arrayfields['c.total_vat']['label'], $_SERVER["PHP_SELF"], 'c.total_tva', '', $param, '', $sortfield, $sortorder, 'right ');
1975 $totalarray['nbfield']++;
1976}
1977if (!empty($arrayfields['c.total_ttc']['checked'])) {
1978 print_liste_field_titre($arrayfields['c.total_ttc']['label'], $_SERVER["PHP_SELF"], 'c.total_ttc', '', $param, '', $sortfield, $sortorder, 'right ');
1979 $totalarray['nbfield']++;
1980}
1981if (!empty($arrayfields['c.multicurrency_code']['checked'])) {
1982 print_liste_field_titre($arrayfields['c.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_code', '', $param, '', $sortfield, $sortorder);
1983 $totalarray['nbfield']++;
1984}
1985if (!empty($arrayfields['c.multicurrency_tx']['checked'])) {
1986 print_liste_field_titre($arrayfields['c.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
1987 $totalarray['nbfield']++;
1988}
1989if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) {
1990 print_liste_field_titre($arrayfields['c.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder);
1991 $totalarray['nbfield']++;
1992}
1993if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) {
1994 print_liste_field_titre($arrayfields['c.multicurrency_total_vat']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder);
1995 $totalarray['nbfield']++;
1996}
1997if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) {
1998 print_liste_field_titre($arrayfields['c.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'c.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder);
1999 $totalarray['nbfield']++;
2000}
2001if (!empty($arrayfields['u.login']['checked'])) {
2002 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, '', $sortfield, $sortorder);
2003 $totalarray['nbfield']++;
2004}
2005if (!empty($arrayfields['sale_representative']['checked'])) {
2006 print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder);
2007 $totalarray['nbfield']++;
2008}
2009if (!empty($arrayfields['total_pa']['checked'])) {
2010 print_liste_field_titre($arrayfields['total_pa']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
2011 $totalarray['nbfield']++;
2012}
2013if (!empty($arrayfields['total_margin']['checked'])) {
2014 print_liste_field_titre($arrayfields['total_margin']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
2015 $totalarray['nbfield']++;
2016}
2017if (!empty($arrayfields['total_margin_rate']['checked'])) {
2018 print_liste_field_titre($arrayfields['total_margin_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
2019 $totalarray['nbfield']++;
2020}
2021if (!empty($arrayfields['total_mark_rate']['checked'])) {
2022 print_liste_field_titre($arrayfields['total_mark_rate']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder);
2023 $totalarray['nbfield']++;
2024}
2025
2026if (!empty($arrayfields['c.datec']['checked'])) {
2027 print_liste_field_titre($arrayfields['c.datec']['label'], $_SERVER["PHP_SELF"], "c.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
2028 $totalarray['nbfield']++;
2029}
2030if (!empty($arrayfields['c.tms']['checked'])) {
2031 print_liste_field_titre($arrayfields['c.tms']['label'], $_SERVER["PHP_SELF"], "c.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
2032 $totalarray['nbfield']++;
2033}
2034if (!empty($arrayfields['c.date_cloture']['checked'])) {
2035 print_liste_field_titre($arrayfields['c.date_cloture']['label'], $_SERVER["PHP_SELF"], "c.date_cloture", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
2036 $totalarray['nbfield']++;
2037}
2038if (!empty($arrayfields['c.note_public']['checked'])) {
2039 print_liste_field_titre($arrayfields['c.note_public']['label'], $_SERVER["PHP_SELF"], "c.note_public", "", $param, '', $sortfield, $sortorder, 'right ');
2040 $totalarray['nbfield']++;
2041}
2042if (!empty($arrayfields['c.note_private']['checked'])) {
2043 print_liste_field_titre($arrayfields['c.note_private']['label'], $_SERVER["PHP_SELF"], "c.note_private", "", $param, '', $sortfield, $sortorder, 'right ');
2044 $totalarray['nbfield']++;
2045}
2046if (!empty($arrayfields['shippable']['checked'])) {
2047 print_liste_field_titre($arrayfields['shippable']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'center ');
2048 $totalarray['nbfield']++;
2049}
2050// Extra fields
2051include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
2052
2053// Hook fields
2054$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
2055$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2056print $hookmanager->resPrint;
2057
2058if (!empty($arrayfields['c.facture']['checked'])) {
2059 print_liste_field_titre($arrayfields['c.facture']['label'], $_SERVER["PHP_SELF"], 'c.facture', '', $param, '', $sortfield, $sortorder, 'center ');
2060 $totalarray['nbfield']++;
2061}
2062if (!empty($arrayfields['c.import_key']['checked'])) {
2063 print_liste_field_titre($arrayfields['c.import_key']['label'], $_SERVER["PHP_SELF"], "c.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
2064 $totalarray['nbfield']++;
2065}
2066if (!empty($arrayfields['c.fk_statut']['checked'])) {
2067 print_liste_field_titre($arrayfields['c.fk_statut']['label'], $_SERVER["PHP_SELF"], "c.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
2068 $totalarray['nbfield']++;
2069}
2070// Action column
2071if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2072 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', $param, '', $sortfield, $sortorder, 'maxwidthsearch center ');
2073 $totalarray['nbfield']++;
2074}
2075print '</tr>'."\n";
2076
2077$total = 0;
2078$subtotal = 0;
2079$productstat_cache = array();
2080$productstat_cachevirtual = array();
2081$getNomUrl_cache = array();
2082
2083$generic_commande = new Commande($db);
2084$generic_product = new Product($db);
2085$userstatic = new User($db);
2086
2087$with_margin_info = false;
2088if (isModEnabled('margin') && (
2089 !empty($arrayfields['total_pa']['checked'])
2090 || !empty($arrayfields['total_margin']['checked'])
2091 || !empty($arrayfields['total_margin_rate']['checked'])
2092 || !empty($arrayfields['total_mark_rate']['checked'])
2093)
2094) {
2095 $with_margin_info = true;
2096}
2097
2098$total_ht = 0;
2099$total_margin = 0;
2100
2101// Loop on record
2102// --------------------------------------------------------------------
2103$i = 0;
2104$savnbfield = $totalarray['nbfield'];
2105$totalarray = array();
2106$totalarray['nbfield'] = 0;
2107$imaxinloop = ($limit ? min($num, $limit) : $num);
2108while ($i < $imaxinloop) {
2109 $obj = $db->fetch_object($resql);
2110 if (empty($obj)) {
2111 break; // Should not happen
2112 }
2113
2114 $notshippable = 0;
2115 $warning = 0;
2116 $text_info = '';
2117 $text_warning = '';
2118 $nbprod = 0;
2119
2120 $companystatic->id = $obj->socid;
2121 $companystatic->name = $obj->name;
2122 $companystatic->name_alias = $obj->alias;
2123 $companystatic->client = $obj->client;
2124 $companystatic->fournisseur = $obj->fournisseur;
2125 $companystatic->code_client = $obj->code_client;
2126 $companystatic->email = $obj->email;
2127 $companystatic->phone = $obj->phone;
2128 $companystatic->address = $obj->address;
2129 $companystatic->zip = $obj->zip;
2130 $companystatic->town = $obj->town;
2131 $companystatic->country_code = $obj->country_code;
2132 if (!isset($getNomUrl_cache[$obj->socid])) {
2133 $getNomUrl_cache[$obj->socid] = $companystatic->getNomUrl(1, 'customer', 100, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
2134 }
2135
2136 $generic_commande->id = $obj->rowid;
2137 $generic_commande->ref = $obj->ref;
2138 $generic_commande->statut = $obj->fk_statut;
2139 $generic_commande->billed = $obj->billed;
2140 $generic_commande->date = $db->jdate($obj->date_commande);
2141 $generic_commande->delivery_date = $db->jdate($obj->date_delivery);
2142 $generic_commande->ref_client = $obj->ref_client;
2143 $generic_commande->total_ht = $obj->total_ht;
2144 $generic_commande->total_tva = $obj->total_tva;
2145 $generic_commande->total_ttc = $obj->total_ttc;
2146 $generic_commande->note_public = $obj->note_public;
2147 $generic_commande->note_private = $obj->note_private;
2148
2149 $generic_commande->thirdparty = $companystatic;
2150
2151
2152 $projectstatic->id = $obj->project_id;
2153 $projectstatic->ref = $obj->project_ref;
2154 $projectstatic->title = $obj->project_label;
2155
2156 $marginInfo = array();
2157 if ($with_margin_info === true) {
2158 $generic_commande->fetch_lines();
2159 $marginInfo = $formmargin->getMarginInfosArray($generic_commande);
2160 $total_ht += $obj->total_ht;
2161 $total_margin += $marginInfo['total_margin'];
2162 }
2163
2164 if ($mode == 'kanban') {
2165 if ($i == 0) {
2166 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
2167 print '<div class="box-flex-container kanban">';
2168 }
2169
2170 // Output Kanban
2171 $selected = -1;
2172 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2173 $selected = 0;
2174 if (in_array($object->id, $arrayofselected)) {
2175 $selected = 1;
2176 }
2177 }
2178 print $generic_commande->getKanbanView('', array('selected' => $selected));
2179 if ($i == ($imaxinloop - 1)) {
2180 print '</div>';
2181 print '</td></tr>';
2182 }
2183 } else {
2184 // Show line of result
2185 $j = 0;
2186 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
2187
2188 // Action column
2189 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2190 print '<td class="nowrap center">';
2191 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2192 $selected = 0;
2193 if (in_array($obj->rowid, $arrayofselected)) {
2194 $selected = 1;
2195 }
2196 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
2197 }
2198 print '</td>';
2199 if (!$i) {
2200 $totalarray['nbfield']++;
2201 }
2202 }
2203
2204 // Technical ID
2205 if (!empty($arrayfields['c.rowid']['checked'])) {
2206 print '<td class="center" data-key="id">'.$obj->rowid.'</td>';
2207 if (!$i) {
2208 $totalarray['nbfield']++;
2209 }
2210 }
2211
2212 // Ref
2213 if (!empty($arrayfields['c.ref']['checked'])) {
2214 print '<td class="nowraponall">';
2215 $getNomUrlOption = $search_status != 2 ? 0 : $obj->fk_statut;
2216 if (getDolGlobalInt('MAIN_LIST_ORDER_LINK_DONT_USE_STATUS')) {
2217 // TODO : This hidden conf must be added to the user's individual conf.
2218 // The user must be able to manage this behavior to adapt it to his use of the software, because depending on the employee's workstation, his use differs.
2219 // This hidden configuration ensures that users are not confused by keeping the same behavior of click, whatever the current filter.
2220 // If the aim is to use a different url when the filter is applied via the link in the left-hand menu, then this detection should be adapted instead.
2221 $getNomUrlOption = '';
2222 }
2223 print $generic_commande->getNomUrl(1, $getNomUrlOption, 0, 0, 0, 1, 1);
2224
2225 $filename = dol_sanitizeFileName($obj->ref);
2226 $filedir = $conf->commande->multidir_output[$conf->entity].'/'.dol_sanitizeFileName($obj->ref);
2227 $urlsource = $_SERVER['PHP_SELF'].'?id='.$obj->rowid;
2228 print $formfile->getDocumentsLink($generic_commande->element, $filename, $filedir);
2229
2230 print '</td>';
2231 if (!$i) {
2232 $totalarray['nbfield']++;
2233 }
2234 }
2235
2236 // Ref customer
2237 if (!empty($arrayfields['c.ref_client']['checked'])) {
2238 print '<td class="nowrap tdoverflowmax150" title="'.dol_escape_htmltag($obj->ref_client).'">';
2239 print dol_escape_htmltag($obj->ref_client);
2240 print '</td>';
2241 if (!$i) {
2242 $totalarray['nbfield']++;
2243 }
2244 }
2245
2246 // Project ref
2247 if (!empty($arrayfields['p.ref']['checked'])) {
2248 print '<td class="nowrap">';
2249 if ($obj->project_id > 0) {
2250 print $projectstatic->getNomUrl(1);
2251 }
2252 print '</td>';
2253 if (!$i) {
2254 $totalarray['nbfield']++;
2255 }
2256 }
2257
2258 // Project label
2259 if (!empty($arrayfields['p.title']['checked'])) {
2260 print '<td class="nowrap">';
2261 if ($obj->project_id > 0) {
2262 print $projectstatic->title;
2263 }
2264 print '</td>';
2265 if (!$i) {
2266 $totalarray['nbfield']++;
2267 }
2268 }
2269
2270 // Third party
2271 if (!empty($arrayfields['s.nom']['checked'])) {
2272 print '<td class="tdoverflowmax150">';
2273 if (getDolGlobalInt('MAIN_ENABLE_AJAX_TOOLTIP')) {
2274 print $companystatic->getNomUrl(1, 'customer', 100, 0, 1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
2275 } else {
2276 print $getNomUrl_cache[$obj->socid];
2277 }
2278
2279 // If module invoices enabled and user with invoice creation permissions
2280 if (isModEnabled('invoice') && getDolGlobalString('ORDER_BILLING_ALL_CUSTOMER')) {
2281 if ($user->hasRight('facture', 'creer')) {
2282 if (($obj->fk_statut > 0 && $obj->fk_statut < 3) || ($obj->fk_statut == 3 && $obj->billed == 0)) {
2283 print '&nbsp;<a href="'.DOL_URL_ROOT.'/commande/list.php?socid='.$companystatic->id.'&search_billed=0&autoselectall=1">';
2284 print img_picto($langs->trans("CreateInvoiceForThisCustomer").' : '.$companystatic->name, 'object_bill', 'hideonsmartphone').'</a>';
2285 }
2286 }
2287 }
2288 print '</td>';
2289 if (!$i) {
2290 $totalarray['nbfield']++;
2291 }
2292 }
2293
2294 // Alias name
2295 if (!empty($arrayfields['s.name_alias']['checked'])) {
2296 print '<td class="nocellnopadd tdoverflowmax100" title="'.dolPrintHTMLForTextArea($obj->alias).'">';
2297 print dolPrintLabel($obj->alias);
2298 print '</td>';
2299 if (!$i) {
2300 $totalarray['nbfield']++;
2301 }
2302 }
2303
2304 // Parent company
2305 if (!empty($arrayfields['s2.nom']['checked'])) {
2306 print '<td class="tdoverflowmax200">';
2307 if ($obj->fk_parent > 0) {
2308 if (!isset($company_url_list[$obj->fk_parent])) {
2309 $companyparent = new Societe($db);
2310 $res = $companyparent->fetch($obj->fk_parent);
2311 if ($res > 0) {
2312 $company_url_list[$obj->fk_parent] = $companyparent->getNomUrl(1);
2313 }
2314 }
2315 if (isset($company_url_list[$obj->fk_parent])) {
2316 print $company_url_list[$obj->fk_parent];
2317 }
2318 }
2319 print "</td>";
2320 if (!$i) {
2321 $totalarray['nbfield']++;
2322 }
2323 }
2324
2325 // Town
2326 if (!empty($arrayfields['s.town']['checked'])) {
2327 print '<td class="tdoverflowmax100" title="'.dolPrintHTMLForTextArea($obj->town).'">';
2328 print dolPrintLabel($obj->town);
2329 print '</td>';
2330 if (!$i) {
2331 $totalarray['nbfield']++;
2332 }
2333 }
2334
2335 // Zip
2336 if (!empty($arrayfields['s.zip']['checked'])) {
2337 print '<td class="tdoverflowmax100" title="'.dolPrintHTMLForTextArea($obj->zip).'">';
2338 print dolPrintLabel($obj->zip);
2339 print '</td>';
2340 if (!$i) {
2341 $totalarray['nbfield']++;
2342 }
2343 }
2344
2345 // State
2346 if (!empty($arrayfields['state.nom']['checked'])) {
2347 print '<td class="tdoverflowmax100" title="'.dolPrintHTMLForTextArea($obj->state_name).'">'.dolPrintLabel($obj->state_name)."</td>\n";
2348 if (!$i) {
2349 $totalarray['nbfield']++;
2350 }
2351 }
2352
2353 // Country
2354 if (!empty($arrayfields['country.code_iso']['checked'])) {
2355 print '<td class="center">';
2356 $tmparray = getCountry($obj->fk_pays, 'all');
2357 print $tmparray['label'];
2358 print '</td>';
2359 if (!$i) {
2360 $totalarray['nbfield']++;
2361 }
2362 }
2363
2364 // Type ent
2365 if (!empty($arrayfields['typent.code']['checked'])) {
2366 print '<td class="center">';
2367 if (empty($typenArray)) {
2368 $typenArray = $formcompany->typent_array(1);
2369 }
2370 print $typenArray[$obj->typent_code]??'';
2371 print '</td>';
2372 if (!$i) {
2373 $totalarray['nbfield']++;
2374 }
2375 }
2376
2377 // Order date
2378 if (!empty($arrayfields['c.date_commande']['checked'])) {
2379 print '<td class="center nowraponall">';
2380 print dol_print_date($db->jdate($obj->date_commande), 'day');
2381 // Warning late icon and note
2382 if ($generic_commande->hasDelay()) {
2383 print img_picto($langs->trans("Late").' : '.$generic_commande->showDelay(), "warning");
2384 }
2385 print '</td>';
2386 if (!$i) {
2387 $totalarray['nbfield']++;
2388 }
2389 }
2390
2391 // Plannned date of delivery
2392 if (!empty($arrayfields['c.date_delivery']['checked'])) {
2393 print '<td class="center nowraponall">';
2394 print dol_print_date($db->jdate($obj->date_delivery), 'dayhour');
2395 print '</td>';
2396 if (!$i) {
2397 $totalarray['nbfield']++;
2398 }
2399 }
2400
2401 // Shipping Method
2402 if (!empty($arrayfields['c.fk_shipping_method']['checked'])) {
2403 print '<td>';
2404 $form->formSelectShippingMethod('', $obj->fk_shipping_method, 'none', 1);
2405 print '</td>';
2406 if (!$i) {
2407 $totalarray['nbfield']++;
2408 }
2409 }
2410
2411 // Payment terms
2412 if (!empty($arrayfields['c.fk_cond_reglement']['checked'])) {
2413 print '<td>';
2414 $form->form_conditions_reglement($_SERVER['PHP_SELF'], $obj->fk_cond_reglement, 'none', 0, '', 1, $obj->deposit_percent);
2415 print '</td>';
2416 if (!$i) {
2417 $totalarray['nbfield']++;
2418 }
2419 }
2420
2421 // Payment mode
2422 if (!empty($arrayfields['c.fk_mode_reglement']['checked'])) {
2423 print '<td>';
2424 $form->form_modes_reglement($_SERVER['PHP_SELF'], $obj->fk_mode_reglement, 'none', '', -1);
2425 print '</td>';
2426 if (!$i) {
2427 $totalarray['nbfield']++;
2428 }
2429 }
2430
2431 // Channel
2432 if (!empty($arrayfields['c.fk_input_reason']['checked'])) {
2433 print '<td>';
2434 $form->formInputReason($_SERVER['PHP_SELF'], $obj->fk_input_reason, 'none', '');
2435 print '</td>';
2436 if (!$i) {
2437 $totalarray['nbfield']++;
2438 }
2439 }
2440
2441 // Amount HT/net
2442 if (!empty($arrayfields['c.total_ht']['checked'])) {
2443 print '<td class="nowrap right"><span class="amount">'.price($obj->total_ht)."</span></td>\n";
2444 if (!$i) {
2445 $totalarray['nbfield']++;
2446 }
2447 if (!$i) {
2448 $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ht';
2449 }
2450 if (isset($totalarray['val']['c.total_ht'])) {
2451 $totalarray['val']['c.total_ht'] += $obj->total_ht;
2452 } else {
2453 $totalarray['val']['c.total_ht'] = $obj->total_ht;
2454 }
2455 }
2456
2457 // Amount VAT
2458 if (!empty($arrayfields['c.total_vat']['checked'])) {
2459 print '<td class="nowrap right"><span class="amount">'.price($obj->total_tva)."</span></td>\n";
2460 if (!$i) {
2461 $totalarray['nbfield']++;
2462 }
2463 if (!$i) {
2464 $totalarray['pos'][$totalarray['nbfield']] = 'c.total_tva';
2465 }
2466 if (isset($totalarray['val']['c.total_tva'])) {
2467 $totalarray['val']['c.total_tva'] += $obj->total_tva;
2468 } else {
2469 $totalarray['val']['c.total_tva'] = $obj->total_tva;
2470 }
2471 }
2472
2473 // Amount TTC / gross
2474 if (!empty($arrayfields['c.total_ttc']['checked'])) {
2475 print '<td class="nowrap right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n";
2476 if (!$i) {
2477 $totalarray['nbfield']++;
2478 }
2479 if (!$i) {
2480 $totalarray['pos'][$totalarray['nbfield']] = 'c.total_ttc';
2481 }
2482 if (isset($totalarray['val']['c.total_ttc'])) {
2483 $totalarray['val']['c.total_ttc'] += $obj->total_ttc;
2484 } else {
2485 $totalarray['val']['c.total_ttc'] = $obj->total_ttc;
2486 }
2487 }
2488
2489 // Currency
2490 if (!empty($arrayfields['c.multicurrency_code']['checked'])) {
2491 print '<td class="nowrap">'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."</td>\n";
2492 if (!$i) {
2493 $totalarray['nbfield']++;
2494 }
2495 }
2496
2497 // Currency rate
2498 if (!empty($arrayfields['c.multicurrency_tx']['checked'])) {
2499 print '<td class="nowrap">';
2500 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
2501 print "</td>\n";
2502 if (!$i) {
2503 $totalarray['nbfield']++;
2504 }
2505 }
2506
2507 // Amount HT/net in foreign currency
2508 if (!empty($arrayfields['c.multicurrency_total_ht']['checked'])) {
2509 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ht)."</span></td>\n";
2510 if (!$i) {
2511 $totalarray['nbfield']++;
2512 }
2513 }
2514 // Amount VAT in foreign currency
2515 if (!empty($arrayfields['c.multicurrency_total_vat']['checked'])) {
2516 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_vat)."</span></td>\n";
2517 if (!$i) {
2518 $totalarray['nbfield']++;
2519 }
2520 }
2521 // Amount TTC / gross in foreign currency
2522 if (!empty($arrayfields['c.multicurrency_total_ttc']['checked'])) {
2523 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ttc)."</span></td>\n";
2524 if (!$i) {
2525 $totalarray['nbfield']++;
2526 }
2527 }
2528
2529 $userstatic->id = $obj->fk_user_author;
2530 $userstatic->login = $obj->login;
2531 $userstatic->lastname = $obj->lastname;
2532 $userstatic->firstname = $obj->firstname;
2533 $userstatic->email = $obj->user_email;
2534 $userstatic->status = $obj->user_statut;
2535 $userstatic->entity = $obj->entity;
2536 $userstatic->photo = $obj->photo;
2537 $userstatic->office_phone = $obj->office_phone;
2538 $userstatic->office_fax = $obj->office_fax;
2539 $userstatic->user_mobile = $obj->user_mobile;
2540 $userstatic->job = $obj->job;
2541 $userstatic->gender = $obj->gender;
2542
2543 // Author
2544 if (!empty($arrayfields['u.login']['checked'])) {
2545 print '<td class="tdoverflowmax150">';
2546 if ($userstatic->id) {
2547 print $userstatic->getNomUrl(-1);
2548 } else {
2549 print '&nbsp;';
2550 }
2551 print "</td>\n";
2552 if (!$i) {
2553 $totalarray['nbfield']++;
2554 }
2555 }
2556
2557 // Sales representatives
2558 if (!empty($arrayfields['sale_representative']['checked'])) {
2559 print '<td>';
2560 if ($obj->socid > 0) {
2561 $listsalesrepresentatives = $companystatic->getSalesRepresentatives($user);
2562 if ($listsalesrepresentatives < 0) {
2563 dol_print_error($db);
2564 }
2565 $nbofsalesrepresentative = count($listsalesrepresentatives);
2566 if ($nbofsalesrepresentative > 6) {
2567 // We print only number
2568 print $nbofsalesrepresentative;
2569 } elseif ($nbofsalesrepresentative > 0) {
2570 $j = 0;
2571 foreach ($listsalesrepresentatives as $val) {
2572 $userstatic->id = $val['id'];
2573 $userstatic->lastname = $val['lastname'];
2574 $userstatic->firstname = $val['firstname'];
2575 $userstatic->email = $val['email'];
2576 $userstatic->status = $val['statut'];
2577 $userstatic->entity = $val['entity'];
2578 $userstatic->photo = $val['photo'];
2579 $userstatic->login = $val['login'];
2580 $userstatic->office_phone = $val['office_phone'];
2581 $userstatic->office_fax = $val['office_fax'];
2582 $userstatic->user_mobile = $val['user_mobile'];
2583 $userstatic->job = $val['job'];
2584 $userstatic->gender = $val['gender'];
2585 //print '<div class="float">':
2586 print ($nbofsalesrepresentative < 2) ? $userstatic->getNomUrl(-1, '', 0, 0, 12) : $userstatic->getNomUrl(-2);
2587 $j++;
2588 if ($j < $nbofsalesrepresentative) {
2589 print ' ';
2590 }
2591 //print '</div>';
2592 }
2593 }
2594 //else print $langs->trans("NoSalesRepresentativeAffected");
2595 } else {
2596 print '&nbsp;';
2597 }
2598 print '</td>';
2599 if (!$i) {
2600 $totalarray['nbfield']++;
2601 }
2602 }
2603
2604 // Total buying or cost price
2605 if (!empty($arrayfields['total_pa']['checked'])) {
2606 print '<td class="right nowrap">'.price($marginInfo['pa_total']).'</td>';
2607 if (!$i) {
2608 $totalarray['nbfield']++;
2609 }
2610 }
2611
2612 // Total margin
2613 if (!empty($arrayfields['total_margin']['checked'])) {
2614 print '<td class="right nowrap">'.price($marginInfo['total_margin']).'</td>';
2615 if (!$i) {
2616 $totalarray['nbfield']++;
2617 }
2618 if (!$i) {
2619 $totalarray['pos'][$totalarray['nbfield']] = 'total_margin';
2620 }
2621
2622 if (!isset($totalarray['val']['total_margin'])) {
2623 $totalarray['val']['total_margin'] = 0;
2624 }
2625
2626 $totalarray['val']['total_margin'] += $marginInfo['total_margin'];
2627 }
2628
2629 // Total margin rate
2630 if (!empty($arrayfields['total_margin_rate']['checked'])) {
2631 print '<td class="right nowrap">'.(($marginInfo['total_margin_rate'] == '') ? '' : price($marginInfo['total_margin_rate'], 0, '', 0, 0, 2).'%').'</td>';
2632 if (!$i) {
2633 $totalarray['nbfield']++;
2634 }
2635 }
2636
2637 // Total mark rate
2638 if (!empty($arrayfields['total_mark_rate']['checked'])) {
2639 print '<td class="right nowrap">'.(($marginInfo['total_mark_rate'] == '') ? '' : price($marginInfo['total_mark_rate'], 0, '', 0, 0, 2).'%').'</td>';
2640 if (!$i) {
2641 $totalarray['nbfield']++;
2642 }
2643 if (!$i) {
2644 $totalarray['pos'][$totalarray['nbfield']] = 'total_mark_rate';
2645 }
2646 if ($i >= $imaxinloop - 1) {
2647 if (!empty($total_ht)) {
2648 $totalarray['val']['total_mark_rate'] = price2num($total_margin * 100 / $total_ht, 'MT');
2649 } else {
2650 $totalarray['val']['total_mark_rate'] = '';
2651 }
2652 }
2653 }
2654
2655 // Date creation
2656 if (!empty($arrayfields['c.datec']['checked'])) {
2657 print '<td align="center" class="nowrap">';
2658 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
2659 print '</td>';
2660 if (!$i) {
2661 $totalarray['nbfield']++;
2662 }
2663 }
2664
2665 // Date modification
2666 if (!empty($arrayfields['c.tms']['checked'])) {
2667 print '<td align="center" class="nowrap">';
2668 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
2669 print '</td>';
2670 if (!$i) {
2671 $totalarray['nbfield']++;
2672 }
2673 }
2674
2675 // Date cloture
2676 if (!empty($arrayfields['c.date_cloture']['checked'])) {
2677 print '<td align="center" class="nowrap">';
2678 print dol_print_date($db->jdate($obj->date_cloture), 'dayhour', 'tzuser');
2679 print '</td>';
2680 if (!$i) {
2681 $totalarray['nbfield']++;
2682 }
2683 }
2684
2685 // Note public
2686 if (!empty($arrayfields['c.note_public']['checked'])) {
2687 print '<td class="sensiblehtmlcontent center">';
2688 print dolPrintHTML($obj->note_public);
2689 print '</td>';
2690 if (!$i) {
2691 $totalarray['nbfield']++;
2692 }
2693 }
2694
2695 // Note private
2696 if (!empty($arrayfields['c.note_private']['checked'])) {
2697 print '<td class="sensiblehtmlcontent center">';
2698 print dolPrintHTML($obj->note_private);
2699 print '</td>';
2700 if (!$i) {
2701 $totalarray['nbfield']++;
2702 }
2703 }
2704
2705 // Show shippable Icon (this creates subloops, so may be slow)
2706 if (!empty($arrayfields['shippable']['checked'])) {
2707 print '<td class="center">';
2708 if (!empty($show_shippable_command) && isModEnabled('stock')) {
2709 if (($obj->fk_statut > $generic_commande::STATUS_DRAFT) && ($obj->fk_statut < $generic_commande::STATUS_CLOSED)) {
2710 $generic_commande->getLinesArray(); // Load array ->lines
2711 $generic_commande->loadExpeditions(); // Load array ->expeditions
2712
2713 $numlines = count($generic_commande->lines); // Loop on each line of order
2714 for ($lig = 0; $lig < $numlines; $lig++) {
2715 if (isset($generic_commande->expeditions[$generic_commande->lines[$lig]->id])) {
2716 $reliquat = $generic_commande->lines[$lig]->qty - $generic_commande->expeditions[$generic_commande->lines[$lig]->id];
2717 } else {
2718 $reliquat = $generic_commande->lines[$lig]->qty;
2719 }
2720 if ($generic_commande->lines[$lig]->product_type == 0 && $generic_commande->lines[$lig]->fk_product > 0) { // If line is a product and not a service
2721 $nbprod++; // order contains real products
2722 $generic_product->id = $generic_commande->lines[$lig]->fk_product;
2723
2724 // Get local and virtual stock and store it into cache
2725 if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product])) {
2726 $generic_product->load_stock('nobatch,warehouseopen'); // ->load_virtual_stock() is already included into load_stock()
2727 $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_reel;
2728 $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'] = $generic_product->stock_theorique;
2729 } else {
2730 $generic_product->stock_reel = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stock_reel'];
2731 $generic_product->stock_theorique = $productstat_cachevirtual[$generic_commande->lines[$lig]->fk_product]['stock_reel'];
2732 }
2733
2734 if ($reliquat > $generic_product->stock_reel) {
2735 $notshippable++;
2736 }
2737 if (!getDolGlobalString('SHIPPABLE_ORDER_ICON_IN_LIST')) { // Default code. Default should be this case.
2738 $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->product_ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 20);
2739 $text_info .= ' - '.$langs->trans("Stock").': <span class="'.($generic_product->stock_reel > 0 ? 'ok' : 'error').'">'.$generic_product->stock_reel.'</span>';
2740 $text_info .= ' - '.$langs->trans("VirtualStock").': <span class="'.($generic_product->stock_theorique > 0 ? 'ok' : 'error').'">'.$generic_product->stock_theorique.'</span>';
2741 $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' <span class="opacitymedium">('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')</span>' : '');
2742 $text_info .= '<br>';
2743 } else { // BUGGED CODE.
2744 // DOES NOT TAKE INTO ACCOUNT MANUFACTURING. THIS CODE SHOULD BE USELESS. PREVIOUS CODE SEEMS COMPLETE.
2745 // COUNT STOCK WHEN WE SHOULD ALREADY HAVE VALUE
2746 // Detailed virtual stock, looks bugged, incomplete and need heavy load.
2747 // stock order and stock order_supplier
2748 $stock_order = 0;
2749 $stock_order_supplier = 0;
2750 if (getDolGlobalString('STOCK_CALCULATE_ON_SHIPMENT') || getDolGlobalString('STOCK_CALCULATE_ON_SHIPMENT_CLOSE')) { // What about other options ?
2751 if (isModEnabled('order')) {
2752 if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'])) {
2753 $generic_product->load_stats_commande(0, '1,2');
2754 $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'] = $generic_product->stats_commande['qty'];
2755 } else {
2756 $generic_product->stats_commande['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_customer'];
2757 }
2758 $stock_order = $generic_product->stats_commande['qty'];
2759 }
2760 if (isModEnabled("supplier_order")) {
2761 if (empty($productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'])) {
2762 $generic_product->load_stats_commande_fournisseur(0, '3');
2763 $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'] = $generic_product->stats_commande_fournisseur['qty'];
2764 } else {
2765 $generic_product->stats_commande_fournisseur['qty'] = $productstat_cache[$generic_commande->lines[$lig]->fk_product]['stats_order_supplier'];
2766 }
2767 $stock_order_supplier = $generic_product->stats_commande_fournisseur['qty'];
2768 }
2769 }
2770 $text_info .= $reliquat.' x '.$generic_commande->lines[$lig]->ref.'&nbsp;'.dol_trunc($generic_commande->lines[$lig]->product_label, 20);
2771 $text_stock_reel = $generic_product->stock_reel.'/'.$stock_order;
2772 if ($stock_order > $generic_product->stock_reel && !($generic_product->stock_reel < $generic_commande->lines[$lig]->qty)) {
2773 $warning++;
2774 $text_warning .= '<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
2775 }
2776 if ($reliquat > $generic_product->stock_reel) {
2777 $text_info .= '<span class="warning">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
2778 } else {
2779 $text_info .= '<span class="ok">'.$langs->trans('Available').'&nbsp;:&nbsp;'.$text_stock_reel.'</span>';
2780 }
2781 if (isModEnabled("supplier_order")) {
2782 $text_info .= '&nbsp;'.$langs->trans('SupplierOrder').'&nbsp;:&nbsp;'.$stock_order_supplier;
2783 }
2784 $text_info .= ($reliquat != $generic_commande->lines[$lig]->qty ? ' <span class="opacitymedium">('.$langs->trans("QtyInOtherShipments").' '.($generic_commande->lines[$lig]->qty - $reliquat).')</span>' : '');
2785 $text_info .= '<br>';
2786 }
2787 }
2788 }
2789 if ($notshippable == 0) {
2790 $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'green paddingleft');
2791 $text_info = $text_icon.' '.$langs->trans('Shippable').'<br>'.$text_info;
2792 } else {
2793 $text_icon = img_picto('', 'dolly', '', false, 0, 0, '', 'error paddingleft');
2794 $text_info = $text_icon.' '.$langs->trans('NonShippable').'<br>'.$text_info;
2795 }
2796 }
2797
2798 if ($nbprod) {
2799 print $form->textwithtooltip('', $text_info, 2, 1, $text_icon, '', 2);
2800 }
2801 if ($warning) { // Always false in default mode
2802 print $form->textwithtooltip('', $langs->trans('NotEnoughForAllOrders').'<br>'.$text_warning, 2, 1, img_picto('', 'error'), '', 2);
2803 }
2804 }
2805 print '</td>';
2806 if (!$i) {
2807 $totalarray['nbfield']++;
2808 }
2809 }
2810
2811 // Extra fields
2812 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
2813 // Fields from hook
2814 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
2815 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2816 print $hookmanager->resPrint;
2817
2818 // Billed
2819 if (!empty($arrayfields['c.facture']['checked'])) {
2820 print '<td class="center">';
2821 if ($obj->billed) {
2822 print yn($obj->billed, 4);
2823 }
2824 print '</td>';
2825 if (!$i) {
2826 $totalarray['nbfield']++;
2827 }
2828 }
2829
2830 // Import key
2831 if (!empty($arrayfields['c.import_key']['checked'])) {
2832 print '<td class="nowrap center">'.dol_escape_htmltag($obj->import_key).'</td>';
2833 if (!$i) {
2834 $totalarray['nbfield']++;
2835 }
2836 }
2837
2838 // Status
2839 if (!empty($arrayfields['c.fk_statut']['checked'])) {
2840 print '<td class="nowrap center">'.$generic_commande->LibStatut($obj->fk_statut, $obj->billed, 5, 1).'</td>';
2841 if (!$i) {
2842 $totalarray['nbfield']++;
2843 }
2844 }
2845
2846 // Action column
2847 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
2848 print '<td class="nowrap center">';
2849 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2850 $selected = 0;
2851 if (in_array($obj->rowid, $arrayofselected)) {
2852 $selected = 1;
2853 }
2854 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
2855 }
2856 print '</td>';
2857 if (!$i) {
2858 $totalarray['nbfield']++;
2859 }
2860 }
2861
2862 print "</tr>\n";
2863
2864 $total += $obj->total_ht;
2865 $subtotal += $obj->total_ht;
2866 }
2867 $i++;
2868}
2869
2870// Show total line
2871include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
2872
2873// If no record found
2874if ($num == 0) {
2875 $colspan = 1;
2876 foreach ($arrayfields as $key => $val) {
2877 if (!empty($val['checked'])) {
2878 $colspan++;
2879 }
2880 }
2881 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2882}
2883
2884$db->free($resql);
2885
2886$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
2887$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2888print $hookmanager->resPrint;
2889
2890print '</table>'."\n";
2891print '</div>'."\n";
2892
2893print '</form>'."\n";
2894
2895if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
2896 $hidegeneratedfilelistifempty = 1;
2897 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
2898 $hidegeneratedfilelistifempty = 0;
2899 }
2900
2901 // Show list of available documents
2902 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
2903 $urlsource .= str_replace('&amp;', '&', $param);
2904
2905 $filedir = $diroutputmassaction;
2906 $genallowed = $permissiontoread;
2907 $delallowed = $permissiontoadd;
2908
2909 print $formfile->showdocuments('massfilesarea_orders', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
2910}
2911
2912// End of page
2913llxFooter();
2914$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 customers orders.
const STATUS_SHIPMENTONPROCESS
Shipment on process.
const STATUS_CLOSED
Closed (Sent, billed or not)
const STATUS_CANCELED
Canceled status.
const STATUS_DRAFT
Draft status.
const STATUS_VALIDATED
Validated status.
Class to manage absolute discounts.
Class to manage standard extra fields.
Class to manage invoices.
Class to build HTML component for third parties management Only common components are here.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class permettant la generation de composants html autre Only common components are here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage products or services.
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.
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_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.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
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.
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.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
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...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dolPrintLabel($s)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
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.