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 $objecttmp->update($user);
608 }
609
610 $cmd->classifyBilled($user); // TODO Move this in workflow like done for sales orders
611
612 if (!empty($createbills_onebythird) && empty($TFactThird[$cmd->socid])) {
613 $TFactThird[$cmd->socid] = $objecttmp;
614 } else {
615 $TFact[$objecttmp->id] = $objecttmp;
616 }
617 }
618
619 // Build doc with all invoices
620 $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird;
621 $toselect = array();
622
623 if (!$error && $validate_invoices) {
624 $massaction = $action = 'builddoc';
625
626 foreach ($TAllFact as &$objecttmp) {
627 $objecttmp->validate($user);
628 if ($result <= 0) {
629 $error++;
630 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
631 break;
632 }
633
634 $id = $objecttmp->id; // For builddoc action
635
636 // Fac builddoc
637 $donotredirect = 1;
638 $upload_dir = getMultidirOutput($objecttmp);
639 $permissiontoadd = ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"));
640 //include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
641 }
642
643 $massaction = $action = 'confirm_createsupplierbills';
644 }
645
646 if (!$error) {
647 $db->commit();
648
649 if ($nb_bills_created == 1) {
650 $texttoshow = $langs->trans('BillXCreated', '{s1}');
651 $texttoshow = str_replace('{s1}', '<a href="'.DOL_URL_ROOT.'/fourn/facture/card.php?id='.urlencode((string) ($lastid)).'">'.$lastref.'</a>', $texttoshow);
652 setEventMessages($texttoshow, null, 'mesgs');
653 } else {
654 setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs');
655 }
656
657 // Make a redirect to avoid to bill twice if we make a refresh or back
658 $param = '';
659 if (!empty($mode)) {
660 $param .= '&mode='.urlencode($mode);
661 }
662 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
663 $param .= '&contextpage='.urlencode($contextpage);
664 }
665 if ($limit > 0 && $limit != $conf->liste_limit) {
666 $param .= '&limit='.((int) $limit);
667 }
668 if ($search_all) {
669 $param .= '&search_all='.urlencode($search_all);
670 }
671 if ($socid > 0) {
672 $param .= '&socid='.urlencode((string) ($socid));
673 }
674 if ($search_status != '') {
675 $param .= '&search_status='.urlencode($search_status);
676 }
677 if ($search_option) {
678 $param .= '&search_option='.urlencode($search_option);
679 }
680 if ($search_date_order_startday) {
681 $param .= '&search_date_order_startday='.urlencode((string) ($search_date_order_startday));
682 }
683 if ($search_date_order_startmonth) {
684 $param .= '&search_date_order_startmonth='.urlencode((string) ($search_date_order_startmonth));
685 }
686 if ($search_date_order_startyear) {
687 $param .= '&search_date_order_startyear='.urlencode((string) ($search_date_order_startyear));
688 }
689 if ($search_date_order_endday) {
690 $param .= '&search_date_order_endday='.urlencode((string) ($search_date_order_endday));
691 }
692 if ($search_date_order_endmonth) {
693 $param .= '&search_date_order_endmonth='.urlencode((string) ($search_date_order_endmonth));
694 }
695 if ($search_date_order_endyear) {
696 $param .= '&search_date_order_endyear='.urlencode((string) ($search_date_order_endyear));
697 }
698 if ($search_date_delivery_startday) {
699 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
700 }
701 if ($search_date_delivery_startmonth) {
702 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
703 }
704 if ($search_date_delivery_startyear) {
705 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
706 }
707 if ($search_date_delivery_endday) {
708 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
709 }
710 if ($search_date_delivery_endmonth) {
711 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
712 }
713 if ($search_date_delivery_endyear) {
714 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
715 }
716 if ($search_date_valid_startday) {
717 $param .= '&search_date_valid_startday='.urlencode((string) ($search_date_valid_startday));
718 }
719 if ($search_date_valid_startmonth) {
720 $param .= '&search_date_valid_startmonth='.urlencode((string) ($search_date_valid_startmonth));
721 }
722 if ($search_date_valid_startyear) {
723 $param .= '&search_date_valid_startyear='.urlencode((string) ($search_date_valid_startyear));
724 }
725 if ($search_date_valid_endday) {
726 $param .= '&search_date_valid_endday='.urlencode((string) ($search_date_valid_endday));
727 }
728 if ($search_date_valid_endmonth) {
729 $param .= '&search_date_valid_endmonth='.urlencode((string) ($search_date_valid_endmonth));
730 }
731 if ($search_date_valid_endyear) {
732 $param .= '&search_date_valid_endyear='.urlencode((string) ($search_date_valid_endyear));
733 }
734 if ($search_date_approve_startday) {
735 $param .= '&search_date_approve_startday='.urlencode((string) ($search_date_approve_startday));
736 }
737 if ($search_date_approve_startmonth) {
738 $param .= '&search_date_approve_startmonth='.urlencode((string) ($search_date_approve_startmonth));
739 }
740 if ($search_date_approve_startyear) {
741 $param .= '&search_date_approve_startyear='.urlencode((string) ($search_date_approve_startyear));
742 }
743 if ($search_date_approve_endday) {
744 $param .= '&search_date_approve_endday='.urlencode((string) ($search_date_approve_endday));
745 }
746 if ($search_date_approve_endmonth) {
747 $param .= '&search_date_approve_endmonth='.urlencode((string) ($search_date_approve_endmonth));
748 }
749 if ($search_date_approve_endyear) {
750 $param .= '&search_date_approve_endyear='.urlencode((string) ($search_date_approve_endyear));
751 }
752 if ($search_ref) {
753 $param .= '&search_ref='.urlencode($search_ref);
754 }
755 if ($search_company) {
756 $param .= '&search_company='.urlencode($search_company);
757 }
758 if ($search_company_alias) {
759 $param .= '&search_company_alias='.urlencode($search_company_alias);
760 }
761 //if ($search_ref_customer) $param .= '&search_ref_customer='.urlencode($search_ref_customer);
762 if ($search_user > 0) {
763 $param .= '&search_user='.urlencode((string) ($search_user));
764 }
765 if ($searchCategorySupplierOrderOperator == 1) {
766 $param .= "&search_category_supplier_order_operator=".urlencode((string) ($searchCategorySupplierOrderOperator));
767 }
768 foreach ($searchCategorySupplierOrderList as $searchCategorySupplierOrder) {
769 $param .= "&search_category_order_list[]=".urlencode($searchCategorySupplierOrder);
770 }
771 if ($search_sale > 0) {
772 $param .= '&search_sale='.urlencode($search_sale);
773 }
774 if ($search_total_ht != '') {
775 $param .= '&search_total_ht='.urlencode($search_total_ht);
776 }
777 if ($search_total_tva != '') {
778 $param .= '&search_total_tva='.urlencode($search_total_tva);
779 }
780 if ($search_total_ttc != '') {
781 $param .= '&search_total_ttc='.urlencode($search_total_ttc);
782 }
783 if ($search_project_ref >= 0) {
784 $param .= "&search_project_ref=".urlencode($search_project_ref);
785 }
786 if ($show_files) {
787 $param .= '&show_files='.urlencode((string) ($show_files));
788 }
789 if ($optioncss != '') {
790 $param .= '&optioncss='.urlencode($optioncss);
791 }
792 if ($billed != '') {
793 $param .= '&billed='.((int) ($billed));
794 }
795
796 header("Location: ".$_SERVER['PHP_SELF'].'?'.$param);
797 exit;
798 } else {
799 $db->rollback();
800 $action = 'create';
801 $_GET["origin"] = GETPOST("origin", 'alpha');
802 $_GET["originid"] = GETPOSTINT("originid");
803 setEventMessages("Error", null, 'errors');
804 $error++;
805 }
806 }
807}
808
809
810/*
811 * View
812 */
813
814$now = dol_now();
815
816$form = new Form($db);
817$thirdpartytmp = new Fournisseur($db);
818$commandestatic = new CommandeFournisseur($db);
819$formfile = new FormFile($db);
820$formorder = new FormOrder($db);
821$formother = new FormOther($db);
822$formcompany = new FormCompany($db);
823
824$title = $langs->trans("SuppliersOrders");
825if ($socid > 0) {
826 $fourn = new Fournisseur($db);
827 $fourn->fetch($socid);
828 $title .= ' - '.$fourn->name;
829}
830
831if ($billed > 0) {
832 $title .= ' - '.$langs->trans("Billed");
833}
834
835//$help_url="EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
836$help_url = '';
837
838$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
839$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
840
841$sql = 'SELECT';
842if ($search_all) {
843 $sql = 'SELECT DISTINCT';
844}
845$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,';
846$sql .= " typent.code as typent_code,";
847$sql .= " state.code_departement as state_code, state.nom as state_name,";
848$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,";
849$sql .= ' cf.localtax1 as total_localtax1, cf.localtax2 as total_localtax2,';
850$sql .= ' cf.fk_multicurrency, cf.multicurrency_code, cf.multicurrency_tx, cf.multicurrency_total_ht, cf.multicurrency_total_tva, cf.multicurrency_total_ttc,';
851$sql .= ' cf.date_creation as date_creation, cf.tms as date_modification,';
852$sql .= ' cf.note_public, cf.note_private,';
853$sql .= " p.rowid as project_id, p.ref as project_ref, p.title as project_title,";
854$sql .= " u.firstname, u.lastname, u.photo, u.login, u.email as user_email, u.statut as user_status";
855// Add fields from extrafields
856if (!empty($extrafields->attributes[$object->table_element]['label'])) {
857 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
858 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
859 }
860}
861// Add fields from hooks
862$parameters = array();
863$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
864$sql .= $hookmanager->resPrint;
865
866$sqlfields = $sql; // $sql fields to remove for count total
867
868$sql .= " FROM ".MAIN_DB_PREFIX."societe as s";
869$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
870$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
871$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
872$sql .= ", ".MAIN_DB_PREFIX."commande_fournisseur as cf";
873if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
874 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (cf.rowid = ef.fk_object)";
875}
876if ($search_all) {
877 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'commande_fournisseurdet as pd ON cf.rowid=pd.fk_commande';
878}
879$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON cf.fk_user_author = u.rowid";
880$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = cf.fk_projet";
881$parameters = array();
882$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
883$sql .= $hookmanager->resPrint;
884$sql .= ' WHERE cf.fk_soc = s.rowid';
885$sql .= ' AND cf.entity IN ('.getEntity('supplier_order').')';
886if ($socid > 0) {
887 $sql .= " AND s.rowid = ".((int) $socid);
888}
889if ($search_ref) {
890 $sql .= natural_search('cf.ref', $search_ref);
891}
892if ($search_refsupp) {
893 $sql .= natural_search("cf.ref_supplier", $search_refsupp);
894}
895if ($search_all) {
896 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
897}
898if (empty($arrayfields['s.name_alias']['checked']) && $search_company) {
899 $sql .= natural_search(array("s.nom", "s.name_alias"), $search_company);
900} else {
901 if ($search_company) {
902 $sql .= natural_search('s.nom', $search_company);
903 }
904 if ($search_company_alias) {
905 $sql .= natural_search('s.name_alias', $search_company_alias);
906 }
907}
908if ($search_request_author) {
909 $sql .= natural_search(array('u.lastname', 'u.firstname', 'u.login'), $search_request_author);
910}
911if ($billed != '' && $billed != '-1') {
912 $sql .= " AND cf.billed = ".((int) $billed);
913}
914//Required triple check because statut=0 means draft filter
915if (GETPOST('statut', 'intcomma') !== '') {
916 $sql .= " AND cf.fk_statut IN (".$db->sanitize($db->escape($db->escape(GETPOST('statut', 'intcomma')))).")";
917}
918if ($search_status != '' && $search_status != '-1') {
919 $sql .= " AND cf.fk_statut IN (".$db->sanitize($db->escape($search_status)).")";
920}
921if ($search_option == 'late') {
922 $sql .= " AND cf.date_commande < '".$db->idate(dol_now() - $conf->order->fournisseur->warning_delay)."'";
923}
924if ($search_date_order_start) {
925 $sql .= " AND cf.date_commande >= '".$db->idate($search_date_order_start)."'";
926}
927if ($search_date_order_end) {
928 $sql .= " AND cf.date_commande <= '".$db->idate($search_date_order_end)."'";
929}
930if ($search_date_delivery_start) {
931 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_delivery_start)."'";
932}
933if ($search_date_delivery_end) {
934 $sql .= " AND cf.date_livraison <= '".$db->idate($search_date_delivery_end)."'";
935}
936if ($search_date_valid_start) {
937 $sql .= " AND cf.date_valid >= '".$db->idate($search_date_valid_start)."'";
938}
939if ($search_note_public) {
940 $sql .= " AND cf.note_public LIKE '%".$db->escape($db->escapeforlike($search_note_public))."%'";
941}
942if ($search_date_approve_start) {
943 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_approve_start)."'";
944}
945if ($search_date_valid_end) {
946 $sql .= " AND cf.date_valid <= '".$db->idate($search_date_valid_end)."'";
947}
948if ($search_date_approve_start) {
949 $sql .= " AND cf.date_livraison >= '".$db->idate($search_date_approve_start)."'";
950}
951if ($search_date_approve_end) {
952 $sql .= " AND cf.date_livraison <= '".$db->idate($search_date_approve_end)."'";
953}
954if ($search_town) {
955 $sql .= natural_search('s.town', $search_town);
956}
957if ($search_zip) {
958 $sql .= natural_search("s.zip", $search_zip);
959}
960if ($search_state) {
961 $sql .= natural_search("state.nom", $search_state);
962}
963if ($search_country) {
964 $sql .= " AND s.fk_pays IN (".$db->sanitize($db->escape($search_country)).')';
965}
966if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
967 $sql .= " AND s.fk_typent IN (".$db->sanitize($db->escape($search_type_thirdparty)).')';
968}
969/*if ($search_sale > 0) {
970 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $search_sale);
971}*/
972if ($search_user > 0) {
973 $sql .= " AND EXISTS (";
974 $sql .= " SELECT ec.rowid ";
975 $sql .= " FROM " . MAIN_DB_PREFIX . "element_contact as ec";
976 $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "c_type_contact as tc ON tc.rowid = ec.fk_c_type_contact";
977 $sql .= " WHERE ec.element_id = cf.rowid AND ec.fk_socpeople = " . ((int) $search_user);
978 $sql .= " AND tc.element = 'order_supplier' AND tc.source = 'internal'";
979 $sql .= ")";
980}
981if ($search_total_ht != '') {
982 $sql .= natural_search('cf.total_ht', $search_total_ht, 1);
983}
984if ($search_total_tva != '') {
985 $sql .= natural_search('cf.total_tva', $search_total_tva, 1);
986}
987if ($search_total_ttc != '') {
988 $sql .= natural_search('cf.total_ttc', $search_total_ttc, 1);
989}
990if ($search_multicurrency_code != '') {
991 $sql .= " AND cf.multicurrency_code = '".$db->escape($search_multicurrency_code)."'";
992}
993if ($search_multicurrency_tx != '') {
994 $sql .= natural_search('cf.multicurrency_tx', $search_multicurrency_tx, 1);
995}
996if ($search_multicurrency_montant_ht != '') {
997 $sql .= natural_search('cf.multicurrency_total_ht', $search_multicurrency_montant_ht, 1);
998}
999if ($search_multicurrency_montant_tva != '') {
1000 $sql .= natural_search('cf.multicurrency_total_tva', $search_multicurrency_montant_tva, 1);
1001}
1002if ($search_multicurrency_montant_ttc != '') {
1003 $sql .= natural_search('cf.multicurrency_total_ttc', $search_multicurrency_montant_ttc, 1);
1004}
1005if ($search_project_ref != '') {
1006 $sql .= natural_search("p.ref", $search_project_ref);
1007}
1008// Search on sale representative
1009if ($search_sale && $search_sale != '-1') {
1010 if ($search_sale == -2) {
1011 $sql .= " AND ".getSalesRepresentativeSqlFilter('cf.fk_soc', 0, 1);
1012 } elseif ($search_sale > 0) {
1013 $sql .= " AND ".getSalesRepresentativeSqlFilter('cf.fk_soc', (int) $search_sale);
1014 }
1015}
1016// Search for tag/category ($searchCategorySupplierOrderList is an array of ID)
1017if (!empty($searchCategorySupplierOrderList)) {
1018 $searchCategorySupplierOrderSqlList = array();
1019 $listofcategoryid = '';
1020 foreach ($searchCategorySupplierOrderList as $searchCategorySupplierOrder) {
1021 if (intval($searchCategorySupplierOrder) == -2) {
1022 $searchCategorySupplierOrderSqlList[] = "NOT EXISTS (SELECT ck.fk_supplier_order FROM ".MAIN_DB_PREFIX."categorie_supplier_order as ck WHERE cf.rowid = ck.fk_supplier_order)";
1023 } elseif (intval($searchCategorySupplierOrder) > 0) {
1024 if ($searchCategorySupplierOrderOperator == 0) {
1025 $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).")";
1026 } else {
1027 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategorySupplierOrder);
1028 }
1029 }
1030 }
1031 if ($listofcategoryid) {
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 IN (".$db->sanitize($listofcategoryid)."))";
1033 }
1034 if ($searchCategorySupplierOrderOperator == 1) {
1035 if (!empty($searchCategorySupplierOrderSqlList)) {
1036 $sql .= " AND (".implode(' OR ', $searchCategorySupplierOrderSqlList).")";
1037 }
1038 } else {
1039 if (!empty($searchCategorySupplierOrderSqlList)) {
1040 $sql .= " AND (".implode(' AND ', $searchCategorySupplierOrderSqlList).")";
1041 }
1042 }
1043}
1044// Search for tag/category ($searchCategoryProductList is an array of ID)
1045$searchCategoryProductOperator = GETPOSTINT('search_category_product_operator');
1046$searchCategoryProductList = array($search_product_category);
1047if (!empty($searchCategoryProductList)) {
1048 $searchCategoryProductSqlList = array();
1049 $listofcategoryid = '';
1050 foreach ($searchCategoryProductList as $searchCategoryProduct) {
1051 if (intval($searchCategoryProduct) == -2) {
1052 $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)";
1053 } elseif (intval($searchCategoryProduct) > 0) {
1054 if ($searchCategoryProductOperator == 0) {
1055 $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).")";
1056 } else {
1057 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
1058 }
1059 }
1060 }
1061 if ($listofcategoryid) {
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 IN (".$db->sanitize($listofcategoryid)."))";
1063 }
1064 if ($searchCategoryProductOperator == 1) {
1065 if (!empty($searchCategoryProductSqlList)) {
1066 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
1067 }
1068 } else {
1069 if (!empty($searchCategoryProductSqlList)) {
1070 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
1071 }
1072 }
1073}
1074// Add where from extra fields
1075include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
1076// Add where from hooks
1077$parameters = array();
1078$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
1079$sql .= $hookmanager->resPrint;
1080
1081// Count total nb of records
1082$nbtotalofrecords = '';
1083if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
1084 /* The fast and low memory method to get and count full list converts the sql into a sql count */
1085 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
1086 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
1087 $resql = $db->query($sqlforcount);
1088 if ($resql) {
1089 $objforcount = $db->fetch_object($resql);
1090 $nbtotalofrecords = $objforcount->nbtotalofrecords;
1091 } else {
1093 }
1094
1095 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
1096 $page = 0;
1097 $offset = 0;
1098 }
1099 $db->free($resql);
1100}
1101
1102$sql .= $db->order($sortfield, $sortorder);
1103if ($limit) {
1104 $sql .= $db->plimit($limit + 1, $offset);
1105}
1106//print $sql;
1107
1108$resql = $db->query($sql);
1109if ($resql) {
1110 $num = $db->num_rows($resql);
1111
1112 $arrayofselected = is_array($toselect) ? $toselect : array();
1113
1114 if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all) {
1115 $obj = $db->fetch_object($resql);
1116 $id = $obj->rowid;
1117 header("Location: ".DOL_URL_ROOT.'/fourn/commande/card.php?id='.$id);
1118 exit;
1119 }
1120
1121 llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-supplier-order page-list');
1122
1123 $param = '';
1124 if (!empty($mode)) {
1125 $param .= '&mode='.urlencode($mode);
1126 }
1127 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
1128 $param .= '&contextpage='.urlencode($contextpage);
1129 }
1130 if ($limit > 0 && $limit != $conf->liste_limit) {
1131 $param .= '&limit='.((int) $limit);
1132 }
1133 if ($search_all) {
1134 $param .= '&search_all='.urlencode($search_all);
1135 }
1136 if ($socid > 0) {
1137 $param .= '&socid='.urlencode((string) ($socid));
1138 }
1139 if ($search_all) {
1140 $param .= "&search_all=".urlencode($search_all);
1141 }
1142 if ($search_date_order_startday) {
1143 $param .= '&search_date_order_startday='.urlencode((string) ($search_date_order_startday));
1144 }
1145 if ($search_date_order_startmonth) {
1146 $param .= '&search_date_order_startmonth='.urlencode((string) ($search_date_order_startmonth));
1147 }
1148 if ($search_date_order_startyear) {
1149 $param .= '&search_date_order_startyear='.urlencode((string) ($search_date_order_startyear));
1150 }
1151 if ($search_date_order_endday) {
1152 $param .= '&search_date_order_endday='.urlencode((string) ($search_date_order_endday));
1153 }
1154 if ($search_date_order_endmonth) {
1155 $param .= '&search_date_order_endmonth='.urlencode((string) ($search_date_order_endmonth));
1156 }
1157 if ($search_date_order_endyear) {
1158 $param .= '&search_date_order_endyear='.urlencode((string) ($search_date_order_endyear));
1159 }
1160 if ($search_date_delivery_startday) {
1161 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
1162 }
1163 if ($search_date_delivery_startmonth) {
1164 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
1165 }
1166 if ($search_date_delivery_startyear) {
1167 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
1168 }
1169 if ($search_date_delivery_endday) {
1170 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
1171 }
1172 if ($search_date_delivery_endmonth) {
1173 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
1174 }
1175 if ($search_date_delivery_endyear) {
1176 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
1177 }
1178 if ($search_date_valid_startday) {
1179 $param .= '&search_date_valid_startday='.urlencode((string) ($search_date_valid_startday));
1180 }
1181 if ($search_date_valid_startmonth) {
1182 $param .= '&search_date_valid_startmonth='.urlencode((string) ($search_date_valid_startmonth));
1183 }
1184 if ($search_date_valid_startyear) {
1185 $param .= '&search_date_valid_startyear='.urlencode((string) ($search_date_valid_startyear));
1186 }
1187 if ($search_date_valid_endday) {
1188 $param .= '&search_date_valid_endday='.urlencode((string) ($search_date_valid_endday));
1189 }
1190 if ($search_date_valid_endmonth) {
1191 $param .= '&search_date_valid_endmonth='.urlencode((string) ($search_date_valid_endmonth));
1192 }
1193 if ($search_date_valid_endyear) {
1194 $param .= '&search_date_valid_endyear='.urlencode((string) ($search_date_valid_endyear));
1195 }
1196 if ($search_date_approve_startday) {
1197 $param .= '&search_date_approve_startday='.urlencode((string) ($search_date_approve_startday));
1198 }
1199 if ($search_date_approve_startmonth) {
1200 $param .= '&search_date_approve_startmonth='.urlencode((string) ($search_date_approve_startmonth));
1201 }
1202 if ($search_date_approve_startyear) {
1203 $param .= '&search_date_approve_startyear='.urlencode((string) ($search_date_approve_startyear));
1204 }
1205 if ($search_date_approve_endday) {
1206 $param .= '&search_date_approve_endday='.urlencode((string) ($search_date_approve_endday));
1207 }
1208 if ($search_date_approve_endmonth) {
1209 $param .= '&search_date_approve_endmonth='.urlencode((string) ($search_date_approve_endmonth));
1210 }
1211 if ($search_date_approve_endyear) {
1212 $param .= '&search_date_approve_endyear='.urlencode((string) ($search_date_approve_endyear));
1213 }
1214 if ($search_ref) {
1215 $param .= '&search_ref='.urlencode($search_ref);
1216 }
1217 if ($search_company) {
1218 $param .= '&search_company='.urlencode($search_company);
1219 }
1220 if ($search_company_alias) {
1221 $param .= '&search_company_alias='.urlencode($search_company_alias);
1222 }
1223 if ($search_user > 0) {
1224 $param .= '&search_user='.urlencode((string) ($search_user));
1225 }
1226 if ($search_request_author) {
1227 $param .= '&search_request_author='.urlencode($search_request_author);
1228 }
1229 if ($search_sale > 0) {
1230 $param .= '&search_sale='.urlencode($search_sale);
1231 }
1232 if ($search_total_ht != '') {
1233 $param .= '&search_total_ht='.urlencode($search_total_ht);
1234 }
1235 if ($search_total_ttc != '') {
1236 $param .= "&search_total_ttc=".urlencode($search_total_ttc);
1237 }
1238 if ($search_multicurrency_code != '') {
1239 $param .= '&search_multicurrency_code='.urlencode($search_multicurrency_code);
1240 }
1241 if ($search_multicurrency_tx != '') {
1242 $param .= '&search_multicurrency_tx='.urlencode($search_multicurrency_tx);
1243 }
1244 if ($search_multicurrency_montant_ht != '') {
1245 $param .= '&search_multicurrency_montant_ht='.urlencode($search_multicurrency_montant_ht);
1246 }
1247 if ($search_multicurrency_montant_tva != '') {
1248 $param .= '&search_multicurrency_montant_tva='.urlencode($search_multicurrency_montant_tva);
1249 }
1250 if ($search_multicurrency_montant_ttc != '') {
1251 $param .= '&search_multicurrency_montant_ttc='.urlencode($search_multicurrency_montant_ttc);
1252 }
1253 if ($search_refsupp) {
1254 $param .= "&search_refsupp=".urlencode($search_refsupp);
1255 }
1256 if ($search_status != '' && $search_status != '-1') {
1257 $param .= "&search_status=".urlencode($search_status);
1258 }
1259 if ($search_option) {
1260 $param .= "&search_option=".urlencode($search_option);
1261 }
1262 if ($search_project_ref >= 0) {
1263 $param .= "&search_project_ref=".urlencode($search_project_ref);
1264 }
1265 if ($billed != '') {
1266 $param .= "&billed=".((int) $billed);
1267 }
1268 if ($show_files) {
1269 $param .= '&show_files='.urlencode((string) ($show_files));
1270 }
1271 if ($optioncss != '') {
1272 $param .= '&optioncss='.urlencode($optioncss);
1273 }
1274 if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
1275 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
1276 }
1277
1278 // Add $param from extra fields
1279 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1280
1281 $parameters = array('param' => &$param);
1282 $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
1283 $param .= $hookmanager->resPrint;
1284
1285 // List of mass actions available
1286 $arrayofmassactions = array(
1287 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1288 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1289 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
1290 );
1291 if (isModEnabled('category') && $user->hasRight("fournisseur", "commande", "lire")) {
1292 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
1293 }
1294 if ($permissiontovalidate) {
1295 if ($permissiontoapprove && !getDolGlobalString('SUPPLIER_ORDER_NO_DIRECT_APPROVE')) {
1296 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("ValidateAndApprove");
1297 } else {
1298 $arrayofmassactions['prevalidate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate");
1299 }
1300 }
1301
1302 if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight("supplier_invoice", "creer")) {
1303 $arrayofmassactions['createbills'] = img_picto('', 'supplier_invoice', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisSupplier");
1304 }
1305 if ($permissiontodelete) {
1306 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
1307 }
1308 if (in_array($massaction, array('presend', 'predelete', 'createbills'))) {
1309 $arrayofmassactions = array();
1310 }
1311 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1312
1313 $url = DOL_URL_ROOT.'/fourn/commande/card.php?action=create';
1314 if ($socid > 0) {
1315 $url .= '&socid='.((int) $socid);
1316 $url .= '&backtopage='.urlencode(DOL_URL_ROOT.'/fourn/commande/list.php?socid='.((int) $socid));
1317 }
1318 $newcardbutton = '';
1319 $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'));
1320 $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'));
1321 $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'));
1322 $newcardbutton .= dolGetButtonTitleSeparator();
1323 $newcardbutton .= dolGetButtonTitle($langs->trans('NewSupplierOrderShort'), '', 'fa fa-plus-circle', $url, '', (int) $permissiontoadd);
1324
1325 // Lines of title fields
1326 print '<form method="POST" id="searchFormList" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
1327 if ($optioncss != '') {
1328 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1329 }
1330 print '<input type="hidden" name="token" value="'.newToken().'">';
1331 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1332 print '<input type="hidden" name="action" value="list">';
1333 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1334 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1335 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
1336 print '<input type="hidden" name="socid" value="'.$socid.'">';
1337 print '<input type="hidden" name="mode" value="'.$mode.'">';
1338
1339 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'supplier_order', 0, $newcardbutton, '', $limit, 0, 0, 1);
1340
1341 $topicmail = "SendOrderRef";
1342 $modelmail = "order_supplier_send";
1343 $objecttmp = new CommandeFournisseur($db); // in case $object is not the good object
1344 $trackid = 'sord'.$object->id;
1345 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1346
1347 if ($massaction == 'prevalidate') {
1348 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassValidation"), $langs->trans("ConfirmMassValidationQuestion"), "validate", null, '', 0, 200, 500, 1);
1349 }
1350
1351 if ($massaction == 'createbills') {
1352 //var_dump($_REQUEST);
1353 print '<input type="hidden" name="massaction" value="confirm_createsupplierbills">';
1354
1355 print '<table class="noborder centpercent">';
1356 print '<tr>';
1357 print '<td class="titlefield">';
1358 print $langs->trans('DateInvoice');
1359 print '</td>';
1360 print '<td>';
1361 print $form->selectDate('', '', 0, 0, 0, '', 1, 1);
1362 print '</td>';
1363 print '</tr>';
1364 print '<tr>';
1365 print '<td>';
1366 print $langs->trans('CreateOneBillByThird');
1367 print '</td>';
1368 print '<td>';
1369 print $form->selectyesno('createbills_onebythird', '', 1);
1370 print '</td>';
1371 print '</tr>';
1372 print '<tr>';
1373 print '<td>';
1374 print $langs->trans('ValidateInvoices');
1375 print '</td>';
1376 print '<td>';
1377 print $form->selectyesno('validate_invoices', 1, 1);
1378 print '</td>';
1379 print '</tr>';
1380 print '</table>';
1381
1382 print '<div class="center">';
1383 print '<input type="submit" class="button" id="createbills" name="createbills" value="'.$langs->trans('CreateInvoiceForThisCustomer').'"> ';
1384 print '<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1385 print '</div>';
1386 print '<br>';
1387 print '<br>';
1388 }
1389
1390 if ($search_all) {
1391 foreach ($fieldstosearchall as $key => $val) {
1392 $fieldstosearchall[$key] = $langs->trans($val);
1393 }
1394 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1395 }
1396
1397 $moreforfilter = '';
1398 if (isModEnabled('category') && $user->hasRight('categorie', 'read')) {
1399 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcategory.class.php';
1400 $formcategory = new FormCategory($db);
1401 $moreforfilter .= $formcategory->getFilterBox(Categorie::TYPE_SUPPLIER_ORDER, $searchCategorySupplierOrderList, 'minwidth300', $searchCategorySupplierOrderOperator ? $searchCategorySupplierOrderOperator : 0);
1402 }
1403 // If the user can view prospects other than his'
1404 if ($user->hasRight("user", "user", "lire")) {
1405 $langs->load("commercial");
1406 $moreforfilter .= '<div class="divsearchfield">';
1407 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1408 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth250 widthcentpercentminusx');
1409 $moreforfilter .= '</div>';
1410 }
1411 // If the user can view other users
1412 if ($user->hasRight("user", "user", "lire")) {
1413 $moreforfilter .= '<div class="divsearchfield">';
1414 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1415 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"').$form->select_dolusers($search_user, 'search_user', $tmptitle, null, 0, '', '', '0', 0, 0, '', 0, '', 'maxwidth250 widthcentpercentminusx');
1416 $moreforfilter .= '</div>';
1417 }
1418 // If the user can view prospects other than his'
1419 if (isModEnabled('category') && $user->hasRight('categorie', 'lire') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
1420 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1421 $moreforfilter .= '<div class="divsearchfield">';
1422 $tmptitle = $langs->trans('IncludingProductWithTag');
1423 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, '', 'parent', 0, 0, 1);
1424 $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);
1425 $moreforfilter .= '</div>';
1426 }
1427 // alert on late date
1428 $moreforfilter .= '<div class="divsearchfield valignmiddle" title="'.$langs->trans("Alert").' '.$langs->trans("Late").'">';
1429 $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' : '').'>';
1430 $moreforfilter .= '</div>';
1431 $parameters = array();
1432 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1433 if (empty($reshook)) {
1434 $moreforfilter .= $hookmanager->resPrint;
1435 } else {
1436 $moreforfilter = $hookmanager->resPrint;
1437 }
1438
1439 if (!empty($moreforfilter)) {
1440 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1441 print $moreforfilter;
1442 print '</div>';
1443 }
1444
1445 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1446 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields
1447 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
1448
1449 if (GETPOSTINT('autoselectall')) {
1450 $selectedfields .= '<script>';
1451 $selectedfields .= ' $(document).ready(function() {';
1452 $selectedfields .= ' console.log("Autoclick on checkforselects");';
1453 $selectedfields .= ' $("#checkforselects").click();';
1454 $selectedfields .= ' $("#massaction").val("createbills").change();';
1455 $selectedfields .= ' });';
1456 $selectedfields .= '</script>';
1457 }
1458
1459 print '<div class="div-table-responsive">';
1460 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1461
1462 print '<tr class="liste_titre_filter">';
1463 // Action column
1464 if ($conf->main_checkbox_left_column) {
1465 print '<td class="liste_titre middle">';
1466 $searchpicto = $form->showFilterButtons('left');
1467 print $searchpicto;
1468 print '</td>';
1469 }
1470 // Ref
1471 if (!empty($arrayfields['cf.ref']['checked'])) {
1472 print '<td class="liste_titre"><input size="8" type="text" class="flat maxwidth75" name="search_ref" value="'.$search_ref.'"></td>';
1473 }
1474 // Ref customer
1475 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1476 print '<td class="liste_titre"><input type="text" class="flat maxwidth75" name="search_refsupp" value="'.$search_refsupp.'"></td>';
1477 }
1478 // Project ref
1479 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1480 print '<td class="liste_titre"><input type="text" class="flat maxwidth100" name="search_project_ref" value="'.$search_project_ref.'"></td>';
1481 }
1482 // Request author
1483 if (!empty($arrayfields['u.login']['checked'])) {
1484 print '<td class="liste_titre">';
1485 print '<input type="text" class="flat" size="6" name="search_request_author" value="'.$search_request_author.'">';
1486 print '</td>';
1487 }
1488 // Thirpdarty
1489 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1490 print '<td class="liste_titre"><input type="text" size="6" class="flat" name="search_company" value="'.$search_company.'"></td>';
1491 }
1492 // Alias
1493 if (!empty($arrayfields['s.name_alias']['checked'])) {
1494 print '<td class="liste_titre"><input type="text" size="6" class="flat" name="search_company_alias" value="'.$search_company_alias.'"></td>';
1495 }
1496 // Town
1497 if (!empty($arrayfields['s.town']['checked'])) {
1498 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_town" value="'.$search_town.'"></td>';
1499 }
1500 // Zip
1501 if (!empty($arrayfields['s.zip']['checked'])) {
1502 print '<td class="liste_titre"><input class="flat maxwidth50" type="text" name="search_zip" value="'.$search_zip.'"></td>';
1503 }
1504 // State
1505 if (!empty($arrayfields['state.nom']['checked'])) {
1506 print '<td class="liste_titre">';
1507 print '<input class="flat maxwidth50" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1508 print '</td>';
1509 }
1510 // Country
1511 if (!empty($arrayfields['country.code_iso']['checked'])) {
1512 print '<td class="liste_titre center">';
1513 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1514 print '</td>';
1515 }
1516 // Company type
1517 if (!empty($arrayfields['typent.code']['checked'])) {
1518 print '<td class="liste_titre maxwidthonsmartphone center">';
1519 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);
1520 print '</td>';
1521 }
1522 // Date order
1523 if (!empty($arrayfields['cf.date_commande']['checked'])) {
1524 print '<td class="liste_titre center">';
1525 print '<div class="nowrapfordate">';
1526 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'));
1527 print '</div>';
1528 print '<div class="nowrapfordate">';
1529 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'));
1530 print '</div>';
1531 print '</td>';
1532 }
1533 // Date delivery
1534 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
1535 print '<td class="liste_titre center">';
1536 print '<div class="nowrapfordate">';
1537 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'));
1538 print '</div>';
1539 print '<div class="nowrapfordate">';
1540 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'));
1541 print '</div>';
1542 print '</td>';
1543 }
1544 if (!empty($arrayfields['cf.total_ht']['checked'])) {
1545 // Amount
1546 print '<td class="liste_titre right">';
1547 print '<input class="flat" type="text" size="5" name="search_total_ht" value="'.$search_total_ht.'">';
1548 print '</td>';
1549 }
1550 if (!empty($arrayfields['cf.total_tva']['checked'])) {
1551 // Amount
1552 print '<td class="liste_titre right">';
1553 print '<input class="flat" type="text" size="5" name="search_total_tva" value="'.$search_total_tva.'">';
1554 print '</td>';
1555 }
1556 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
1557 // Amount
1558 print '<td class="liste_titre right">';
1559 print '<input class="flat" type="text" size="5" name="search_total_ttc" value="'.$search_total_ttc.'">';
1560 print '</td>';
1561 }
1562 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
1563 // Currency
1564 print '<td class="liste_titre">';
1565 print $form->selectMultiCurrency($search_multicurrency_code, 'search_multicurrency_code', 1);
1566 print '</td>';
1567 }
1568 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
1569 // Currency rate
1570 print '<td class="liste_titre">';
1571 print '<input class="flat" type="text" size="4" name="search_multicurrency_tx" value="'.dol_escape_htmltag($search_multicurrency_tx).'">';
1572 print '</td>';
1573 }
1574 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
1575 // Amount
1576 print '<td class="liste_titre right">';
1577 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ht" value="'.dol_escape_htmltag($search_multicurrency_montant_ht).'">';
1578 print '</td>';
1579 }
1580 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
1581 // Amount
1582 print '<td class="liste_titre right">';
1583 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_tva" value="'.dol_escape_htmltag($search_multicurrency_montant_tva).'">';
1584 print '</td>';
1585 }
1586 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
1587 // Amount
1588 print '<td class="liste_titre right">';
1589 print '<input class="flat" type="text" size="4" name="search_multicurrency_montant_ttc" value="'.dol_escape_htmltag($search_multicurrency_montant_ttc).'">';
1590 print '</td>';
1591 }
1592 // Extra fields
1593 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1594
1595 // Fields from hook
1596 $parameters = array('arrayfields' => $arrayfields);
1597 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1598 print $hookmanager->resPrint;
1599 // Date creation
1600 if (!empty($arrayfields['cf.date_creation']['checked'])) {
1601 print '<td class="liste_titre">';
1602 print '</td>';
1603 }
1604 // Date modification
1605 if (!empty($arrayfields['cf.tms']['checked'])) {
1606 print '<td class="liste_titre">';
1607 print '</td>';
1608 }
1609 // Billed
1610 if (!empty($arrayfields['cf.billed']['checked'])) {
1611 print '<td class="liste_titre center parentonrightofpage">';
1612 print $form->selectyesno('billed', $billed, 1, false, 1, 1, 'search_status width100 onrightofpage');
1613 print '</td>';
1614 }
1615 // Status
1616 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
1617 print '<td class="liste_titre center parentonrightofpage">';
1618 $formorder->selectSupplierOrderStatus($search_status, 1, 'search_status', 'search_status width125 onrightofpage');
1619 print '</td>';
1620 }
1621 // Date valid
1622 if (!empty($arrayfields['cf.date_valid']['checked'])) {
1623 print '<td class="liste_titre center">';
1624 print '<div class="nowrapfordate">';
1625 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'));
1626 print '</div>';
1627 print '<div class="nowrapfordate">';
1628 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'));
1629 print '</div>';
1630 print '</td>';
1631 }
1632 // Date approve
1633 if (!empty($arrayfields['cf.date_approve']['checked'])) {
1634 print '<td class="liste_titre center">';
1635 print '<div class="nowrapfordate">';
1636 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'));
1637 print '</div>';
1638 print '<div class="nowrapfordate">';
1639 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'));
1640 print '</div>';
1641 print '</td>';
1642 }
1643 if (!empty($arrayfields['cf.note_public']['checked'])) {
1644 // Note public
1645 print '<td class="liste_titre">';
1646 print '<input class="flat maxwidth75" type="text" name="search_note_public" value="'.dol_escape_htmltag($search_note_public).'">';
1647 print '</td>';
1648 }
1649 if (!empty($arrayfields['cf.note_private']['checked'])) {
1650 // Note private
1651 print '<td class="liste_titre">';
1652 print '<input class="flat maxwidth75" type="text" name="search_note_private" value="'.dol_escape_htmltag($search_note_private).'">';
1653 print '</td>';
1654 }
1655 // Action column
1656 if (!$conf->main_checkbox_left_column) {
1657 print '<td class="liste_titre center">';
1658 $searchpicto = $form->showFilterButtons();
1659 print $searchpicto;
1660 print '</td>';
1661 }
1662
1663 print "</tr>\n";
1664
1665 $totalarray = array();
1666 $totalarray['nbfield'] = 0;
1667
1668 // Fields title
1669 print '<tr class="liste_titre">';
1670 if ($conf->main_checkbox_left_column) {
1671 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1672 $totalarray['nbfield']++;
1673 }
1674 if (!empty($arrayfields['cf.ref']['checked'])) {
1675 print_liste_field_titre($arrayfields['cf.ref']['label'], $_SERVER["PHP_SELF"], "cf.ref", "", $param, '', $sortfield, $sortorder);
1676 $totalarray['nbfield']++;
1677 }
1678 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1679 print_liste_field_titre($arrayfields['cf.ref_supplier']['label'], $_SERVER["PHP_SELF"], "cf.ref_supplier", "", $param, '', $sortfield, $sortorder, 'tdoverflowmax100imp ');
1680 $totalarray['nbfield']++;
1681 }
1682 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1683 print_liste_field_titre($arrayfields['cf.fk_projet']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder);
1684 $totalarray['nbfield']++;
1685 }
1686 if (!empty($arrayfields['u.login']['checked'])) {
1687 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], "u.login", "", $param, '', $sortfield, $sortorder);
1688 $totalarray['nbfield']++;
1689 }
1690 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1691 print_liste_field_titre($arrayfields['cf.fk_soc']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder);
1692 $totalarray['nbfield']++;
1693 }
1694 if (!empty($arrayfields['s.name_alias']['checked'])) {
1695 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1696 print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"], "s.name_alias", "", $param, '', $sortfield, $sortorder);
1697 $totalarray['nbfield']++;
1698 }
1699 if (!empty($arrayfields['s.town']['checked'])) {
1700 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1701 $totalarray['nbfield']++;
1702 }
1703 if (!empty($arrayfields['s.zip']['checked'])) {
1704 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1705 $totalarray['nbfield']++;
1706 }
1707 if (!empty($arrayfields['state.nom']['checked'])) {
1708 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1709 $totalarray['nbfield']++;
1710 }
1711 if (!empty($arrayfields['country.code_iso']['checked'])) {
1712 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1713 $totalarray['nbfield']++;
1714 }
1715 if (!empty($arrayfields['typent.code']['checked'])) {
1716 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1717 $totalarray['nbfield']++;
1718 }
1719 if (!empty($arrayfields['cf.fk_author']['checked'])) {
1720 print_liste_field_titre($arrayfields['cf.fk_author']['label'], $_SERVER["PHP_SELF"], "cf.fk_author", "", $param, '', $sortfield, $sortorder);
1721 $totalarray['nbfield']++;
1722 }
1723 if (!empty($arrayfields['cf.date_commande']['checked'])) {
1724 print_liste_field_titre($arrayfields['cf.date_commande']['label'], $_SERVER["PHP_SELF"], "cf.date_commande", "", $param, '', $sortfield, $sortorder, 'center ');
1725 $totalarray['nbfield']++;
1726 }
1727 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
1728 print_liste_field_titre($arrayfields['cf.date_livraison']['label'], $_SERVER["PHP_SELF"], 'cf.date_livraison', '', $param, '', $sortfield, $sortorder, 'center ');
1729 $totalarray['nbfield']++;
1730 }
1731 if (!empty($arrayfields['cf.total_ht']['checked'])) {
1732 print_liste_field_titre($arrayfields['cf.total_ht']['label'], $_SERVER["PHP_SELF"], "cf.total_ht", "", $param, '', $sortfield, $sortorder, 'right ');
1733 $totalarray['nbfield']++;
1734 }
1735 if (!empty($arrayfields['cf.total_tva']['checked'])) {
1736 print_liste_field_titre($arrayfields['cf.total_tva']['label'], $_SERVER["PHP_SELF"], "cf.total_tva", "", $param, '', $sortfield, $sortorder, 'right ');
1737 $totalarray['nbfield']++;
1738 }
1739 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
1740 print_liste_field_titre($arrayfields['cf.total_ttc']['label'], $_SERVER["PHP_SELF"], "cf.total_ttc", "", $param, '', $sortfield, $sortorder, 'right ');
1741 $totalarray['nbfield']++;
1742 }
1743 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
1744 print_liste_field_titre($arrayfields['cf.multicurrency_code']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_code', '', $param, '', $sortfield, $sortorder);
1745 $totalarray['nbfield']++;
1746 }
1747 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
1748 print_liste_field_titre($arrayfields['cf.multicurrency_tx']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_tx', '', $param, '', $sortfield, $sortorder);
1749 $totalarray['nbfield']++;
1750 }
1751 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
1752 print_liste_field_titre($arrayfields['cf.multicurrency_total_ht']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_ht', '', $param, 'class="right"', $sortfield, $sortorder);
1753 $totalarray['nbfield']++;
1754 }
1755 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
1756 print_liste_field_titre($arrayfields['cf.multicurrency_total_tva']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_tva', '', $param, 'class="right"', $sortfield, $sortorder);
1757 $totalarray['nbfield']++;
1758 }
1759 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
1760 print_liste_field_titre($arrayfields['cf.multicurrency_total_ttc']['label'], $_SERVER['PHP_SELF'], 'cf.multicurrency_total_ttc', '', $param, 'class="right"', $sortfield, $sortorder);
1761 $totalarray['nbfield']++;
1762 }
1763 // Extra fields
1764 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1765 // Hook fields
1766 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1767 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1768 print $hookmanager->resPrint;
1769 if (!empty($arrayfields['cf.date_creation']['checked'])) {
1770 print_liste_field_titre($arrayfields['cf.date_creation']['label'], $_SERVER["PHP_SELF"], "cf.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1771 $totalarray['nbfield']++;
1772 }
1773 if (!empty($arrayfields['cf.tms']['checked'])) {
1774 print_liste_field_titre($arrayfields['cf.tms']['label'], $_SERVER["PHP_SELF"], "cf.tms", "", $param, '', $sortfield, $sortorder, 'center nowraponall ');
1775 $totalarray['nbfield']++;
1776 }
1777 if (!empty($arrayfields['cf.billed']['checked'])) {
1778 print_liste_field_titre($arrayfields['cf.billed']['label'], $_SERVER["PHP_SELF"], 'cf.billed', '', $param, '', $sortfield, $sortorder, 'center ');
1779 $totalarray['nbfield']++;
1780 }
1781 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
1782 print_liste_field_titre($arrayfields['cf.fk_statut']['label'], $_SERVER["PHP_SELF"], "cf.fk_statut", "", $param, '', $sortfield, $sortorder, 'center ');
1783 $totalarray['nbfield']++;
1784 }
1785 if (!empty($arrayfields['cf.date_valid']['checked'])) {
1786 print_liste_field_titre($arrayfields['cf.date_valid']['label'], $_SERVER["PHP_SELF"], "cf.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
1787 $totalarray['nbfield']++;
1788 }
1789 if (!empty($arrayfields['cf.date_approve']['checked'])) {
1790 print_liste_field_titre($arrayfields['cf.date_approve']['label'], $_SERVER["PHP_SELF"], 'cf.date_approve', '', $param, '', $sortfield, $sortorder, 'center ');
1791 $totalarray['nbfield']++;
1792 }
1793 if (!empty($arrayfields['cf.note_public']['checked'])) {
1794 print_liste_field_titre($arrayfields['cf.note_public']['label'], $_SERVER["PHP_SELF"], "cf.note_public", "", $param, '', $sortfield, $sortorder, 'center ');
1795 $totalarray['nbfield']++;
1796 }
1797 if (!empty($arrayfields['cf.note_private']['checked'])) {
1798 print_liste_field_titre($arrayfields['cf.note_private']['label'], $_SERVER["PHP_SELF"], "cf.note_private", "", $param, '', $sortfield, $sortorder, 'center ');
1799 $totalarray['nbfield']++;
1800 }
1801 if (!$conf->main_checkbox_left_column) {
1802 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1803 $totalarray['nbfield']++;
1804 }
1805 print "</tr>\n";
1806
1807 $total = 0;
1808 $subtotal = 0;
1809 $productstat_cache = array();
1810
1811 $userstatic = new User($db);
1812 $objectstatic = new CommandeFournisseur($db);
1813 $projectstatic = new Project($db);
1814
1815 $i = 0;
1816 $savnbfield = $totalarray['nbfield'];
1817 $totalarray = array('nbfield' => 0, 'val' => array(), 'pos' => array());
1818 $totalarray['val']['cf.total_ht'] = 0;
1819 $totalarray['val']['cf.total_ttc'] = 0;
1820 $totalarray['val']['cf.total_tva'] = 0;
1821
1822 $imaxinloop = ($limit ? min($num, $limit) : $num);
1823 while ($i < $imaxinloop) {
1824 $obj = $db->fetch_object($resql);
1825
1826 $notshippable = 0;
1827 $warning = 0;
1828 $text_info = '';
1829 $text_warning = '';
1830 $nbprod = 0;
1831
1832 $objectstatic->id = $obj->rowid;
1833 $objectstatic->ref = $obj->ref;
1834 $objectstatic->ref_supplier = $obj->ref_supplier;
1835 $objectstatic->socid = $obj->socid;
1836 $objectstatic->total_ht = $obj->total_ht;
1837 $objectstatic->total_tva = $obj->total_tva;
1838 $objectstatic->total_ttc = $obj->total_ttc;
1839 $objectstatic->date = $db->jdate($obj->date_commande);
1840 $objectstatic->date_commande = $db->jdate($obj->date_commande);
1841 $objectstatic->date_creation = $db->jdate($obj->date_creation);
1842 $objectstatic->delivery_date = $db->jdate($obj->delivery_date);
1843 $objectstatic->note_public = $obj->note_public;
1844 $objectstatic->note_private = $obj->note_private;
1845 $objectstatic->statut = $obj->fk_statut;
1846 $objectstatic->status = $obj->fk_statut;
1847
1848 if ($mode == 'kanban') {
1849 if ($i == 0) {
1850 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1851 print '<div class="box-flex-container kanban">';
1852 }
1853
1854 $thirdpartytmp->id = $obj->socid;
1855 $thirdpartytmp->name = $obj->name;
1856 $thirdpartytmp->email = $obj->email;
1857 $thirdpartytmp->name_alias = $obj->alias;
1858 $thirdpartytmp->client = $obj->client;
1859 $thirdpartytmp->fournisseur = $obj->fournisseur;
1860 // Output Kanban
1861 print $objectstatic->getKanbanView('', array('thirdparty' => $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1), 'selected' => in_array($objectstatic->id, $arrayofselected)));
1862 if ($i == ($imaxinloop - 1)) {
1863 print '</div>';
1864 print '</td></tr>';
1865 }
1866 } else {
1867 print '<tr class="oddeven row-with-select '.((getDolGlobalInt('MAIN_FINISHED_LINES_OPACITY') == 1 && $obj->billed == 1) ? 'opacitymedium' : '').'">';
1868 // Action column
1869 if ($conf->main_checkbox_left_column) {
1870 print '<td class="nowraponall center">';
1871 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1872 $selected = 0;
1873 if (in_array($obj->rowid, $arrayofselected)) {
1874 $selected = 1;
1875 }
1876 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1877 }
1878 print '</td>';
1879 if (!$i) {
1880 $totalarray['nbfield']++;
1881 }
1882 }
1883 // Ref
1884 if (!empty($arrayfields['cf.ref']['checked'])) {
1885 print '<td class="nowraponall">';
1886
1887 // Picto + Ref
1888 print $objectstatic->getNomUrl(1, '', 0, -1, 1);
1889 // Other picto tool
1890 $filename = dol_sanitizeFileName($obj->ref);
1891 $filedir = getMultidirOutput($objectstatic).'/'.dol_sanitizeFileName($obj->ref);
1892 print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir);
1893
1894 print '</td>'."\n";
1895 if (!$i) {
1896 $totalarray['nbfield']++;
1897 }
1898 }
1899 // Ref Supplier
1900 if (!empty($arrayfields['cf.ref_supplier']['checked'])) {
1901 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->ref_supplier).'">'.dol_escape_htmltag($obj->ref_supplier).'</td>'."\n";
1902 if (!$i) {
1903 $totalarray['nbfield']++;
1904 }
1905 }
1906 // Project
1907 if (!empty($arrayfields['cf.fk_projet']['checked'])) {
1908 $projectstatic->id = $obj->project_id;
1909 $projectstatic->ref = $obj->project_ref;
1910 $projectstatic->title = $obj->project_title;
1911 print '<td class="tdoverflowmax125">';
1912 if ($obj->project_id > 0) {
1913 print $projectstatic->getNomUrl(1);
1914 }
1915 print '</td>';
1916 if (!$i) {
1917 $totalarray['nbfield']++;
1918 }
1919 }
1920 // Author
1921 $userstatic->id = $obj->fk_user_author;
1922 $userstatic->lastname = $obj->lastname;
1923 $userstatic->firstname = $obj->firstname;
1924 $userstatic->login = $obj->login;
1925 $userstatic->photo = $obj->photo;
1926 $userstatic->email = $obj->user_email;
1927 $userstatic->status = $obj->user_status;
1928 if (!empty($arrayfields['u.login']['checked'])) {
1929 print '<td class="tdoverflowmax150">';
1930 if ($userstatic->id) {
1931 print $userstatic->getNomUrl(1);
1932 }
1933 print "</td>";
1934 if (!$i) {
1935 $totalarray['nbfield']++;
1936 }
1937 }
1938 // Thirdparty
1939 if (!empty($arrayfields['cf.fk_soc']['checked'])) {
1940 print '<td class="tdoverflowmax150">';
1941 $thirdpartytmp->id = $obj->socid;
1942 $thirdpartytmp->name = $obj->name;
1943 $thirdpartytmp->email = $obj->email;
1944 $thirdpartytmp->name_alias = $obj->alias;
1945 $thirdpartytmp->client = $obj->client;
1946 $thirdpartytmp->fournisseur = $obj->fournisseur;
1947 print $thirdpartytmp->getNomUrl(1, 'supplier', 0, 0, -1, empty($arrayfields['s.name_alias']['checked']) ? 0 : 1);
1948 print '</td>'."\n";
1949 if (!$i) {
1950 $totalarray['nbfield']++;
1951 }
1952 }
1953 // Alias
1954 if (!empty($arrayfields['s.name_alias']['checked'])) {
1955 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->alias).'">';
1956 print dol_escape_htmltag($obj->alias);
1957 print '</td>'."\n";
1958 if (!$i) {
1959 $totalarray['nbfield']++;
1960 }
1961 }
1962 // Town
1963 if (!empty($arrayfields['s.town']['checked'])) {
1964 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->town).'">';
1965 print dol_escape_htmltag($obj->town);
1966 print '</td>';
1967 if (!$i) {
1968 $totalarray['nbfield']++;
1969 }
1970 }
1971 // Zip
1972 if (!empty($arrayfields['s.zip']['checked'])) {
1973 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->zip).'">';
1974 print dol_escape_htmltag($obj->zip);
1975 print '</td>';
1976 if (!$i) {
1977 $totalarray['nbfield']++;
1978 }
1979 }
1980 // State
1981 if (!empty($arrayfields['state.nom']['checked'])) {
1982 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->state_name).'">'.dol_escape_htmltag($obj->state_name)."</td>\n";
1983 if (!$i) {
1984 $totalarray['nbfield']++;
1985 }
1986 }
1987 // Country
1988 if (!empty($arrayfields['country.code_iso']['checked'])) {
1989 print '<td class="center">';
1990 $tmparray = getCountry($obj->fk_pays, 'all');
1991 print $tmparray['label'];
1992 print '</td>';
1993 if (!$i) {
1994 $totalarray['nbfield']++;
1995 }
1996 }
1997 // Type ent
1998 if (!empty($arrayfields['typent.code']['checked'])) {
1999 print '<td class="center">';
2000 if (empty($typenArray)) {
2001 $typenArray = $formcompany->typent_array(1);
2002 }
2003 print $typenArray[$obj->typent_code];
2004 print '</td>';
2005 if (!$i) {
2006 $totalarray['nbfield']++;
2007 }
2008 }
2009
2010 // Order date
2011 if (!empty($arrayfields['cf.date_commande']['checked'])) {
2012 print '<td class="center">';
2013 print dol_print_date($db->jdate($obj->date_commande), 'day');
2014 if ($objectstatic->statut != $objectstatic::STATUS_ORDERSENT && $objectstatic->statut != $objectstatic::STATUS_RECEIVED_PARTIALLY) {
2015 if ($objectstatic->hasDelay()) {
2016 print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning");
2017 }
2018 }
2019 print '</td>';
2020 if (!$i) {
2021 $totalarray['nbfield']++;
2022 }
2023 }
2024 // Plannned date of delivery
2025 if (!empty($arrayfields['cf.date_livraison']['checked'])) {
2026 print '<td class="center">';
2027 print dol_print_date($db->jdate($obj->delivery_date), 'day');
2028 if ($objectstatic->statut == $objectstatic::STATUS_ORDERSENT || $objectstatic->statut == $objectstatic::STATUS_RECEIVED_PARTIALLY) {
2029 if ($objectstatic->hasDelay()) {
2030 print ' '.img_picto($langs->trans("Late").' : '.$objectstatic->showDelay(), "warning");
2031 }
2032 }
2033 print '</td>';
2034 if (!$i) {
2035 $totalarray['nbfield']++;
2036 }
2037 }
2038 // Amount HT
2039 if (!empty($arrayfields['cf.total_ht']['checked'])) {
2040 print '<td class="right"><span class="amount">'.price($obj->total_ht)."</span></td>\n";
2041 if (!$i) {
2042 $totalarray['nbfield']++;
2043 }
2044 if (!$i) {
2045 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ht';
2046 }
2047 $totalarray['val']['cf.total_ht'] += $obj->total_ht;
2048 }
2049 // Amount VAT
2050 if (!empty($arrayfields['cf.total_tva']['checked'])) {
2051 print '<td class="right"><span class="amount">'.price($obj->total_tva)."</span></td>\n";
2052 if (!$i) {
2053 $totalarray['nbfield']++;
2054 }
2055 if (!$i) {
2056 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_tva';
2057 }
2058 $totalarray['val']['cf.total_tva'] += $obj->total_tva;
2059 }
2060 // Amount TTC
2061 if (!empty($arrayfields['cf.total_ttc']['checked'])) {
2062 print '<td class="right"><span class="amount">'.price($obj->total_ttc)."</span></td>\n";
2063 if (!$i) {
2064 $totalarray['nbfield']++;
2065 }
2066 if (!$i) {
2067 $totalarray['pos'][$totalarray['nbfield']] = 'cf.total_ttc';
2068 }
2069 $totalarray['val']['cf.total_ttc'] += $obj->total_ttc;
2070 }
2071
2072 // Currency
2073 if (!empty($arrayfields['cf.multicurrency_code']['checked'])) {
2074 print '<td class="nowrap">'.$obj->multicurrency_code.' - '.$langs->trans('Currency'.$obj->multicurrency_code)."</td>\n";
2075 if (!$i) {
2076 $totalarray['nbfield']++;
2077 }
2078 }
2079
2080 // Currency rate
2081 if (!empty($arrayfields['cf.multicurrency_tx']['checked'])) {
2082 print '<td class="nowrap">';
2083 $form->form_multicurrency_rate($_SERVER['PHP_SELF'].'?id='.$obj->rowid, $obj->multicurrency_tx, 'none', $obj->multicurrency_code);
2084 print "</td>\n";
2085 if (!$i) {
2086 $totalarray['nbfield']++;
2087 }
2088 }
2089 // Amount HT
2090 if (!empty($arrayfields['cf.multicurrency_total_ht']['checked'])) {
2091 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ht)."</span></td>\n";
2092 if (!$i) {
2093 $totalarray['nbfield']++;
2094 }
2095 }
2096 // Amount VAT
2097 if (!empty($arrayfields['cf.multicurrency_total_tva']['checked'])) {
2098 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_tva)."</span></td>\n";
2099 if (!$i) {
2100 $totalarray['nbfield']++;
2101 }
2102 }
2103 // Amount TTC
2104 if (!empty($arrayfields['cf.multicurrency_total_ttc']['checked'])) {
2105 print '<td class="right nowrap"><span class="amount">'.price($obj->multicurrency_total_ttc)."</span></td>\n";
2106 if (!$i) {
2107 $totalarray['nbfield']++;
2108 }
2109 }
2110
2111 // Extra fields
2112 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
2113 // Fields from hook
2114 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
2115 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
2116 print $hookmanager->resPrint;
2117 // Date creation
2118 if (!empty($arrayfields['cf.date_creation']['checked'])) {
2119 print '<td class="center nowraponall">';
2120 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
2121 print '</td>';
2122 if (!$i) {
2123 $totalarray['nbfield']++;
2124 }
2125 }
2126 // Date modification
2127 if (!empty($arrayfields['cf.tms']['checked'])) {
2128 print '<td class="center nowraponall">';
2129 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
2130 print '</td>';
2131 if (!$i) {
2132 $totalarray['nbfield']++;
2133 }
2134 }
2135 // Billed
2136 if (!empty($arrayfields['cf.billed']['checked'])) {
2137 print '<td class="center">';
2138 if ($obj->billed) {
2139 print yn($obj->billed, $langs->trans("Billed"));
2140 }
2141 print '</td>';
2142 if (!$i) {
2143 $totalarray['nbfield']++;
2144 }
2145 }
2146 // Status
2147 if (!empty($arrayfields['cf.fk_statut']['checked'])) {
2148 print '<td class="center nowrap">'.$objectstatic->LibStatut($obj->fk_statut, 5, $obj->billed).'</td>';
2149 if (!$i) {
2150 $totalarray['nbfield']++;
2151 }
2152 }
2153
2154 // valid date
2155 if (!empty($arrayfields['cf.date_valid']['checked'])) {
2156 print '<td class="center">';
2157 print dol_print_date($db->jdate($obj->date_valid), 'day');
2158 print '</td>';
2159 if (!$i) {
2160 $totalarray['nbfield']++;
2161 }
2162 }
2163 // approve date
2164 if (!empty($arrayfields['cf.date_approve']['checked'])) {
2165 print '<td class="center">';
2166 print dol_print_date($db->jdate($obj->date_approve), 'day');
2167 print '</td>';
2168 if (!$i) {
2169 $totalarray['nbfield']++;
2170 }
2171 }
2172 // Note public
2173 if (!empty($arrayfields['cf.note_public']['checked'])) {
2174 print '<td class="sensiblehtmlcontent center">';
2175 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_public, 5)).'</div>';
2176 print '</td>';
2177 if (!$i) {
2178 $totalarray['nbfield']++;
2179 }
2180 }
2181
2182 // Note private
2183 if (!empty($arrayfields['cf.note_private']['checked'])) {
2184 print '<td class="sensiblehtmlcontent center">';
2185 print '<div class="small lineheightsmall twolinesmax-normallineheight">'.dolPrintHTML(dolGetFirstLineOfText($obj->note_private, 5)).'</div>';
2186 print '</td>';
2187 if (!$i) {
2188 $totalarray['nbfield']++;
2189 }
2190 }
2191
2192 // Action column
2193 if (!$conf->main_checkbox_left_column) {
2194 print '<td class="nowrap center">';
2195 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
2196 $selected = 0;
2197 if (in_array($obj->rowid, $arrayofselected)) {
2198 $selected = 1;
2199 }
2200 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
2201 }
2202 print '</td>';
2203 if (!$i) {
2204 $totalarray['nbfield']++;
2205 }
2206 }
2207
2208 print "</tr>\n";
2209
2210 $total += $obj->total_ht;
2211 $subtotal += $obj->total_ht;
2212 }
2213 $i++;
2214 }
2215
2216 // Show total line
2217 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
2218
2219 // If no record found
2220 if ($num == 0) {
2221 $colspan = 1;
2222 foreach ($arrayfields as $key => $val) {
2223 if (!empty($val['checked'])) {
2224 $colspan++;
2225 }
2226 }
2227 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
2228 }
2229
2230 $db->free($resql);
2231
2232 $parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
2233 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
2234 print $hookmanager->resPrint;
2235
2236 print '</table>'."\n";
2237 print '</div>';
2238
2239 print '</form>'."\n";
2240
2241 $hidegeneratedfilelistifempty = 1;
2242 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
2243 $hidegeneratedfilelistifempty = 0;
2244 }
2245
2246 // Show list of available documents
2247 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
2248 $urlsource .= str_replace('&amp;', '&', $param);
2249
2250 $filedir = $diroutputmassaction;
2251 $genallowed = $permissiontoread;
2252 $delallowed = $permissiontoadd;
2253
2254 print $formfile->showdocuments('massfilesarea_supplier_order', '', $filedir, $urlsource, 0, (int) $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
2255} else {
2257}
2258
2259// End of page
2260llxFooter();
2261$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:501
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:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
$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).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
Definition html.lib.php:172
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.