dolibarr 25.0.0-alpha
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
6 * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
7 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
8 * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
9 * Copyright (C) 2018-2026 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2018-2022 Charlene Benke <charlene@patas-monkey.com>
11 * Copyright (C) 2019 Nicolas Zabouri <info@inovea-conseil.com>
12 * Copyright (C) 2021-2026 Alexandre Spangaro <alexandre@inovea-conseil.com>
13 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
14 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 3 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program. If not, see <https://www.gnu.org/licenses/>.
28 */
29
37// Load Dolibarr environment
38require '../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/html.formorder.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
52require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
53require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
54require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
55require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
56require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
57require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
58require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
59require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
60
61// Load translation files required by the page
62$langs->loadLangs(array("orders", "sendings", 'companies', 'compta', 'bills', 'projects', 'suppliers', 'products'));
63
64// Get Parameters
65$action = GETPOST('action', 'aZ09');
66$massaction = GETPOST('massaction', 'alpha');
67$show_files = GETPOSTINT('show_files');
68$confirm = GETPOST('confirm', 'alpha');
69$toselect = GETPOST('toselect', 'array:int');
70$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'supplierorderlist';
71$mode = GETPOST('mode', 'alpha');
72
73// Search Criteria
74$search_date_order_startday = GETPOSTINT('search_date_order_startday');
75$search_date_order_startmonth = GETPOSTINT('search_date_order_startmonth');
76$search_date_order_startyear = GETPOSTINT('search_date_order_startyear');
77$search_date_order_endday = GETPOSTINT('search_date_order_endday');
78$search_date_order_endmonth = GETPOSTINT('search_date_order_endmonth');
79$search_date_order_endyear = GETPOSTINT('search_date_order_endyear');
80$search_date_order_start = dol_mktime(0, 0, 0, $search_date_order_startmonth, $search_date_order_startday, $search_date_order_startyear); // Use tzserver
81$search_date_order_end = dol_mktime(23, 59, 59, $search_date_order_endmonth, $search_date_order_endday, $search_date_order_endyear);
82
83$search_date_delivery_startday = GETPOSTINT('search_date_delivery_startday');
84$search_date_delivery_startmonth = GETPOSTINT('search_date_delivery_startmonth');
85$search_date_delivery_startyear = GETPOSTINT('search_date_delivery_startyear');
86$search_date_delivery_endday = GETPOSTINT('search_date_delivery_endday');
87$search_date_delivery_endmonth = GETPOSTINT('search_date_delivery_endmonth');
88$search_date_delivery_endyear = GETPOSTINT('search_date_delivery_endyear');
89$search_date_delivery_start = dol_mktime(0, 0, 0, $search_date_delivery_startmonth, $search_date_delivery_startday, $search_date_delivery_startyear); // Use tzserver
90$search_date_delivery_end = dol_mktime(23, 59, 59, $search_date_delivery_endmonth, $search_date_delivery_endday, $search_date_delivery_endyear);
91
92$search_date_valid_startday = GETPOSTINT('search_date_valid_startday');
93$search_date_valid_startmonth = GETPOSTINT('search_date_valid_startmonth');
94$search_date_valid_startyear = GETPOSTINT('search_date_valid_startyear');
95$search_date_valid_endday = GETPOSTINT('search_date_valid_endday');
96$search_date_valid_endmonth = GETPOSTINT('search_date_valid_endmonth');
97$search_date_valid_endyear = GETPOSTINT('search_date_valid_endyear');
98$search_date_valid_start = dol_mktime(0, 0, 0, $search_date_valid_startmonth, $search_date_valid_startday, $search_date_valid_startyear); // Use tzserver
99$search_date_valid_end = dol_mktime(23, 59, 59, $search_date_valid_endmonth, $search_date_valid_endday, $search_date_valid_endyear);
100
101$search_date_approve_startday = GETPOSTINT('search_date_approve_startday');
102$search_date_approve_startmonth = GETPOSTINT('search_date_approve_startmonth');
103$search_date_approve_startyear = GETPOSTINT('search_date_approve_startyear');
104$search_date_approve_endday = GETPOSTINT('search_date_approve_endday');
105$search_date_approve_endmonth = GETPOSTINT('search_date_approve_endmonth');
106$search_date_approve_endyear = GETPOSTINT('search_date_approve_endyear');
107$search_date_approve_start = dol_mktime(0, 0, 0, $search_date_approve_startmonth, $search_date_approve_startday, $search_date_approve_startyear); // Use tzserver
108$search_date_approve_end = dol_mktime(23, 59, 59, $search_date_approve_endmonth, $search_date_approve_endday, $search_date_approve_endyear);
109
110$search_all = trim(GETPOST('search_all', 'alphanohtml'));
111
112$searchCategorySupplierOrderList = GETPOST('search_category_supplier_order_list', 'array:int');
113$searchCategorySupplierOrderOperator = 0;
114if (GETPOSTISSET('formfilteraction')) {
115 $searchCategorySupplierOrderOperator = GETPOSTINT('search_category_supplier_order_operator');
116} elseif (getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT')) {
117 $searchCategorySupplierOrderOperator = getDolGlobalString('MAIN_SEARCH_CAT_OR_BY_DEFAULT');
118}
119$search_product_category = GETPOSTINT('search_product_category');
120$search_ref = GETPOST('search_ref', 'alpha');
121$search_refsupp = GETPOST('search_refsupp', 'alpha');
122$search_company = GETPOST('search_company', 'alpha');
123$search_company_alias = GETPOST('search_company_alias', 'alpha');
124$search_town = GETPOST('search_town', 'alpha');
125$search_zip = GETPOST('search_zip', 'alpha');
126$search_state = GETPOST("search_state", 'alpha');
127$search_country = GETPOST("search_country", 'aZ09');
128$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
129$search_user = GETPOST('search_user', 'intcomma');
130$search_request_author = GETPOST('search_request_author', 'alpha');
131$optioncss = GETPOST('optioncss', 'alpha');
132$socid = GETPOSTINT('socid');
133$search_sale = GETPOST('search_sale', 'intcomma');
134$search_total_ht = GETPOST('search_total_ht', 'alpha');
135$search_total_tva = GETPOST('search_total_tva', 'alpha');
136$search_total_ttc = GETPOST('search_total_ttc', 'alpha');
137$search_multicurrency_code = GETPOST('search_multicurrency_code', 'alpha');
138$search_multicurrency_tx = GETPOST('search_multicurrency_tx', 'alpha');
139$search_note_private = GETPOST('search_note_private', 'alpha');
140$search_note_public = GETPOST('search_note_public', 'alpha');
141$search_multicurrency_montant_ht = GETPOST('search_multicurrency_montant_ht', 'alpha');
142$search_multicurrency_montant_tva = GETPOST('search_multicurrency_montant_tva', 'alpha');
143$search_multicurrency_montant_ttc = GETPOST('search_multicurrency_montant_ttc', 'alpha');
144$optioncss = GETPOST('optioncss', 'alpha');
145$billed = GETPOST('billed', 'int'); // Value '' must be possible
146$search_project_ref = GETPOST('search_project_ref', 'alpha');
147$search_btn = GETPOST('button_search', 'alpha');
148$search_remove_btn = GETPOST('button_removefilter', 'alpha');
149
150if (GETPOSTISARRAY('search_status')) {
151 $search_status = implode(',', GETPOST('search_status', 'array:intcomma'));
152} else {
153 $search_status = (GETPOST('search_status', 'intcomma') != '' ? GETPOST('search_status', 'intcomma') : GETPOST('statut', 'intcomma'));
154}
155
156$search_option = GETPOST('search_option', 'alpha');
157if ($search_option == 'late') {
158 $search_status = '1,2';
159}
160if ($search_option == 'recv_late') {
161 $search_status = '3,4';
162}
163
164
165$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
166$sortfield = GETPOST('sortfield', 'aZ09comma');
167$sortorder = GETPOST('sortorder', 'aZ09comma');
168$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
169if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
170 // If $page is not defined, or '' or -1 or if we click on clear filters
171 $page = 0;
172}
173$offset = $limit * $page;
174$pageprev = $page - 1;
175$pagenext = $page + 1;
176if (!$sortfield) {
177 $sortfield = 'cf.ref';
178}
179if (!$sortorder) {
180 $sortorder = 'DESC';
181}
182
183// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
185$hookmanager->initHooks(array('supplierorderlist'));
186
187// fetch optionals attributes and labels
188$extrafields->fetch_name_optionals_label($object->table_element);
189$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
190
191$diroutputmassaction = getMultidirTemp($object).'/massgeneration/'.$user->id;
192
193// List of fields to search into when doing a "search in all"
194$fieldstosearchall = array();
195foreach ($object->fields as $key => $val) {
196 if (!empty($val['searchall'])) {
197 $fieldstosearchall['cf.'.$key] = $val['label'];
198 }
199}
200$fieldstosearchall['pd.description'] = 'Description';
201$fieldstosearchall['s.nom'] = "ThirdParty";
202$fieldstosearchall['s.name_alias'] = "AliasNameShort";
203$fieldstosearchall['s.zip'] = "Zip";
204$fieldstosearchall['s.town'] = "Town";
205if (empty($user->socid)) {
206 $fieldstosearchall["cf.note_private"] = "NotePrivate";
207}
208
209$enabledtypetiers = 0;
210
211// Definition of array of fields for columns
212$arrayfields = array(
213 'u.login' => array('label' => "AuthorRequest", 'enabled' => '1', 'position' => 41),
214 's.name_alias' => array('label' => "AliasNameShort", 'position' => 51, 'checked' => '0'),
215 's.town' => array('label' => "Town", 'enabled' => '1', 'position' => 55, 'checked' => '0'),
216 's.zip' => array('label' => "Zip", 'enabled' => '1', 'position' => 56, 'checked' => '1'),
217 'state.nom' => array('label' => "StateShort", 'enabled' => '1', 'position' => 57),
218 'country.code_iso' => array('label' => "Country", 'enabled' => '1', 'position' => 58),
219 'typent.code' => array('label' => "ThirdPartyType", 'enabled' => $enabledtypetiers, 'position' => 59),
220 'cf.total_localtax1' => array('label' => $langs->transcountry("AmountLT1", $mysoc->country_code), 'checked' => '0', 'enabled' => (string) (int) ($mysoc->localtax1_assuj == "1"), 'position' => 140),
221 'cf.total_localtax2' => array('label' => $langs->transcountry("AmountLT2", $mysoc->country_code), 'checked' => '0', 'enabled' => (string) (int) ($mysoc->localtax2_assuj == "1"), 'position' => 145),
222 'cf.note_public' => array('label' => 'NotePublic', 'checked' => '0', 'enabled' => (string) (int) (!getDolGlobalInt('MAIN_LIST_HIDE_PUBLIC_NOTES')), 'position' => 750),
223 'cf.note_private' => array('label' => 'NotePrivate', 'checked' => '0', 'enabled' => (string) (int) (!getDolGlobalInt('MAIN_LIST_HIDE_PRIVATE_NOTES')), 'position' => 760),
224);
225foreach ($object->fields as $key => $val) {
226 // If $val['visible']==0, then we never show the field
227 if (!empty($val['visible'])) {
228 $visible = (int) dol_eval((string) $val['visible'], 1);
229 $arrayfields['cf.'.$key] = array(
230 'label' => $val['label'],
231 'checked' => (($visible < 0) ? '0' : '1'),
232 'enabled' => (string) (int) (abs($visible) != 3 && (bool) dol_eval((string) $val['enabled'], 1)),
233 'position' => $val['position'],
234 'help' => isset($val['help']) ? $val['help'] : ''
235 );
236 }
237}
238// Extra fields
239include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
240// Add hook to complete $arrayfields
241$parameters = array('arrayfields' => &$arrayfields);
242$reshook = $hookmanager->executeHooks('completeArrayFields', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
243
244$object->fields = dol_sort_array($object->fields, 'position');
245$arrayfields = dol_sort_array($arrayfields, 'position');
246
247$error = 0;
248
249// Check only if it's an internal user
250if (empty($user->socid) && !$user->hasRight('societe', 'client', 'voir')) {
251 $search_sale = $user->isExternalUser();
252}
253
254// Security check
255$orderid = GETPOSTINT('orderid');
256if ($user->isExternalUser()) {
257 $socid = $user->isExternalUser();
258}
259$result = restrictedArea($user, 'fournisseur', $orderid, '', 'commande');
260
261$permissiontoread = ($user->hasRight("fournisseur", "commande", "lire") || $user->hasRight("supplier_order", "lire"));
262$permissiontoadd = ($user->hasRight("fournisseur", "commande", "creer") || $user->hasRight("supplier_order", "creer"));
263$permissiontodelete = ($user->hasRight("fournisseur", "commande", "supprimer") || $user->hasRight("supplier_order", "supprimer"));
264$permissiontovalidate = $permissiontoadd;
265$permissiontoapprove = ($user->hasRight("fournisseur", "commande", "approuver") || $user->hasRight("supplier_order", "approuver"));
266
267
268/*
269 * Actions
270 */
271
272if (GETPOST('cancel', 'alpha')) {
273 $action = 'list';
274 $massaction = '';
275}
276if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createsupplierbills') {
277 $massaction = '';
278}
279
280$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
281$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
282if ($reshook < 0) {
283 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
284}
285
286if (empty($reshook)) {
287 // Selection of new fields
288 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
289
290 // Purge search criteria
291 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
292 $search_categ = '';
293 $search_user = '';
294 $search_sale = '';
295 $search_product_category = '';
296 $searchCategorySupplierOrderList = array();
297 $search_ref = '';
298 $search_refsupp = '';
299 $search_company = '';
300 $search_company_alias = '';
301 $search_town = '';
302 $search_zip = "";
303 $search_state = "";
304 $search_type = '';
305 $search_country = '';
306 $search_type_thirdparty = '';
307 $search_request_author = '';
308 $search_total_ht = '';
309 $search_total_tva = '';
310 $search_total_ttc = '';
311 $search_multicurrency_code = '';
312 $search_multicurrency_tx = '';
313 $search_multicurrency_montant_ht = '';
314 $search_multicurrency_montant_tva = '';
315 $search_multicurrency_montant_ttc = '';
316 $search_project_ref = '';
317 $search_status = '';
318 $search_option = '';
319 $search_date_order_startday = '';
320 $search_date_order_startmonth = '';
321 $search_date_order_startyear = '';
322 $search_date_order_endday = '';
323 $search_date_order_endmonth = '';
324 $search_date_order_endyear = '';
325 $search_date_order_start = '';
326 $search_date_order_end = '';
327 $search_date_delivery_startday = '';
328 $search_date_delivery_startmonth = '';
329 $search_date_delivery_startyear = '';
330 $search_date_delivery_endday = '';
331 $search_date_delivery_endmonth = '';
332 $search_date_delivery_endyear = '';
333 $search_date_delivery_start = '';
334 $search_date_delivery_end = '';
335 $search_date_valid_startday = '';
336 $search_date_valid_startmonth = '';
337 $search_date_valid_startyear = '';
338 $search_date_valid_endday = '';
339 $search_date_valid_endmonth = '';
340 $search_date_valid_endyear = '';
341 $search_date_valid_start = '';
342 $search_date_valid_end = '';
343 $search_date_approve_startday = '';
344 $search_date_approve_startmonth = '';
345 $search_date_approve_startyear = '';
346 $search_date_approve_endday = '';
347 $search_date_approve_endmonth = '';
348 $search_date_approve_endyear = '';
349 $search_date_approve_start = '';
350 $search_date_approve_end = '';
351 $billed = '';
352 $toselect = array();
353 $search_array_options = array();
354 }
355 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
356 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
357 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
358 }
359
360 // Mass actions
361 $objectclass = 'CommandeFournisseur';
362 $objectlabel = 'SupplierOrders';
363 $uploaddir = getMultidirOutput($object);
364 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
365
366 if ($action == 'validate' && $permissiontovalidate) {
367 if (GETPOST('confirm') == 'yes') {
368 $objecttmp = new CommandeFournisseur($db);
369 $db->begin();
370 $error = 0;
371
372 foreach ($toselect as $checked) {
373 if ($objecttmp->fetch($checked)) {
374 if ($objecttmp->statut == 0) {
375 $objecttmp->date_commande = dol_now();
376 $result = $objecttmp->valid($user);
377 if ($result >= 0) {
378 // If we have permission, and if we don't need to provide the idwarehouse, we go directly on approved step
379 if (!getDolGlobalString('SUPPLIER_ORDER_NO_DIRECT_APPROVE') && $permissiontoapprove && !(getDolGlobalString('STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') && $objecttmp->hasProductsOrServices(1))) {
380 $result = $objecttmp->approve($user);
381 setEventMessages($langs->trans("SupplierOrderValidatedAndApproved"), array($objecttmp->ref));
382 } else {
383 setEventMessages($langs->trans("SupplierOrderValidated"), array($objecttmp->ref));
384 }
385 } else {
386 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
387 $error++;
388 }
389 }
390 }
391 }
392
393 if (!$error) {
394 $db->commit();
395 } else {
396 $db->rollback();
397 }
398 }
399 }
400
401 // Mass action to generate vendor bills
402 if ($massaction == 'confirm_createsupplierbills') {
403 $orders = GETPOST('toselect', 'array:int');
404 $createbills_onebythird = GETPOSTINT('createbills_onebythird');
405 $validate_invoices = GETPOSTINT('validate_invoices');
406
407 $TFact = array();
409 $TFactThird = array();
410
411 $nb_bills_created = 0;
412 $lastid = 0;
413 $lastref = '';
414
415 $db->begin();
416
417 $default_ref_supplier = dol_print_date(dol_now(), '%Y%m%d%H%M%S');
418 $currentIndex = 0;
419 foreach ($orders as $id_order) {
420 $cmd = new CommandeFournisseur($db);
421 if ($cmd->fetch($id_order) <= 0) {
422 continue;
423 }
424
425 $objecttmp = new FactureFournisseur($db);
426 if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) {
427 $currentIndex++;
428 $objecttmp = $TFactThird[$cmd->socid]; // If option "one bill per third" is set, we use already created supplier invoice.
429 } else {
430 // Search if the VAT reverse-charge is activated by default in supplier card to resume the information
431 if (!empty($cmd->socid) > 0) {
432 $societe = new Societe($db);
433 $societe->fetch($cmd->socid);
434 $objecttmp->vat_reverse_charge = $societe->vat_reverse_charge;
435 $objecttmp->thirdparty = $societe;
436 }
437 $objecttmp->socid = $cmd->socid;
438 $objecttmp->type = $objecttmp::TYPE_STANDARD;
439 $objecttmp->cond_reglement_id = $cmd->cond_reglement_id;
440 $objecttmp->mode_reglement_id = $cmd->mode_reglement_id;
441 $objecttmp->fk_project = $cmd->fk_project;
442 $objecttmp->multicurrency_code = $cmd->multicurrency_code;
443 $objecttmp->ref_supplier = !empty($cmd->ref_supplier) ? $cmd->ref_supplier : $default_ref_supplier;
444 $default_ref_supplier += 1;
445
446 $datefacture = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
447 if (empty($datefacture)) {
448 $datefacture = dol_now();
449 }
450
451 $objecttmp->date = $datefacture;
452 $objecttmp->origin = 'order_supplier';
453 $objecttmp->origin_id = (int) $id_order;
454
455 $res = $objecttmp->create($user);
456
457 if ($res > 0) {
458 $nb_bills_created++;
459 $lastref = $objecttmp->ref;
460 $lastid = $objecttmp->id;
461 } else {
462 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
463 $error++;
464 }
465 }
466
467 if ($objecttmp->id > 0) {
468 if (empty($objecttmp->note_public)) {
469 $objecttmp->note_public = $langs->transnoentities("Orders");
470 }
471
472 $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
473 $sql .= "fk_source";
474 $sql .= ", sourcetype";
475 $sql .= ", fk_target";
476 $sql .= ", targettype";
477 $sql .= ") VALUES (";
478 $sql .= ((int) $id_order);
479 $sql .= ", '".$db->escape($objecttmp->origin)."'";
480 $sql .= ", ".((int) $objecttmp->id);
481 $sql .= ", '".$db->escape($objecttmp->element)."'";
482 $sql .= ")";
483
484 if (!$db->query($sql)) {
485 $error++;
486 }
487
488 if (!$error) {
489 $lines = $cmd->lines;
490 if (empty($lines) && method_exists($cmd, 'fetch_lines')) {
491 $cmd->fetch_lines();
492 $lines = $cmd->lines;
493 }
494
495 $fk_parent_line = 0;
496 $num = count($lines);
497
498 for ($i = 0; $i < $num; $i++) {
499 $desc = ($lines[$i]->desc ? $lines[$i]->desc : $lines[$i]->libelle);
500 // If we build one invoice for several supplier orders, append the source order reference on the invoice line.
501 if (!empty($createbills_onebythird)) {
502 $desc = dol_concatdesc($desc, $langs->trans("SupplierOrder").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day'));
503 }
504 if ($lines[$i]->subprice < 0) {
505 require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
506
507 // Negative line, we create a discount line
508 $discount = new DiscountAbsolute($db);
509 $discount->fk_soc = $objecttmp->socid;
510 $discount->socid = $objecttmp->socid;
511 $discount->amount_ht = abs($lines[$i]->total_ht);
512 $discount->amount_tva = abs($lines[$i]->total_tva);
513 $discount->amount_ttc = abs($lines[$i]->total_ttc);
514 $discount->tva_tx = $lines[$i]->tva_tx;
515 $discount->fk_user = $user->id;
516 $discount->description = $desc;
517 $discountid = $discount->create($user);
518 if ($discountid > 0) {
519 $result = $objecttmp->insert_discount($discountid);
520 //$result=$discount->link_to_invoice($lineid,$id);
521 } else {
522 setEventMessages($discount->error, $discount->errors, 'errors');
523 $error++;
524 break;
525 }
526 } else {
527 // Positive line
528 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
529 // Date start
530 $date_start = 0;
531 if ($lines[$i]->date_debut_prevue) {
532 $date_start = $lines[$i]->date_debut_prevue;
533 }
534 if ($lines[$i]->date_debut_reel) {
535 $date_start = $lines[$i]->date_debut_reel;
536 }
537 if ($lines[$i]->date_start) {
538 $date_start = $lines[$i]->date_start;
539 }
540 //Date end
541 $date_end = 0;
542 if ($lines[$i]->date_fin_prevue) {
543 $date_end = $lines[$i]->date_fin_prevue;
544 }
545 if ($lines[$i]->date_fin_reel) {
546 $date_end = $lines[$i]->date_fin_reel;
547 }
548 if ($lines[$i]->date_end) {
549 $date_end = $lines[$i]->date_end;
550 }
551 // Reset fk_parent_line for no child products and special product
552 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
553 $fk_parent_line = 0;
554 }
555
556 $tva_tx = $lines[$i]->tva_tx;
557 // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
558 if (!empty($lines[$i]->vat_src_code) && !preg_match('/\‍(/', (string) $tva_tx)) {
559 $tva_tx .= ' ('.$lines[$i]->vat_src_code.')';
560 }
561
562 $result = $objecttmp->addline(
563 $desc,
564 $lines[$i]->subprice,
565 $tva_tx,
566 $lines[$i]->localtax1_tx,
567 $lines[$i]->localtax2_tx,
568 $lines[$i]->qty,
569 $lines[$i]->fk_product,
570 $lines[$i]->remise_percent,
571 (int) $date_start,
572 (int) $date_end,
573 0,
574 $lines[$i]->info_bits,
575 'HT',
576 $product_type,
577 // we don't use the rank from orderline because we may have lines from several orders
578 -1,
579 0,
580 $lines[$i]->array_options,
581 $lines[$i]->fk_unit,
582 // we use the id of each order, not the id of the first one stored in $objecttmp->origin_id
583 $lines[$i]->fk_commande,
584 $lines[$i]->pa_ht,
585 $lines[$i]->ref_supplier,
586 $lines[$i]->special_code,
587 $fk_parent_line
588 );
589 if ($result > 0) {
590 $lineid = $result;
591 } else {
592 $lineid = 0;
593 $error++;
594 break;
595 }
596 // Defined the new fk_parent_line
597 if ($result > 0 && $lines[$i]->product_type == 9) {
598 $fk_parent_line = $result;
599 }
600 }
601 }
602 }
603 }
604
605 if ($currentIndex <= (getDolGlobalInt("MAXREFONDOC") ? getDolGlobalInt("MAXREFONDOC") : 10)) {
606 $objecttmp->note_public = dol_concatdesc($objecttmp->note_public, $langs->transnoentities($cmd->ref).(empty($cmd->ref_supplier) ? '' : ' ('.$cmd->ref_supplier.')'));
607 if ($objecttmp->update($user) < 0) {
608 $error++;
609 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
610 }
611 }
612
613 $cmd->classifyBilled($user); // TODO Move this in workflow like done for sales orders
614
615 if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) {
616 $TFactThird[$cmd->socid] = $objecttmp;
617 } else {
618 $TFact[$objecttmp->id] = $objecttmp;
619 }
620 }
621
622 // Build doc with all invoices
623 $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird;
624 $toselect = array();
625
626 if (!$error && $validate_invoices) {
627 $massaction = $action = 'builddoc';
628
629 foreach ($TAllFact as &$objecttmp) {
630 $objecttmp->validate($user);
631 if ($result <= 0) {
632 $error++;
633 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
634 break;
635 }
636
637 $id = $objecttmp->id; // For builddoc action
638
639 // Fac builddoc
640 $donotredirect = 1;
641 $upload_dir = getMultidirOutput($objecttmp);
642 $permissiontoadd = ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"));
643 //include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
644 }
645
646 $massaction = $action = 'confirm_createsupplierbills';
647 }
648
649 if (!$error) {
650 $db->commit();
651
652 if ($nb_bills_created == 1) {
653 $texttoshow = $langs->trans('BillXCreated', '{s1}');
654 $texttoshow = str_replace('{s1}', '<a href="'.DOL_URL_ROOT.'/fourn/facture/card.php?id='.urlencode((string) ($lastid)).'">'.$lastref.'</a>', $texttoshow);
655 setEventMessages($texttoshow, null, 'mesgs');
656 } else {
657 setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs');
658 }
659
660 // Make a redirect to avoid to bill twice if we make a refresh or back
661 $param = '';
662 if (!empty($mode)) {
663 $param .= '&mode='.urlencode($mode);
664 }
665 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
666 $param .= '&contextpage='.urlencode($contextpage);
667 }
668 if ($limit > 0 && $limit != $conf->liste_limit) {
669 $param .= '&limit='.((int) $limit);
670 }
671 if ($search_all) {
672 $param .= '&search_all='.urlencode($search_all);
673 }
674 if ($socid > 0) {
675 $param .= '&socid='.urlencode((string) ($socid));
676 }
677 if ($search_status != '') {
678 $param .= '&search_status='.urlencode($search_status);
679 }
680 if ($search_option) {
681 $param .= '&search_option='.urlencode($search_option);
682 }
683 if ($search_date_order_startday) {
684 $param .= '&search_date_order_startday='.urlencode((string) ($search_date_order_startday));
685 }
686 if ($search_date_order_startmonth) {
687 $param .= '&search_date_order_startmonth='.urlencode((string) ($search_date_order_startmonth));
688 }
689 if ($search_date_order_startyear) {
690 $param .= '&search_date_order_startyear='.urlencode((string) ($search_date_order_startyear));
691 }
692 if ($search_date_order_endday) {
693 $param .= '&search_date_order_endday='.urlencode((string) ($search_date_order_endday));
694 }
695 if ($search_date_order_endmonth) {
696 $param .= '&search_date_order_endmonth='.urlencode((string) ($search_date_order_endmonth));
697 }
698 if ($search_date_order_endyear) {
699 $param .= '&search_date_order_endyear='.urlencode((string) ($search_date_order_endyear));
700 }
701 if ($search_date_delivery_startday) {
702 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
703 }
704 if ($search_date_delivery_startmonth) {
705 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
706 }
707 if ($search_date_delivery_startyear) {
708 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
709 }
710 if ($search_date_delivery_endday) {
711 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
712 }
713 if ($search_date_delivery_endmonth) {
714 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
715 }
716 if ($search_date_delivery_endyear) {
717 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
718 }
719 if ($search_date_valid_startday) {
720 $param .= '&search_date_valid_startday='.urlencode((string) ($search_date_valid_startday));
721 }
722 if ($search_date_valid_startmonth) {
723 $param .= '&search_date_valid_startmonth='.urlencode((string) ($search_date_valid_startmonth));
724 }
725 if ($search_date_valid_startyear) {
726 $param .= '&search_date_valid_startyear='.urlencode((string) ($search_date_valid_startyear));
727 }
728 if ($search_date_valid_endday) {
729 $param .= '&search_date_valid_endday='.urlencode((string) ($search_date_valid_endday));
730 }
731 if ($search_date_valid_endmonth) {
732 $param .= '&search_date_valid_endmonth='.urlencode((string) ($search_date_valid_endmonth));
733 }
734 if ($search_date_valid_endyear) {
735 $param .= '&search_date_valid_endyear='.urlencode((string) ($search_date_valid_endyear));
736 }
737 if ($search_date_approve_startday) {
738 $param .= '&search_date_approve_startday='.urlencode((string) ($search_date_approve_startday));
739 }
740 if ($search_date_approve_startmonth) {
741 $param .= '&search_date_approve_startmonth='.urlencode((string) ($search_date_approve_startmonth));
742 }
743 if ($search_date_approve_startyear) {
744 $param .= '&search_date_approve_startyear='.urlencode((string) ($search_date_approve_startyear));
745 }
746 if ($search_date_approve_endday) {
747 $param .= '&search_date_approve_endday='.urlencode((string) ($search_date_approve_endday));
748 }
749 if ($search_date_approve_endmonth) {
750 $param .= '&search_date_approve_endmonth='.urlencode((string) ($search_date_approve_endmonth));
751 }
752 if ($search_date_approve_endyear) {
753 $param .= '&search_date_approve_endyear='.urlencode((string) ($search_date_approve_endyear));
754 }
755 if ($search_ref) {
756 $param .= '&search_ref='.urlencode($search_ref);
757 }
758 if ($search_company) {
759 $param .= '&search_company='.urlencode($search_company);
760 }
761 if ($search_company_alias) {
762 $param .= '&search_company_alias='.urlencode($search_company_alias);
763 }
764 //if ($search_ref_customer) $param .= '&search_ref_customer='.urlencode($search_ref_customer);
765 if ($search_user > 0) {
766 $param .= '&search_user='.urlencode((string) ($search_user));
767 }
768 if ($searchCategorySupplierOrderOperator == 1) {
769 $param .= "&search_category_supplier_order_operator=".urlencode((string) ($searchCategorySupplierOrderOperator));
770 }
771 foreach ($searchCategorySupplierOrderList as $searchCategorySupplierOrder) {
772 $param .= "&search_category_order_list[]=".urlencode($searchCategorySupplierOrder);
773 }
774 if ($search_sale > 0) {
775 $param .= '&search_sale='.urlencode($search_sale);
776 }
777 if ($search_total_ht != '') {
778 $param .= '&search_total_ht='.urlencode($search_total_ht);
779 }
780 if ($search_total_tva != '') {
781 $param .= '&search_total_tva='.urlencode($search_total_tva);
782 }
783 if ($search_total_ttc != '') {
784 $param .= '&search_total_ttc='.urlencode($search_total_ttc);
785 }
786 if ($search_project_ref >= 0) {
787 $param .= "&search_project_ref=".urlencode($search_project_ref);
788 }
789 if ($show_files) {
790 $param .= '&show_files='.urlencode((string) ($show_files));
791 }
792 if ($optioncss != '') {
793 $param .= '&optioncss='.urlencode($optioncss);
794 }
795 if ($billed != '') {
796 $param .= '&billed='.((int) ($billed));
797 }
798
799 header("Location: ".$_SERVER['PHP_SELF'].'?'.$param);
800 exit;
801 } else {
802 $db->rollback();
803 $action = 'create';
804 $_GET["origin"] = GETPOST("origin", 'alpha');
805 $_GET["originid"] = GETPOSTINT("originid");
806 setEventMessages("Error", null, 'errors');
807 $error++;
808 }
809 }
810}
811
812
813/*
814 * View
815 */
816
817$now = dol_now();
818
819$form = new Form($db);
820$thirdpartytmp = new Fournisseur($db);
821$commandestatic = new CommandeFournisseur($db);
822$formfile = new FormFile($db);
823$formorder = new FormOrder($db);
824$formother = new FormOther($db);
825$formcompany = new FormCompany($db);
826
827$title = $langs->trans("SuppliersOrders");
828if ($socid > 0) {
829 $fourn = new Fournisseur($db);
830 $fourn->fetch($socid);
831 $title .= ' - '.$fourn->name;
832}
833
834if ($billed > 0) {
835 $title .= ' - '.$langs->trans("Billed");
836}
837
838//$help_url="EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
839$help_url = '';
840
841$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
842$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
843
844$sql = 'SELECT';
845if ($search_all) {
846 $sql = 'SELECT DISTINCT';
847}
848$sql .= ' s.rowid as socid, s.nom as name, s.name_alias as alias, s.town, s.zip, s.fk_pays, s.client, s.fournisseur, s.code_client, s.email,';
849$sql .= " typent.code as typent_code,";
850$sql .= " state.code_departement as state_code, state.nom as state_name,";
851$sql .= " cf.rowid, cf.ref, cf.ref_supplier, cf.fk_statut, cf.billed, cf.total_ht, cf.total_tva, cf.total_ttc, cf.fk_user_author, cf.date_commande as date_commande, cf.date_livraison as delivery_date, cf.date_valid, cf.date_approve,";
852$sql .= ' cf.localtax1 as total_localtax1, cf.localtax2 as total_localtax2,';
853$sql .= ' cf.fk_multicurrency, cf.multicurrency_code, cf.multicurrency_tx, cf.multicurrency_total_ht, cf.multicurrency_total_tva, cf.multicurrency_total_ttc,';
854$sql .= ' cf.date_creation as date_creation, cf.tms as date_modification,';
855$sql .= ' cf.note_public, cf.note_private,';
856$sql .= " p.rowid as project_id, p.ref as project_ref, p.title as project_title,";
857$sql .= " u.firstname, u.lastname, u.photo, u.login, u.email as user_email, u.statut as user_status";
858// Add fields from extrafields
859if (!empty($extrafields->attributes[$object->table_element]['label'])) {
860 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
861 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
862 }
863}
864// Add fields from hooks
865$parameters = array();
866$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
867$sql .= $hookmanager->resPrint;
868
869$sqlfields = $sql; // $sql fields to remove for count total
870
871$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
872$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
873$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
874$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
875$sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as cf";
876if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
877 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (cf.rowid = ef.fk_object)";
878}
879if ($search_all) {
880 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseurdet as pd ON cf.rowid=pd.fk_commande';
881}
882$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON cf.fk_user_author = u.rowid";
883$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = cf.fk_projet";
884$parameters = array();
885$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
886$sql .= $hookmanager->resPrint;
887$sql .= ' WHERE cf.fk_soc = s.rowid';
888$sql .= ' AND cf.entity IN ('.getEntity('supplier_order').')';
889if ($socid > 0) {
890 $sql .= " AND s.rowid = ".((int) $socid);
891}
892if ($search_ref) {
893 $sql .= natural_search('cf.ref', $search_ref);
894}
895if ($search_refsupp) {
896 $sql .= natural_search("cf.ref_supplier", $search_refsupp);
897}
898if ($search_all) {
899 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
900}
901if (empty($arrayfields['s.name_alias']['checked']) && $search_company) {
902 $sql .= natural_search(array("s.nom", "s.name_alias"), $search_company);
903} else {
904 if ($search_company) {
905 $sql .= natural_search('s.nom', $search_company);
906 }
907 if ($search_company_alias) {
908 $sql .= natural_search('s.name_alias', $search_company_alias);
909 }
910}
911if ($search_request_author) {
912 $sql .= natural_search(array('u.lastname', 'u.firstname', 'u.login'), $search_request_author);
913}
914if ($billed != '' && $billed != '-1') {
915 $sql .= " AND cf.billed = ".((int) $billed);
916}
917//Required triple check because statut=0 means draft filter
918if (GETPOST('statut', 'intcomma') !== '') {
919 $sql .= " AND cf.fk_statut IN (".$db->sanitize($db->escape($db->escape(GETPOST('statut', 'intcomma')))).")";
920}
921if ($search_status != '' && $search_status != '-1') {
922 $sql .= " AND cf.fk_statut IN (".$db->sanitize($db->escape($search_status)).")";
923}
924if ($search_option == 'late') {
925 $sql .= " AND cf.date_commande < '".$db->idate(dol_now() - $conf->order->fournisseur->warning_delay)."'";
926}
927if ($search_option == 'recv_late') {
928 // Same rule as FournisseurCommande::hasDelay() for the ordered and partially received status
929 $sql .= " AND cf.date_livraison < '".$db->idate(dol_now() - $conf->order->fournisseur->warning_delay)."'";
930}
931if ($search_date_order_start) {
932 $sql .= " AND cf.date_commande >= '".$db->idate($search_date_order_start)."'";
933}
934if ($search_date_order_end) {
935 $sql .= " AND cf.date_commande <= '".$db->idate($search_date_order_end)."'";
936}
937if ($search_date_delivery_start) {
938 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_delivery_start)."'";
939}
940if ($search_date_delivery_end) {
941 $sql .= " AND cf.date_livraison <= '".$db->idate($search_date_delivery_end)."'";
942}
943if ($search_date_valid_start) {
944 $sql .= " AND cf.date_valid >= '".$db->idate($search_date_valid_start)."'";
945}
946if ($search_note_public) {
947 $sql .= " AND cf.note_public LIKE '%".$db->escape($db->escapeforlike($search_note_public))."%'";
948}
949if ($search_date_approve_start) {
950 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_approve_start)."'";
951}
952if ($search_date_valid_end) {
953 $sql .= " AND cf.date_valid <= '".$db->idate($search_date_valid_end)."'";
954}
955if ($search_date_approve_start) {
956 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_approve_start)."'";
957}
958if ($search_date_approve_end) {
959 $sql .= " AND cf.date_livraison <= '".$db->idate($search_date_approve_end)."'";
960}
961if ($search_town) {
962 $sql .= natural_search('s.town', $search_town);
963}
964if ($search_zip) {
965 $sql .= natural_search("s.zip", $search_zip);
966}
967if ($search_state) {
968 $sql .= natural_search("state.nom", $search_state);
969}
970if ($search_country) {
971 $sql .= " AND s.fk_pays IN (".$db->sanitize($db->escape($search_country)).')';
972}
973if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
974 $sql .= " AND s.fk_typent IN (".$db->sanitize($db->escape($search_type_thirdparty)).')';
975}
976/*if ($search_sale > 0) {
977 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
978}*/
979if ($search_user > 0) {
980 $sql .= " AND EXISTS (";
981 $sql .= " SELECT ec.rowid ";
982 $sql .= " FROM " . MAIN_DB_PREFIX . "element_contact as ec";
983 $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc ON tc.rowid = ec.fk_c_type_contact";
984 $sql .= " WHERE ec.element_id = cf.rowid AND ec.fk_socpeople = " . ((int) $search_user);
985 $sql .= " AND tc.element = 'order_supplier' AND tc.source = 'internal'";
986 $sql .= ")";
987}
988if ($search_total_ht != '') {
989 $sql .= natural_search('cf.total_ht', $search_total_ht, 1);
990}
991if ($search_total_tva != '') {
992 $sql .= natural_search('cf.total_tva', $search_total_tva, 1);
993}
994if ($search_total_ttc != '') {
995 $sql .= natural_search('cf.total_ttc', $search_total_ttc, 1);
996}
997if ($search_multicurrency_code != '') {
998 $sql .= " AND cf.multicurrency_code = '".$db->escape($search_multicurrency_code)."'";
999}
1000if ($search_multicurrency_tx != '') {
1001 $sql .= natural_search('cf.multicurrency_tx', $search_multicurrency_tx, 1);
1002}
1003if ($search_multicurrency_montant_ht != '') {
1004 $sql .= natural_search('cf.multicurrency_total_ht', $search_multicurrency_montant_ht, 1);
1005}
1006if ($search_multicurrency_montant_tva != '') {
1007 $sql .= natural_search('cf.multicurrency_total_tva', $search_multicurrency_montant_tva, 1);
1008}
1009if ($search_multicurrency_montant_ttc != '') {
1010 $sql .= natural_search('cf.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1);
1011}
1012if ($search_project_ref != '') {
1013 $sql .= natural_search("p.ref", $search_project_ref);
1014}
1015// Search on sale representative
1016if ($search_sale && $search_sale != '-1') {
1017 if ($search_sale == -2) {
1018 $sql .= " AND ".getSalesRepresentativeSqlFilter('cf.fk_soc', 0, 1);
1019 } elseif ($search_sale > 0) {
1020 $sql .= " AND ".getSalesRepresentativeSqlFilter('cf.fk_soc', (int) $search_sale);
1021 }
1022}
1023// Search for tag/category ($searchCategorySupplierOrderList is an array of ID)
1024if (!empty($searchCategorySupplierOrderList)) {
1025 $searchCategorySupplierOrderSqlList = array();
1026 $listofcategoryid = '';
1027 foreach ($searchCategorySupplierOrderList as $searchCategorySupplierOrder) {
1028 if (intval($searchCategorySupplierOrder) == -2) {
1029 $searchCategorySupplierOrderSqlList[] = "NOT EXISTS (SELECT ck.fk_supplier_order FROM ".MAIN_DB_PREFIX."categorie_supplier_order as ck WHERE cf.rowid = ck.fk_supplier_order)";
1030 } elseif (intval($searchCategorySupplierOrder) > 0) {
1031 if ($searchCategorySupplierOrderOperator == 0) {
1032 $searchCategorySupplierOrderSqlList[] = " EXISTS (SELECT ck.fk_supplier_order FROM ".MAIN_DB_PREFIX."categorie_supplier_order as ck WHERE cf.rowid = ck.fk_supplier_order AND ck.fk_categorie = ".((int) $searchCategorySupplierOrder).")";
1033 } else {
1034 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategorySupplierOrder);
1035 }
1036 }
1037 }
1038 if ($listofcategoryid) {
1039 $searchCategorySupplierOrderSqlList[] = " EXISTS (SELECT ck.fk_supplier_order FROM ".MAIN_DB_PREFIX."categorie_supplier_order as ck WHERE cf.rowid = ck.fk_supplier_order AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
1040 }
1041 if ($searchCategorySupplierOrderOperator == 1) {
1042 if (!empty($searchCategorySupplierOrderSqlList)) {
1043 $sql .= " AND (".implode(' OR ', $searchCategorySupplierOrderSqlList).")";
1044 }
1045 } else {
1046 if (!empty($searchCategorySupplierOrderSqlList)) {
1047 $sql .= " AND (".implode(' AND ', $searchCategorySupplierOrderSqlList).")";
1048 }
1049 }
1050}
1051// Search for tag/category ($searchCategoryProductList is an array of ID)
1052$searchCategoryProductOperator = GETPOSTINT('search_category_product_operator');
1053$searchCategoryProductList = array($search_product_category);
1054if (!empty($searchCategoryProductList)) {
1055 $searchCategoryProductSqlList = array();
1056 $listofcategoryid = '';
1057 foreach ($searchCategoryProductList as $searchCategoryProduct) {
1058 if (intval($searchCategoryProduct) == -2) {
1059 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product)";
1060 } elseif (intval($searchCategoryProduct) > 0) {
1061 if ($searchCategoryProductOperator == 0) {
1062 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
1063 } else {
1064 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
1065 }
1066 }
1067 }
1068 if ($listofcategoryid) {
1069 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."commande_fournisseurdet as cd WHERE cd.fk_commande = cf.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
1070 }
1071 if ($searchCategoryProductOperator == 1) {
1072 if (!empty($searchCategoryProductSqlList)) {
1073 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
1074 }
1075 } else {
1076 if (!empty($searchCategoryProductSqlList)) {
1077 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
1078 }
1079 }
1080}
1081// Add where from extra fields
1082include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
1083// Add where from hooks
1084$parameters = array();
1085$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
1086$sql .= $hookmanager->resPrint;
1087
1088// Count total nb of records
1089$nbtotalofrecords = '';
1090if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
1091 /* The fast and low memory method to get and count full list converts the sql into a sql count */
1092 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
1093 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
1094 $resql = $db->query($sqlforcount);
1095 if ($resql) {
1096 $objforcount = $db->fetch_object($resql);
1097 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1098 } else {
1099 dol_print_error($db);
1100 }
1101
1102 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
1103 $page = 0;
1104 $offset = 0;
1105 }
1106 $db->free($resql);
1107}
1108
1109$sql .= $db->order($sortfield, $sortorder);
1110if ($limit) {
1111 $sql .= $db->plimit($limit + 1, $offset);
1112}
1113//print $sql;
1114
1115$resql = $db->query($sql);
1116if ($resql) {
1117 $num = $db->num_rows($resql);
1118
1119 $arrayofselected = is_array($toselect) ? $toselect : array();
1120
1121 if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
1122 $obj = $db->fetch_object($resql);
1123 $id = $obj->rowid;
1124 header("Location: ".DOL_URL_ROOT.'/fourn/commande/card.php?id='.$id);
1125 exit;
1126 }
1127
1128 llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-supplier-order page-list');
1129
1130 $param = '';
1131 if (!empty($mode)) {
1132 $param .= '&mode='.urlencode($mode);
1133 }
1134 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
1135 $param .= '&contextpage='.urlencode($contextpage);
1136 }
1137 if ($limit > 0 && $limit != $conf->liste_limit) {
1138 $param .= '&limit='.((int) $limit);
1139 }
1140 if ($search_all) {
1141 $param .= '&search_all='.urlencode($search_all);
1142 }
1143 if ($socid > 0) {
1144 $param .= '&socid='.urlencode((string) ($socid));
1145 }
1146 if ($search_all) {
1147 $param .= "&search_all=".urlencode($search_all);
1148 }
1149 if ($search_date_order_startday) {
1150 $param .= '&search_date_order_startday='.urlencode((string) ($search_date_order_startday));
1151 }
1152 if ($search_date_order_startmonth) {
1153 $param .= '&search_date_order_startmonth='.urlencode((string) ($search_date_order_startmonth));
1154 }
1155 if ($search_date_order_startyear) {
1156 $param .= '&search_date_order_startyear='.urlencode((string) ($search_date_order_startyear));
1157 }
1158 if ($search_date_order_endday) {
1159 $param .= '&search_date_order_endday='.urlencode((string) ($search_date_order_endday));
1160 }
1161 if ($search_date_order_endmonth) {
1162 $param .= '&search_date_order_endmonth='.urlencode((string) ($search_date_order_endmonth));
1163 }
1164 if ($search_date_order_endyear) {
1165 $param .= '&search_date_order_endyear='.urlencode((string) ($search_date_order_endyear));
1166 }
1167 if ($search_date_delivery_startday) {
1168 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
1169 }
1170 if ($search_date_delivery_startmonth) {
1171 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
1172 }
1173 if ($search_date_delivery_startyear) {
1174 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
1175 }
1176 if ($search_date_delivery_endday) {
1177 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
1178 }
1179 if ($search_date_delivery_endmonth) {
1180 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
1181 }
1182 if ($search_date_delivery_endyear) {
1183 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
1184 }
1185 if ($search_date_valid_startday) {
1186 $param .= '&search_date_valid_startday='.urlencode((string) ($search_date_valid_startday));
1187 }
1188 if ($search_date_valid_startmonth) {
1189 $param .= '&search_date_valid_startmonth='.urlencode((string) ($search_date_valid_startmonth));
1190 }
1191 if ($search_date_valid_startyear) {
1192 $param .= '&search_date_valid_startyear='.urlencode((string) ($search_date_valid_startyear));
1193 }
1194 if ($search_date_valid_endday) {
1195 $param .= '&search_date_valid_endday='.urlencode((string) ($search_date_valid_endday));
1196 }
1197 if ($search_date_valid_endmonth) {
1198 $param .= '&search_date_valid_endmonth='.urlencode((string) ($search_date_valid_endmonth));
1199 }
1200 if ($search_date_valid_endyear) {
1201 $param .= '&search_date_valid_endyear='.urlencode((string) ($search_date_valid_endyear));
1202 }
1203 if ($search_date_approve_startday) {
1204 $param .= '&search_date_approve_startday='.urlencode((string) ($search_date_approve_startday));
1205 }
1206 if ($search_date_approve_startmonth) {
1207 $param .= '&search_date_approve_startmonth='.urlencode((string) ($search_date_approve_startmonth));
1208 }
1209 if ($search_date_approve_startyear) {
1210 $param .= '&search_date_approve_startyear='.urlencode((string) ($search_date_approve_startyear));
1211 }
1212 if ($search_date_approve_endday) {
1213 $param .= '&search_date_approve_endday='.urlencode((string) ($search_date_approve_endday));
1214 }
1215 if ($search_date_approve_endmonth) {
1216 $param .= '&search_date_approve_endmonth='.urlencode((string) ($search_date_approve_endmonth));
1217 }
1218 if ($search_date_approve_endyear) {
1219 $param .= '&search_date_approve_endyear='.urlencode((string) ($search_date_approve_endyear));
1220 }
1221 if ($search_ref) {
1222 $param .= '&search_ref='.urlencode($search_ref);
1223 }
1224 if ($search_company) {
1225 $param .= '&search_company='.urlencode($search_company);
1226 }
1227 if ($search_company_alias) {
1228 $param .= '&search_company_alias='.urlencode($search_company_alias);
1229 }
1230 if ($search_user > 0) {
1231 $param .= '&search_user='.urlencode((string) ($search_user));
1232 }
1233 if ($search_request_author) {
1234 $param .= '&search_request_author='.urlencode($search_request_author);
1235 }
1236 if ($search_sale > 0) {
1237 $param .= '&search_sale='.urlencode($search_sale);
1238 }
1239 if ($search_total_ht != '') {
1240 $param .= '&search_total_ht='.urlencode($search_total_ht);
1241 }
1242 if ($search_total_ttc != '') {
1243 $param .= "&search_total_ttc=".urlencode($search_total_ttc);
1244 }
1245 if ($search_multicurrency_code != '') {
1246 $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
1247 }
1248 if ($search_multicurrency_tx != '') {
1249 $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
1250 }
1251 if ($search_multicurrency_montant_ht != '') {
1252 $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
1253 }
1254 if ($search_multicurrency_montant_tva != '') {
1255 $param .= '&search_multicurrency_montant_tva='.urlencode($search_multicurrency_montant_tva);
1256 }
1257 if ($search_multicurrency_montant_ttc != '') {
1258 $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
1259 }
1260 if ($search_refsupp) {
1261 $param .= "&search_refsupp=".urlencode($search_refsupp);
1262 }
1263 if ($search_status != '' && $search_status != '-1') {
1264 $param .= "&search_status=".urlencode($search_status);
1265 }
1266 if ($search_option) {
1267 $param .= "&search_option=".urlencode($search_option);
1268 }
1269 if ($search_project_ref >= 0) {
1270 $param .= "&search_project_ref=".urlencode($search_project_ref);
1271 }
1272 if ($billed != '') {
1273 $param .= "&billed=".((int) $billed);
1274 }
1275 if ($show_files) {
1276 $param .= '&show_files='.urlencode((string) ($show_files));
1277 }
1278 if ($optioncss != '') {
1279 $param .= '&optioncss='.urlencode($optioncss);
1280 }
1281 if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
1282 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
1283 }
1284
1285 // Add $param from extra fields
1286 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1287
1288 $parameters = array('param' => &$param);
1289 $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
1290 $param .= $hookmanager->resPrint;
1291
1292 // List of mass actions available
1293 $arrayofmassactions = array(
1294 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1295 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1296 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
1297 );
1298 if (isModEnabled('category') && $user->hasRight("fournisseur", "commande", "lire")) {
1299 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
1300 }
1301 if ($permissiontovalidate) {
1302 if ($permissiontoapprove && !getDolGlobalString('SUPPLIER_ORDER_NO_DIRECT_APPROVE')) {
1303 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ValidateAndApprove");
1304 } else {
1305 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate");
1306 }
1307 }
1308
1309 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
1310 $arrayofmassactions['createbills'] = img_picto('', 'supplier_invoice', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisSupplier");
1311 }
1312 if ($permissiontodelete) {
1313 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
1314 }
1315 if (in_array($massaction, array('presend', 'predelete', 'createbills'))) {
1316 $arrayofmassactions = array();
1317 }
1318 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1319
1320 $url = DOL_URL_ROOT.'/fourn/commande/card.php?action=create';
1321 if ($socid > 0) {
1322 $url .= '&socid='.((int) $socid);
1323 $url .= '&backtopage='.urlencode(DOL_URL_ROOT.'/fourn/commande/list.php?socid='.((int) $socid));
1324 }
1325 $newcardbutton = '';
1326 $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'));
1327 $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'));
1328 $newcardbutton .= dolGetButtonTitle($langs->trans('Statistics'), '', 'fa fa-chart-bar imgforviewmode', DOL_URL_ROOT.'/commande/stats/index.php?mode=supplier'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', ($mode == 'statistics' ? 2 : 1), array('morecss' => 'reposition'));
1329 $newcardbutton .= dolGetButtonTitleSeparator();
1330 $newcardbutton .= dolGetButtonTitle($langs->trans('NewSupplierOrderShort'), '', 'fa fa-plus-circle', $url, '', (int) $permissiontoadd);
1331
1332 // Lines of title fields
1333 print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
1334 if ($optioncss != '') {
1335 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1336 }
1337 print '<input type="hidden" name="token" value="'.newToken().'">';
1338 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1339 print '<input type="hidden" name="action" value="list">';
1340 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1341 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1342 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
1343 print '<input type="hidden" name="socid" value="'.$socid.'">';
1344 print '<input type="hidden" name="mode" value="'.$mode.'">';
1345
1346 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_order', 0, $newcardbutton, '', $limit, 0, 0, 1);
1347
1348 $topicmail = "SendOrderRef";
1349 $modelmail = "order_supplier_send";
1350 $objecttmp = new CommandeFournisseur($db); // in case $object is not the good object
1351 $trackid = 'sord'.$object->id;
1352 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1353
1354 if ($massaction == 'prevalidate') {
1355 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1);
1356 }
1357
1358 if ($massaction == 'createbills') {
1359 //var_dump($_REQUEST);
1360 print '<input type="hidden" name="massaction" value="confirm_createsupplierbills">';
1361
1362 print '<table class="noborder centpercent">';
1363 print '<tr>';
1364 print '<td class="titlefield">';
1365 print $langs->trans('DateInvoice');
1366 print '</td>';
1367 print '<td>';
1368 print $form->selectDate('', '', 0, 0, 0, '', 1, 1);
1369 print '</td>';
1370 print '</tr>';
1371 print '<tr>';
1372 print '<td>';
1373 print $langs->trans('CreateOneBillByThird');
1374 print '</td>';
1375 print '<td>';
1376 print $form->selectyesno('createbills_onebythird', '', 1);
1377 print '</td>';
1378 print '</tr>';
1379 print '<tr>';
1380 print '<td>';
1381 print $langs->trans('ValidateInvoices');
1382 print '</td>';
1383 print '<td>';
1384 print $form->selectyesno('validate_invoices', 1, 1);
1385 print '</td>';
1386 print '</tr>';
1387 print '</table>';
1388
1389 print '<div class="center">';
1390 print '<input type="submit" class="button" id="createbills" name="createbills" value="'.$langs->trans('CreateInvoiceForThisCustomer').'"> ';
1391 print '<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1392 print '</div>';
1393 print '<br>';
1394 print '<br>';
1395 }
1396
1397 if ($search_all) {
1398 foreach ($fieldstosearchall as $key => $val) {
1399 $fieldstosearchall[$key] = $langs->trans($val);
1400 }
1401 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1402 }
1403
1404 $moreforfilter = '';
1405 if (isModEnabled('category') && $user->hasRight('categorie', 'read')) {
1406 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
1407 $formcategory = new FormCategory($db);
1408 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_SUPPLIER_ORDER, $searchCategorySupplierOrderList, 'minwidth300', $searchCategorySupplierOrderOperator ? $searchCategorySupplierOrderOperator : 0);
1409 }
1410 // If the user can view prospects other than his'
1411 if ($user->hasRight("user", "user", "lire")) {
1412 $langs->load("commercial");
1413 $moreforfilter .= '<div class="divsearchfield">';
1414 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1415 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx');
1416 $moreforfilter .= '</div>';
1417 }
1418 // If the user can view other users
1419 if ($user->hasRight("user", "user", "lire")) {
1420 $moreforfilter .= '<div class="divsearchfield">';
1421 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1422 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, null, 0, '', '', '0', 0, 0, '', 0, '', 'maxwidth250 widthcentpercentminusx');
1423 $moreforfilter .= '</div>';
1424 }
1425 // If the user can view prospects other than his'
1426 if (isModEnabled('category') && $user->hasRight('categorie', 'lire') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
1427 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1428 $moreforfilter .= '<div class="divsearchfield">';
1429 $tmptitle = $langs->trans('IncludingProductWithTag');
1430 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', 'parent', 0, 0, 1);
1431 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"').$form->selectarray('search_product_category', $cate_arbo, $search_product_category, $tmptitle, 0, 0, '', 0, 0, 0, '', 'maxwidth300 widthcentpercentminusx', 1);
1432 $moreforfilter .= '</div>';
1433 }
1434 // alert on late date
1435 $moreforfilter .= '<div class="divsearchfield valignmiddle" title="'.$langs->trans("Alert").' '.$langs->trans("Late").'">';
1436 $moreforfilter .= '<label class="valignmiddle" for="search_option">'.$langs->trans('Alert').'</label> <input type="checkbox" class="valignmiddle" id="search_option" name="search_option" value="'.(($search_status == '3,4') ? 'recv_late' : 'late').'"'.((array_search($search_option, array('late','recv_late')) !== false) ? ' checked' : '').'>';
1437 $moreforfilter .= '</div>';
1438 $parameters = array();
1439 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1440 if (empty($reshook)) {
1441 $moreforfilter .= $hookmanager->resPrint;
1442 } else {
1443 $moreforfilter = $hookmanager->resPrint;
1444 }
1445
1446 if (!empty($moreforfilter)) {
1447 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1448 print $moreforfilter;
1449 print '</div>';
1450 }
1451
1452 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1453 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields
1454 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
1455
1456 if (GETPOSTINT('autoselectall')) {
1457 $selectedfields .= '<script>';
1458 $selectedfields .= ' $(document).ready(function() {';
1459 $selectedfields .= ' console.log("Autoclick on checkforselects");';
1460 $selectedfields .= ' $("#checkforselects").click();';
1461 $selectedfields .= ' $("#massaction").val("createbills").change();';
1462 $selectedfields .= ' });';
1463 $selectedfields .= '</script>';
1464 }
1465
1466 print '<div class="div-table-responsive">';
1467 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1468
1469 print '<tr class="liste_titre_filter">';
1470 // Action column
1471 if ($conf->main_checkbox_left_column) {
1472 print '<td class="liste_titre middle">';
1473 $searchpicto = $form->showFilterButtons('left');
1474 print $searchpicto;
1475 print '</td>';
1476 }
1477 // Ref
1478 if (!empty($arrayfields['cf.ref']['checked'])) {
1479 print '<td class="liste_titre"><input size="8" type="text" class="flat maxwidth75" name="search_ref" value="'.$search_ref.'"></td>';
1480 }
1481 // Ref customer
1482 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1483 print '<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_refsupp" value="'.$search_refsupp.'"></td>';
1484 }
1485 // Project ref
1486 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1487 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_project_ref" value="'.$search_project_ref.'"></td>';
1488 }
1489 // Request author
1490 if (!empty($arrayfields['u.login']['checked'])) {
1491 print '<td class="liste_titre">';
1492 print '<input type="text" class="flat" size="6" name="search_request_author" value="'.$search_request_author.'">';
1493 print '</td>';
1494 }
1495 // Thirpdarty
1496 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1497 print '<td class="liste_titre"><input type="text" size="6" class="flat" name="search_company" value="'.$search_company.'"></td>';
1498 }
1499 // Alias
1500 if (!empty($arrayfields['s.name_alias']['checked'])) {
1501 print '<td class="liste_titre"><input type="text" size="6" class="flat" name="search_company_alias" value="'.$search_company_alias.'"></td>';
1502 }
1503 // Town
1504 if (!empty($arrayfields['s.town']['checked'])) {
1505 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_town" value="'.$search_town.'"></td>';
1506 }
1507 // Zip
1508 if (!empty($arrayfields['s.zip']['checked'])) {
1509 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_zip" value="'.$search_zip.'"></td>';
1510 }
1511 // State
1512 if (!empty($arrayfields['state.nom']['checked'])) {
1513 print '<td class="liste_titre">';
1514 print '<input class="flat maxwidth50" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1515 print '</td>';
1516 }
1517 // Country
1518 if (!empty($arrayfields['country.code_iso']['checked'])) {
1519 print '<td class="liste_titre center">';
1520 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1521 print '</td>';
1522 }
1523 // Company type
1524 if (!empty($arrayfields['typent.code']['checked'])) {
1525 print '<td class="liste_titre maxwidthonsmartphone center">';
1526 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'), '', 1);
1527 print '</td>';
1528 }
1529 // Date order
1530 if (!empty($arrayfields['cf.date_commande']['checked'])) {
1531 print '<td class="liste_titre center">';
1532 print '<div class="nowrapfordate">';
1533 print $form->selectDate($search_date_order_start ? $search_date_order_start : -1, 'search_date_order_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1534 print '</div>';
1535 print '<div class="nowrapfordate">';
1536 print $form->selectDate($search_date_order_end ? $search_date_order_end : -1, 'search_date_order_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1537 print '</div>';
1538 print '</td>';
1539 }
1540 // Date delivery
1541 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
1542 print '<td class="liste_titre center">';
1543 print '<div class="nowrapfordate">';
1544 print $form->selectDate($search_date_delivery_start ? $search_date_delivery_start : -1, 'search_date_delivery_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1545 print '</div>';
1546 print '<div class="nowrapfordate">';
1547 print $form->selectDate($search_date_delivery_end ? $search_date_delivery_end : -1, 'search_date_delivery_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1548 print '</div>';
1549 print '</td>';
1550 }
1551 if (!empty($arrayfields['cf.total_ht']['checked'])) {
1552 // Amount
1553 print '<td class="liste_titre right">';
1554 print '<input class="flat" type="text" size="5" name="search_total_ht" value="'.$search_total_ht.'">';
1555 print '</td>';
1556 }
1557 if (!empty($arrayfields['cf.total_tva']['checked'])) {
1558 // Amount
1559 print '<td class="liste_titre right">';
1560 print '<input class="flat" type="text" size="5" name="search_total_tva" value="'.$search_total_tva.'">';
1561 print '</td>';
1562 }
1563 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
1564 // Amount
1565 print '<td class="liste_titre right">';
1566 print '<input class="flat" type="text" size="5" name="search_total_ttc" value="'.$search_total_ttc.'">';
1567 print '</td>';
1568 }
1569 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
1570 // Currency
1571 print '<td class="liste_titre">';
1572 print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
1573 print '</td>';
1574 }
1575 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
1576 // Currency rate
1577 print '<td class="liste_titre">';
1578 print '<input class="flat" type="text" size="4" name="search_multicurrency_tx" value="'.dol_escape_htmltag($search_multicurrency_tx).'">';
1579 print '</td>';
1580 }
1581 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
1582 // Amount
1583 print '<td class="liste_titre right">';
1584 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ht" value="'.dol_escape_htmltag($search_multicurrency_montant_ht).'">';
1585 print '</td>';
1586 }
1587 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
1588 // Amount
1589 print '<td class="liste_titre right">';
1590 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_tva" value="'.dol_escape_htmltag($search_multicurrency_montant_tva).'">';
1591 print '</td>';
1592 }
1593 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
1594 // Amount
1595 print '<td class="liste_titre right">';
1596 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ttc" value="'.dol_escape_htmltag($search_multicurrency_montant_ttc).'">';
1597 print '</td>';
1598 }
1599 // Extra fields
1600 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1601
1602 // Fields from hook
1603 $parameters = array('arrayfields' => $arrayfields);
1604 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1605 print $hookmanager->resPrint;
1606 // Date creation
1607 if (!empty($arrayfields['cf.date_creation']['checked'])) {
1608 print '<td class="liste_titre">';
1609 print '</td>';
1610 }
1611 // Date modification
1612 if (!empty($arrayfields['cf.tms']['checked'])) {
1613 print '<td class="liste_titre">';
1614 print '</td>';
1615 }
1616 // Billed
1617 if (!empty($arrayfields['cf.billed']['checked'])) {
1618 print '<td class="liste_titre center parentonrightofpage">';
1619 print $form->selectyesno('billed', $billed, 1, false, 1, 1, 'search_status width100 onrightofpage');
1620 print '</td>';
1621 }
1622 // Status
1623 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
1624 print '<td class="liste_titre center parentonrightofpage">';
1625 $formorder->selectSupplierOrderStatus($search_status, 1, 'search_status', 'search_status width125 onrightofpage');
1626 print '</td>';
1627 }
1628 // Date valid
1629 if (!empty($arrayfields['cf.date_valid']['checked'])) {
1630 print '<td class="liste_titre center">';
1631 print '<div class="nowrapfordate">';
1632 print $form->selectDate($search_date_valid_start ? $search_date_valid_start : -1, 'search_date_valid_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1633 print '</div>';
1634 print '<div class="nowrapfordate">';
1635 print $form->selectDate($search_date_valid_end ? $search_date_valid_end : -1, 'search_date_valid_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1636 print '</div>';
1637 print '</td>';
1638 }
1639 // Date approve
1640 if (!empty($arrayfields['cf.date_approve']['checked'])) {
1641 print '<td class="liste_titre center">';
1642 print '<div class="nowrapfordate">';
1643 print $form->selectDate($search_date_approve_start ? $search_date_approve_start : -1, 'search_date_approve_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1644 print '</div>';
1645 print '<div class="nowrapfordate">';
1646 print $form->selectDate($search_date_approve_end ? $search_date_approve_end : -1, 'search_date_approve_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1647 print '</div>';
1648 print '</td>';
1649 }
1650 if (!empty($arrayfields['cf.note_public']['checked'])) {
1651 // Note public
1652 print '<td class="liste_titre">';
1653 print '<input class="flat maxwidth75" type="text" name="search_note_public" value="'.dol_escape_htmltag($search_note_public).'">';
1654 print '</td>';
1655 }
1656 if (!empty($arrayfields['cf.note_private']['checked'])) {
1657 // Note private
1658 print '<td class="liste_titre">';
1659 print '<input class="flat maxwidth75" type="text" name="search_note_private" value="'.dol_escape_htmltag($search_note_private).'">';
1660 print '</td>';
1661 }
1662 // Action column
1663 if (!$conf->main_checkbox_left_column) {
1664 print '<td class="liste_titre center">';
1665 $searchpicto = $form->showFilterButtons();
1666 print $searchpicto;
1667 print '</td>';
1668 }
1669
1670 print "</tr>\n";
1671
1672 $totalarray = array();
1673 $totalarray['nbfield'] = 0;
1674
1675 // Fields title
1676 print '<tr class="liste_titre">';
1677 if ($conf->main_checkbox_left_column) {
1678 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1679 $totalarray['nbfield']++;
1680 }
1681 if (!empty($arrayfields['cf.ref']['checked'])) {
1682 print_liste_field_titre($arrayfields['cf.ref']['label'], $_SERVER["PHP_SELF"], "cf.ref", "", $param, '', $sortfield, $sortorder);
1683 $totalarray['nbfield']++;
1684 }
1685 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1686 print_liste_field_titre($arrayfields['cf.ref_supplier']['label'], $_SERVER["PHP_SELF"], "cf.ref_supplier", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax100imp ');
1687 $totalarray['nbfield']++;
1688 }
1689 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1690 print_liste_field_titre($arrayfields['cf.fk_projet']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
1691 $totalarray['nbfield']++;
1692 }
1693 if (!empty($arrayfields['u.login']['checked'])) {
1694 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], "u.login", "", $param, '', $sortfield, $sortorder);
1695 $totalarray['nbfield']++;
1696 }
1697 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1698 print_liste_field_titre($arrayfields['cf.fk_soc']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
1699 $totalarray['nbfield']++;
1700 }
1701 if (!empty($arrayfields['s.name_alias']['checked'])) {
1702 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1703 print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], "s.name_alias", "", $param, '', $sortfield, $sortorder);
1704 $totalarray['nbfield']++;
1705 }
1706 if (!empty($arrayfields['s.town']['checked'])) {
1707 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1708 $totalarray['nbfield']++;
1709 }
1710 if (!empty($arrayfields['s.zip']['checked'])) {
1711 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1712 $totalarray['nbfield']++;
1713 }
1714 if (!empty($arrayfields['state.nom']['checked'])) {
1715 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1716 $totalarray['nbfield']++;
1717 }
1718 if (!empty($arrayfields['country.code_iso']['checked'])) {
1719 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1720 $totalarray['nbfield']++;
1721 }
1722 if (!empty($arrayfields['typent.code']['checked'])) {
1723 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1724 $totalarray['nbfield']++;
1725 }
1726 if (!empty($arrayfields['cf.fk_author']['checked'])) {
1727 print_liste_field_titre($arrayfields['cf.fk_author']['label'], $_SERVER["PHP_SELF"], "cf.fk_author", "", $param, '', $sortfield, $sortorder);
1728 $totalarray['nbfield']++;
1729 }
1730 if (!empty($arrayfields['cf.date_commande']['checked'])) {
1731 print_liste_field_titre($arrayfields['cf.date_commande']['label'], $_SERVER["PHP_SELF"], "cf.date_commande", "", $param, '', $sortfield, $sortorder, 'center ');
1732 $totalarray['nbfield']++;
1733 }
1734 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
1735 print_liste_field_titre($arrayfields['cf.date_livraison']['label'], $_SERVER["PHP_SELF"], 'cf.date_livraison', '', $param, '', $sortfield, $sortorder, 'center ');
1736 $totalarray['nbfield']++;
1737 }
1738 if (!empty($arrayfields['cf.total_ht']['checked'])) {
1739 print_liste_field_titre($arrayfields['cf.total_ht']['label'], $_SERVER["PHP_SELF"], "cf.total_ht", "", $param, '', $sortfield, $sortorder, 'right ');
1740 $totalarray['nbfield']++;
1741 }
1742 if (!empty($arrayfields['cf.total_tva']['checked'])) {
1743 print_liste_field_titre($arrayfields['cf.total_tva']['label'], $_SERVER["PHP_SELF"], "cf.total_tva", "", $param, '', $sortfield, $sortorder, 'right ');
1744 $totalarray['nbfield']++;
1745 }
1746 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
1747 print_liste_field_titre($arrayfields['cf.total_ttc']['label'], $_SERVER["PHP_SELF"], "cf.total_ttc", "", $param, '', $sortfield, $sortorder, 'right ');
1748 $totalarray['nbfield']++;
1749 }
1750 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
1751 print_liste_field_titre($arrayfields['cf.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_code', '', $param, '', $sortfield, $sortorder);
1752 $totalarray['nbfield']++;
1753 }
1754 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
1755 print_liste_field_titre($arrayfields['cf.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
1756 $totalarray['nbfield']++;
1757 }
1758 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
1759 print_liste_field_titre($arrayfields['cf.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder);
1760 $totalarray['nbfield']++;
1761 }
1762 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
1763 print_liste_field_titre($arrayfields['cf.multicurrency_total_tva']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder);
1764 $totalarray['nbfield']++;
1765 }
1766 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
1767 print_liste_field_titre($arrayfields['cf.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder);
1768 $totalarray['nbfield']++;
1769 }
1770 // Extra fields
1771 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1772 // Hook fields
1773 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1774 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1775 print $hookmanager->resPrint;
1776 if (!empty($arrayfields['cf.date_creation']['checked'])) {
1777 print_liste_field_titre($arrayfields['cf.date_creation']['label'], $_SERVER["PHP_SELF"], "cf.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1778 $totalarray['nbfield']++;
1779 }
1780 if (!empty($arrayfields['cf.tms']['checked'])) {
1781 print_liste_field_titre($arrayfields['cf.tms']['label'], $_SERVER["PHP_SELF"], "cf.tms", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1782 $totalarray['nbfield']++;
1783 }
1784 if (!empty($arrayfields['cf.billed']['checked'])) {
1785 print_liste_field_titre($arrayfields['cf.billed']['label'], $_SERVER["PHP_SELF"], 'cf.billed', '', $param, '', $sortfield, $sortorder, 'center ');
1786 $totalarray['nbfield']++;
1787 }
1788 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
1789 print_liste_field_titre($arrayfields['cf.fk_statut']['label'], $_SERVER["PHP_SELF"], "cf.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
1790 $totalarray['nbfield']++;
1791 }
1792 if (!empty($arrayfields['cf.date_valid']['checked'])) {
1793 print_liste_field_titre($arrayfields['cf.date_valid']['label'], $_SERVER["PHP_SELF"], "cf.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
1794 $totalarray['nbfield']++;
1795 }
1796 if (!empty($arrayfields['cf.date_approve']['checked'])) {
1797 print_liste_field_titre($arrayfields['cf.date_approve']['label'], $_SERVER["PHP_SELF"], 'cf.date_approve', '', $param, '', $sortfield, $sortorder, 'center ');
1798 $totalarray['nbfield']++;
1799 }
1800 if (!empty($arrayfields['cf.note_public']['checked'])) {
1801 print_liste_field_titre($arrayfields['cf.note_public']['label'], $_SERVER["PHP_SELF"], "cf.note_public", "", $param, '', $sortfield, $sortorder, 'center ');
1802 $totalarray['nbfield']++;
1803 }
1804 if (!empty($arrayfields['cf.note_private']['checked'])) {
1805 print_liste_field_titre($arrayfields['cf.note_private']['label'], $_SERVER["PHP_SELF"], "cf.note_private", "", $param, '', $sortfield, $sortorder, 'center ');
1806 $totalarray['nbfield']++;
1807 }
1808 if (!$conf->main_checkbox_left_column) {
1809 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1810 $totalarray['nbfield']++;
1811 }
1812 print "</tr>\n";
1813
1814 $total = 0;
1815 $subtotal = 0;
1816 $productstat_cache = array();
1817
1818 $userstatic = new User($db);
1819 $objectstatic = new CommandeFournisseur($db);
1820 $projectstatic = new Project($db);
1821
1822 $i = 0;
1823 $savnbfield = $totalarray['nbfield'];
1824 $totalarray = array('nbfield' => 0, 'val' => array(), 'pos' => array());
1825 $totalarray['val']['cf.total_ht'] = 0;
1826 $totalarray['val']['cf.total_ttc'] = 0;
1827 $totalarray['val']['cf.total_tva'] = 0;
1828
1829 $imaxinloop = ($limit ? min($num, $limit) : $num);
1830 while ($i < $imaxinloop) {
1831 $obj = $db->fetch_object($resql);
1832
1833 $notshippable = 0;
1834 $warning = 0;
1835 $text_info = '';
1836 $text_warning = '';
1837 $nbprod = 0;
1838
1839 $objectstatic->id = $obj->rowid;
1840 $objectstatic->ref = $obj->ref;
1841 $objectstatic->ref_supplier = $obj->ref_supplier;
1842 $objectstatic->socid = $obj->socid;
1843 $objectstatic->total_ht = $obj->total_ht;
1844 $objectstatic->total_tva = $obj->total_tva;
1845 $objectstatic->total_ttc = $obj->total_ttc;
1846 $objectstatic->date = $db->jdate($obj->date_commande);
1847 $objectstatic->date_commande = $db->jdate($obj->date_commande);
1848 $objectstatic->date_creation = $db->jdate($obj->date_creation);
1849 $objectstatic->delivery_date = $db->jdate($obj->delivery_date);
1850 $objectstatic->note_public = $obj->note_public;
1851 $objectstatic->note_private = $obj->note_private;
1852 $objectstatic->statut = $obj->fk_statut;
1853 $objectstatic->status = $obj->fk_statut;
1854
1855 if ($mode == 'kanban') {
1856 if ($i == 0) {
1857 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1858 print '<div class="box-flex-container kanban">';
1859 }
1860
1861 $thirdpartytmp->id = $obj->socid;
1862 $thirdpartytmp->name = $obj->name;
1863 $thirdpartytmp->email = $obj->email;
1864 $thirdpartytmp->name_alias = $obj->alias;
1865 $thirdpartytmp->client = $obj->client;
1866 $thirdpartytmp->fournisseur = $obj->fournisseur;
1867 // Output Kanban
1868 print $objectstatic->getKanbanView('', array('thirdparty' => $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1), 'selected' => in_array($objectstatic->id, $arrayofselected)));
1869 if ($i == ($imaxinloop - 1)) {
1870 print '</div>';
1871 print '</td></tr>';
1872 }
1873 } else {
1874 print '<tr class="oddeven row-with-select '.((getDolGlobalInt('MAIN_FINISHED_LINES_OPACITY') == 1 && $obj->billed == 1) ? 'opacitymedium' : '').'">';
1875 // Action column
1876 if ($conf->main_checkbox_left_column) {
1877 print '<td class="nowraponall center">';
1878 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1879 $selected = 0;
1880 if (in_array($obj->rowid, $arrayofselected)) {
1881 $selected = 1;
1882 }
1883 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1884 }
1885 print '</td>';
1886 if (!$i) {
1887 $totalarray['nbfield']++;
1888 }
1889 }
1890 // Ref
1891 if (!empty($arrayfields['cf.ref']['checked'])) {
1892 print '<td class="nowraponall">';
1893
1894 // Picto + Ref
1895 print $objectstatic->getNomUrl(1, '', 0, -1, 1);
1896 // Other picto tool
1897 $filename = dol_sanitizeFileName($obj->ref);
1898 $filedir = getMultidirOutput($objectstatic).'/'.dol_sanitizeFileName($obj->ref);
1899 print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1900
1901 print '</td>'."\n";
1902 if (!$i) {
1903 $totalarray['nbfield']++;
1904 }
1905 }
1906 // Ref Supplier
1907 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1908 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->ref_supplier).'">'.dol_escape_htmltag($obj->ref_supplier).'</td>'."\n";
1909 if (!$i) {
1910 $totalarray['nbfield']++;
1911 }
1912 }
1913 // Project
1914 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1915 $projectstatic->id = $obj->project_id;
1916 $projectstatic->ref = $obj->project_ref;
1917 $projectstatic->title = $obj->project_title;
1918 print '<td class="tdoverflowmax125">';
1919 if ($obj->project_id > 0) {
1920 print $projectstatic->getNomUrl(1);
1921 }
1922 print '</td>';
1923 if (!$i) {
1924 $totalarray['nbfield']++;
1925 }
1926 }
1927 // Author
1928 $userstatic->id = $obj->fk_user_author;
1929 $userstatic->lastname = $obj->lastname;
1930 $userstatic->firstname = $obj->firstname;
1931 $userstatic->login = $obj->login;
1932 $userstatic->photo = $obj->photo;
1933 $userstatic->email = $obj->user_email;
1934 $userstatic->status = $obj->user_status;
1935 if (!empty($arrayfields['u.login']['checked'])) {
1936 print '<td class="tdoverflowmax150">';
1937 if ($userstatic->id) {
1938 print $userstatic->getNomUrl(1);
1939 }
1940 print "</td>";
1941 if (!$i) {
1942 $totalarray['nbfield']++;
1943 }
1944 }
1945 // Thirdparty
1946 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1947 print '<td class="tdoverflowmax150">';
1948 $thirdpartytmp->id = $obj->socid;
1949 $thirdpartytmp->name = $obj->name;
1950 $thirdpartytmp->email = $obj->email;
1951 $thirdpartytmp->name_alias = $obj->alias;
1952 $thirdpartytmp->client = $obj->client;
1953 $thirdpartytmp->fournisseur = $obj->fournisseur;
1954 print $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
1955 print '</td>'."\n";
1956 if (!$i) {
1957 $totalarray['nbfield']++;
1958 }
1959 }
1960 // Alias
1961 if (!empty($arrayfields['s.name_alias']['checked'])) {
1962 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->alias).'">';
1963 print dol_escape_htmltag($obj->alias);
1964 print '</td>'."\n";
1965 if (!$i) {
1966 $totalarray['nbfield']++;
1967 }
1968 }
1969 // Town
1970 if (!empty($arrayfields['s.town']['checked'])) {
1971 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->town).'">';
1972 print dol_escape_htmltag($obj->town);
1973 print '</td>';
1974 if (!$i) {
1975 $totalarray['nbfield']++;
1976 }
1977 }
1978 // Zip
1979 if (!empty($arrayfields['s.zip']['checked'])) {
1980 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->zip).'">';
1981 print dol_escape_htmltag($obj->zip);
1982 print '</td>';
1983 if (!$i) {
1984 $totalarray['nbfield']++;
1985 }
1986 }
1987 // State
1988 if (!empty($arrayfields['state.nom']['checked'])) {
1989 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->state_name).'">'.dol_escape_htmltag($obj->state_name)."</td>\n";
1990 if (!$i) {
1991 $totalarray['nbfield']++;
1992 }
1993 }
1994 // Country
1995 if (!empty($arrayfields['country.code_iso']['checked'])) {
1996 print '<td class="center">';
1997 $tmparray = getCountry($obj->fk_pays, 'all');
1998 print $tmparray['label'];
1999 print '</td>';
2000 if (!$i) {
2001 $totalarray['nbfield']++;
2002 }
2003 }
2004 // Type ent
2005 if (!empty($arrayfields['typent.code']['checked'])) {
2006 print '<td class="center">';
2007 if (empty($typenArray)) {
2008 $typenArray = $formcompany->typent_array(1);
2009 }
2010 print $typenArray[$obj->typent_code];
2011 print '</td>';
2012 if (!$i) {
2013 $totalarray['nbfield']++;
2014 }
2015 }
2016
2017 // Order date
2018 if (!empty($arrayfields['cf.date_commande']['checked'])) {
2019 print '<td class="center">';
2020 print dol_print_date($db->jdate($obj->date_commande), 'day');
2021 if ($objectstatic->statut != $objectstatic::STATUS_ORDERSENT && $objectstatic->statut != $objectstatic::STATUS_RECEIVED_PARTIALLY) {
2022 if ($objectstatic->hasDelay()) {
2023 print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning");
2024 }
2025 }
2026 print '</td>';
2027 if (!$i) {
2028 $totalarray['nbfield']++;
2029 }
2030 }
2031 // Plannned date of delivery
2032 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
2033 print '<td class="center">';
2034 print dol_print_date($db->jdate($obj->delivery_date), 'day');
2035 if ($objectstatic->statut == $objectstatic::STATUS_ORDERSENT || $objectstatic->statut == $objectstatic::STATUS_RECEIVED_PARTIALLY) {
2036 if ($objectstatic->hasDelay()) {
2037 print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning");
2038 }
2039 }
2040 print '</td>';
2041 if (!$i) {
2042 $totalarray['nbfield']++;
2043 }
2044 }
2045 // Amount HT
2046 if (!empty($arrayfields['cf.total_ht']['checked'])) {
2047 print '<td class="right"><span class="amount">'.price($obj->total_ht)."</span></td>\n";
2048 if (!$i) {
2049 $totalarray['nbfield']++;
2050 }
2051 if (!$i) {
2052 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ht';
2053 }
2054 $totalarray['val']['cf.total_ht'] += $obj->total_ht;
2055 }
2056 // Amount VAT
2057 if (!empty($arrayfields['cf.total_tva']['checked'])) {
2058 print '<td class="right"><span class="amount">'.price($obj->total_tva)."</span></td>\n";
2059 if (!$i) {
2060 $totalarray['nbfield']++;
2061 }
2062 if (!$i) {
2063 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_tva';
2064 }
2065 $totalarray['val']['cf.total_tva'] += $obj->total_tva;
2066 }
2067 // Amount TTC
2068 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
2069 print '<td class="right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n";
2070 if (!$i) {
2071 $totalarray['nbfield']++;
2072 }
2073 if (!$i) {
2074 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ttc';
2075 }
2076 $totalarray['val']['cf.total_ttc'] += $obj->total_ttc;
2077 }
2078
2079 // Currency
2080 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
2081 print '<td class="nowrap">'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."</td>\n";
2082 if (!$i) {
2083 $totalarray['nbfield']++;
2084 }
2085 }
2086
2087 // Currency rate
2088 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
2089 print '<td class="nowrap">';
2090 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
2091 print "</td>\n";
2092 if (!$i) {
2093 $totalarray['nbfield']++;
2094 }
2095 }
2096 // Amount HT
2097 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
2098 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ht)."</span></td>\n";
2099 if (!$i) {
2100 $totalarray['nbfield']++;
2101 }
2102 }
2103 // Amount VAT
2104 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
2105 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_tva)."</span></td>\n";
2106 if (!$i) {
2107 $totalarray['nbfield']++;
2108 }
2109 }
2110 // Amount TTC
2111 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
2112 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ttc)."</span></td>\n";
2113 if (!$i) {
2114 $totalarray['nbfield']++;
2115 }
2116 }
2117
2118 // Extra fields
2119 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
2120 // Fields from hook
2121 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
2122 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
2123 print $hookmanager->resPrint;
2124 // Date creation
2125 if (!empty($arrayfields['cf.date_creation']['checked'])) {
2126 print '<td class="center nowraponall">';
2127 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
2128 print '</td>';
2129 if (!$i) {
2130 $totalarray['nbfield']++;
2131 }
2132 }
2133 // Date modification
2134 if (!empty($arrayfields['cf.tms']['checked'])) {
2135 print '<td class="center nowraponall">';
2136 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
2137 print '</td>';
2138 if (!$i) {
2139 $totalarray['nbfield']++;
2140 }
2141 }
2142 // Billed
2143 if (!empty($arrayfields['cf.billed']['checked'])) {
2144 print '<td class="center">';
2145 if ($obj->billed) {
2146 print yn($obj->billed, $langs->trans("Billed"));
2147 }
2148 print '</td>';
2149 if (!$i) {
2150 $totalarray['nbfield']++;
2151 }
2152 }
2153 // Status
2154 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
2155 print '<td class="center nowrap">'.$objectstatic->LibStatut($obj->fk_statut, 5, $obj->billed).'</td>';
2156 if (!$i) {
2157 $totalarray['nbfield']++;
2158 }
2159 }
2160
2161 // valid date
2162 if (!empty($arrayfields['cf.date_valid']['checked'])) {
2163 print '<td class="center">';
2164 print dol_print_date($db->jdate($obj->date_valid), 'day');
2165 print '</td>';
2166 if (!$i) {
2167 $totalarray['nbfield']++;
2168 }
2169 }
2170 // approve date
2171 if (!empty($arrayfields['cf.date_approve']['checked'])) {
2172 print '<td class="center">';
2173 print dol_print_date($db->jdate($obj->date_approve), 'day');
2174 print '</td>';
2175 if (!$i) {
2176 $totalarray['nbfield']++;
2177 }
2178 }
2179 // Note public
2180 if (!empty($arrayfields['cf.note_public']['checked'])) {
2181 print '<td class="sensiblehtmlcontent center">';
2182 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_public, 5)).'</div>';
2183 print '</td>';
2184 if (!$i) {
2185 $totalarray['nbfield']++;
2186 }
2187 }
2188
2189 // Note private
2190 if (!empty($arrayfields['cf.note_private']['checked'])) {
2191 print '<td class="sensiblehtmlcontent center">';
2192 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_private, 5)).'</div>';
2193 print '</td>';
2194 if (!$i) {
2195 $totalarray['nbfield']++;
2196 }
2197 }
2198
2199 // Action column
2200 if (!$conf->main_checkbox_left_column) {
2201 print '<td class="nowrap center">';
2202 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2203 $selected = 0;
2204 if (in_array($obj->rowid, $arrayofselected)) {
2205 $selected = 1;
2206 }
2207 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
2208 }
2209 print '</td>';
2210 if (!$i) {
2211 $totalarray['nbfield']++;
2212 }
2213 }
2214
2215 print "</tr>\n";
2216
2217 $total += $obj->total_ht;
2218 $subtotal += $obj->total_ht;
2219 }
2220 $i++;
2221 }
2222
2223 // Show total line
2224 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
2225
2226 // If no record found
2227 if ($num == 0) {
2228 $colspan = 1;
2229 foreach ($arrayfields as $key => $val) {
2230 if (!empty($val['checked'])) {
2231 $colspan++;
2232 }
2233 }
2234 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2235 }
2236
2237 $db->free($resql);
2238
2239 $parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
2240 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
2241 print $hookmanager->resPrint;
2242
2243 print '</table>'."\n";
2244 print '</div>';
2245
2246 print '</form>'."\n";
2247
2248 $hidegeneratedfilelistifempty = 1;
2249 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
2250 $hidegeneratedfilelistifempty = 0;
2251 }
2252
2253 // Show list of available documents
2254 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
2255 $urlsource .= str_replace('&amp;', '&', $param);
2256
2257 $filedir = $diroutputmassaction;
2258 $genallowed = $permissiontoread;
2259 $delallowed = $permissiontoadd;
2260
2261 print $formfile->showdocuments('massfilesarea_supplier_order', '', $filedir, $urlsource, 0, (int) $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
2262} else {
2263 dol_print_error($db);
2264}
2265
2266// End of page
2267llxFooter();
2268$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage predefined suppliers products.
Class to manage absolute discounts.
Class to manage suppliers invoices.
Class to manage forms for categories.
Class to build HTML component for third parties management Only common components are here.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage HTML output components for orders Before adding component here, check they are not in...
Class to help generate other html components Only common components are here.
Class to manage suppliers.
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.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
getMultidirTemp($object, $module='', $forobject=0)
Return the full path of the directory where a module (or an object of a module) stores its temporary ...
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Definition html.lib.php:181
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.