dolibarr 21.0.0-beta
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2016-2021 Ferran Marcet <fmarcet@2byte.es>
6 * Copyright (C) 2019 Nicolas ZABOURI <info@inovea-conseil.com>
7 * Copyright (C) 2020 Thibault FOUCART <support@ptibogxiv.net>
8 * Copyright (C) 2023 Christophe Battarel <christophe@altairis.fr>
9 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
10 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
11 * Copyright (C) 2024 Vincent Maury <vmaury@timgroup.fr>
12 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
13 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program. If not, see <https://www.gnu.org/licenses/>.
27 */
28
35// Load Dolibarr environment
36require '../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
45
54// Load translation files required by the page
55$langs->loadLangs(array("sendings", "deliveries", 'companies', 'bills', 'products', 'orders'));
56
57$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'shipmentlist'; // To manage different context of search
58
59$socid = GETPOSTINT('socid');
60
61$action = GETPOST('action', 'alpha');
62$massaction = GETPOST('massaction', 'alpha');
63$show_files = GETPOSTINT('show_files');
64$toselect = GETPOST('toselect', 'array');
65$optioncss = GETPOST('optioncss', 'alpha');
66$mode = GETPOST('mode', 'alpha');
67
68$search_ref_exp = GETPOST("search_ref_exp", 'alpha');
69$search_ref_liv = GETPOST('search_ref_liv', 'alpha');
70$search_ref_customer = GETPOST('search_ref_customer', 'alpha');
71$search_company = GETPOST("search_company", 'alpha');
72$search_shipping_method_ids = GETPOST('search_shipping_method_ids', 'array:int');
73$search_tracking = GETPOST("search_tracking", 'alpha');
74$search_town = GETPOST('search_town', 'alpha');
75$search_zip = GETPOST('search_zip', 'alpha');
76$search_state = GETPOST("search_state", 'alpha');
77$search_country = GETPOST("search_country", 'aZ09');
78$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
79$search_billed = GETPOST("search_billed", 'intcomma');
80$search_dateshipping_start = dol_mktime(0, 0, 0, GETPOSTINT('search_dateshipping_startmonth'), GETPOSTINT('search_dateshipping_startday'), GETPOSTINT('search_dateshipping_startyear'));
81$search_dateshipping_end = dol_mktime(23, 59, 59, GETPOSTINT('search_dateshipping_endmonth'), GETPOSTINT('search_dateshipping_endday'), GETPOSTINT('search_dateshipping_endyear'));
82$search_datedelivery_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datedelivery_startmonth'), GETPOSTINT('search_datedelivery_startday'), GETPOSTINT('search_datedelivery_startyear'));
83$search_datedelivery_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datedelivery_endmonth'), GETPOSTINT('search_datedelivery_endday'), GETPOSTINT('search_datedelivery_endyear'));
84$search_datereceipt_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datereceipt_startmonth'), GETPOSTINT('search_datereceipt_startday'), GETPOSTINT('search_datereceipt_startyear'));
85$search_datereceipt_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datereceipt_endmonth'), GETPOSTINT('search_datereceipt_endday'), GETPOSTINT('search_datereceipt_endyear'));
86$search_all = trim(GETPOST('search_all', 'alphanohtml'));
87$search_user = GETPOST('search_user', 'intcomma');
88$search_sale = GETPOST('search_sale', 'intcomma');
89$search_categ_cus = GETPOST("search_categ_cus", 'intcomma');
90$search_product_category = GETPOST('search_product_category', 'intcomma');
91
92$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
93$sortfield = GETPOST('sortfield', 'aZ09comma');
94$sortorder = GETPOST('sortorder', 'aZ09comma');
95$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
96if (!$sortfield) {
97 $sortfield = "e.ref";
98}
99if (!$sortorder) {
100 $sortorder = "DESC";
101}
102if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
103 // If $page is not defined, or '' or -1 or if we click on clear filters
104 $page = 0;
105}
106$offset = $limit * $page;
107$pageprev = $page - 1;
108$pagenext = $page + 1;
109
110$search_status = GETPOST('search_status', 'intcomma');
111$search_signed_status = GETPOST('search_signed_status', 'alpha');
112
113$diroutputmassaction = $conf->expedition->dir_output.'/sending/temp/massgeneration/'.$user->id;
114
115$object = new Expedition($db);
116
117// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
118$hookmanager->initHooks(array('shipmentlist'));
119$extrafields = new ExtraFields($db);
120
121// Fetch optionals attributes and labels
122$extrafields->fetch_name_optionals_label($object->table_element);
123
124$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
125
126// List of fields to search into when doing a "search in all"
127$fieldstosearchall = array(
128 'e.ref' => "Ref",
129 's.nom' => "ThirdParty",
130 'e.note_public' => 'NotePublic',
131 //'e.fk_shipping_method'=>'SendingMethod', // TODO fix this, does not work
132 'e.tracking_number' => "TrackingNumber",
133);
134if (empty($user->socid)) {
135 $fieldstosearchall["e.note_private"] = "NotePrivate";
136}
137
138$checkedtypetiers = 0;
139$arrayfields = array(
140 'e.ref' => array('label' => $langs->trans("Ref"), 'checked' => 1, 'position' => 1),
141 'e.ref_customer' => array('label' => $langs->trans("RefCustomer"), 'checked' => 1, 'position' => 2),
142 's.nom' => array('label' => $langs->trans("ThirdParty"), 'checked' => 1, 'position' => 3),
143 's.town' => array('label' => $langs->trans("Town"), 'checked' => 1, 'position' => 4),
144 's.zip' => array('label' => $langs->trans("Zip"), 'checked' => -1, 'position' => 5),
145 'state.nom' => array('label' => $langs->trans("StateShort"), 'checked' => 0, 'position' => 6),
146 'country.code_iso' => array('label' => $langs->trans("Country"), 'checked' => 0, 'position' => 7),
147 'typent.code' => array('label' => $langs->trans("ThirdPartyType"), 'checked' => $checkedtypetiers, 'position' => 8),
148 'e.date_delivery' => array('label' => $langs->trans("DateDeliveryPlanned"), 'checked' => 1, 'position' => 9),
149 'e.date_expedition' => array('label' => $langs->trans("DateShipping"), 'checked' => 1, 'position' => 10),
150 'e.fk_shipping_method' => array('label' => $langs->trans('SendingMethod'), 'checked' => 1, 'position' => 11),
151 'e.tracking_number' => array('label' => $langs->trans("TrackingNumber"), 'checked' => 1, 'position' => 12),
152 'e.weight' => array('label' => $langs->trans("Weight"), 'checked' => 0, 'position' => 13),
153 'e.datec' => array('label' => $langs->trans("DateCreation"), 'checked' => 0, 'position' => 500),
154 'e.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => 0, 'position' => 500),
155 'e.fk_statut' => array('label' => $langs->trans("Status"), 'checked' => 1, 'position' => 1000),
156 'e.signed_status' => array('label' => 'Signed status', 'checked' => 0, 'position' => 1001),
157 'l.ref' => array('label' => $langs->trans("DeliveryRef"), 'checked' => 1, 'position' => 1010, 'enabled' => (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY') ? 1 : 0)),
158 'l.date_delivery' => array('label' => $langs->trans("DateReceived"), 'position' => 1020, 'checked' => 1, 'enabled' => (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY') ? 1 : 0)),
159 'e.billed' => array('label' => $langs->trans("Billed"), 'checked' => 1, 'position' => 1100, 'enabled' => 'getDolGlobalString("WORKFLOW_BILL_ON_SHIPMENT") !== "0"'),
160 'e.note_public' => array('label' => 'NotePublic', 'checked' => 0, 'enabled' => (empty($conf->global->MAIN_LIST_ALLOW_PUBLIC_NOTES)), 'position' => 135),
161 'e.note_private' => array('label' => 'NotePrivate', 'checked' => 0, 'enabled' => (empty($conf->global->MAIN_LIST_ALLOW_PRIVATE_NOTES)), 'position' => 140),
162);
163
164// Extra fields
165include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
166
167$object->fields = dol_sort_array($object->fields, 'position');
168$arrayfields = dol_sort_array($arrayfields, 'position');
169'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
170
171// Security check
172$expeditionid = GETPOSTINT('id');
173if ($user->socid) {
174 $socid = $user->socid;
175}
176$result = restrictedArea($user, 'expedition', $expeditionid, '');
177
178
179
180/*
181 * Actions
182 */
183$error = 0;
184
185if (GETPOST('cancel', 'alpha')) {
186 $action = 'list';
187 $massaction = '';
188}
189if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') {
190 $massaction = '';
191}
192
193$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
194$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
195if ($reshook < 0) {
196 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
197}
198
199include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
200
201// Purge search criteria
202if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
203 $search_user = '';
204 $search_sale = '';
205 $search_product_category = '';
206 $search_ref_exp = '';
207 $search_ref_liv = '';
208 $search_ref_customer = '';
209 $search_company = '';
210 $search_town = '';
211 $search_zip = "";
212 $search_state = "";
213 $search_type = '';
214 $search_country = '';
215 $search_tracking = '';
216 $search_shipping_method_ids = [];
217 $search_type_thirdparty = '';
218 $search_billed = '';
219 $search_dateshipping_start = '';
220 $search_dateshipping_end = '';
221 $search_datedelivery_start = '';
222 $search_datedelivery_end = '';
223 $search_datereceipt_start = '';
224 $search_datereceipt_end = '';
225 $search_status = '';
226 $search_signed_status = '';
227 $toselect = array();
228 $search_array_options = array();
229 $search_categ_cus = 0;
230 $search_all = '';
231}
232
233if (empty($reshook)) {
234 $objectclass = 'Expedition';
235 $objectlabel = 'Sendings';
236 $permissiontoread = $user->hasRight('expedition', 'lire');
237 $permissiontoadd = $user->hasRight('expedition', 'creer');
238 $permissiontodelete = $user->hasRight('expedition', 'supprimer');
239 $uploaddir = $conf->expedition->dir_output.'/sending';
240 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
241
242 if ($massaction == 'confirm_createbills') { // Create bills from sendings.
243 $sendings = GETPOST('toselect', 'array');
244 $createbills_onebythird = GETPOST('createbills_onebythird', 'int');
245 $validate_invoices = GETPOST('validate_invoices', 'int');
246
247 $errors = array();
248
249 $TFact = array();
250 $TFactThird = array();
251 $TFactThirdNbLines = array();
252
253 $nb_bills_created = 0;
254 $lastid = 0;
255 $lastref = '';
256
257 $db->begin();
258
259 $nbSendings = is_array($sendings) ? count($sendings) : 1;
260
261 foreach ($sendings as $id_sending) {
262 $expd = new Expedition($db);
263 if ($expd->fetch($id_sending) <= 0) {
264 continue;
265 }
266 $expd->fetch_thirdparty();
267
268 $objecttmp = new Facture($db);
269
270 dol_include_once('/commande/class/commande.class.php');
271 $expdCmdSrc = new Commande($db);
272 $expdCmdSrc->fetch($expd->origin_id);
273
274 if (!empty($createbills_onebythird) && !empty($TFactThird[$expd->socid])) {
275 // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we reuse it.
276 $objecttmp = $TFactThird[$expd->socid];
277 } else {
278 // If we want one invoice per sending or if there is no first invoice yet for this thirdparty.
279 $objecttmp->socid = $expd->socid;
280 $objecttmp->thirdparty = $expd->thirdparty;
281
282 $objecttmp->type = $objecttmp::TYPE_STANDARD;
283 $objecttmp->cond_reglement_id = !empty($expdCmdSrc->cond_reglement_id) ? $expdCmdSrc->cond_reglement_id : (!empty($objecttmp->thirdparty->cond_reglement_id) ? $objecttmp->thirdparty->cond_reglement_id : 1);
284 $objecttmp->mode_reglement_id = !empty($expdCmdSrc->mode_reglement_id) ? $expdCmdSrc->mode_reglement_id : (!empty($objecttmp->thirdparty->mode_reglement_id) ? $objecttmp->thirdparty->mode_reglement_id : 0);
285
286 $objecttmp->fk_project = $expd->fk_project;
287 $objecttmp->multicurrency_code = !empty($expdCmdSrc->multicurrency_code) ? $expdCmdSrc->multicurrency_code : (!empty($objecttmp->thirdparty->multicurrency_code) ? $objecttmp->thirdparty->multicurrency_code : $expd->multicurrency_code);
288 if (empty($createbills_onebythird)) {
289 $objecttmp->ref_customer = $expd->ref_customer;
290 }
291
292 $datefacture = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
293 if (empty($datefacture)) {
294 $datefacture = dol_now();
295 }
296
297 $objecttmp->date = $datefacture;
298 $objecttmp->origin_type = 'shipping';
299 $objecttmp->origin_id = $id_sending;
300
301 $objecttmp->array_options = $expd->array_options; // Copy extrafields
302
303 $res = $objecttmp->create($user);
304
305 if ($res > 0) {
306 $nb_bills_created++;
307 $lastref = $objecttmp->ref;
308 $lastid = $objecttmp->id;
309
310 $TFactThird[$expd->socid] = $objecttmp;
311 $TFactThirdNbLines[$expd->socid] = 0; //init nblines to have lines ordered by expedition and rang
312 } else {
313 $langs->load("errors");
314 $errors[] = $expd->ref.' : '.$langs->trans($objecttmp->errors[0]);
315 $error++;
316 }
317 }
318
319 if ($objecttmp->id > 0) {
320 $res = $objecttmp->add_object_linked($objecttmp->origin, $id_sending);
321
322 if ($res == 0) {
323 $errors[] = $expd->ref.' : '.$langs->trans($objecttmp->errors[0]);
324 $error++;
325 }
326
327 $expd->fetchObjectLinked();
328 foreach ($expd->linkedObjectsIds as $sourcetype => $TIds) {
329 if ($sourcetype == 'facture') {
330 continue;
331 }
332 if (!empty($createbills_onebythird) && !empty($TFactThird[$expd->socid])) {
333 $objecttmp->fetchObjectLinked($object->id, 'commande');
334 foreach ($objecttmp->linkedObjectsIds as $tmpSourcetype => $tmpTIds) {
335 if ($tmpSourcetype == $sourcetype) {
336 if (!empty(array_intersect($TIds, $tmpTIds))) {
337 continue 2;
338 }
339 }
340 }
341 }
342
343 $res = $objecttmp->add_object_linked($sourcetype, current($TIds));
344
345 if ($res == 0) {
346 $errors[] = $expd->ref.' : '.$langs->trans($objecttmp->errors[0]);
347 $error++;
348 }
349 }
350
351 if (!$error) {
352 $lines = $expd->lines;
353 if (empty($lines) && method_exists($expd, 'fetch_lines')) {
354 $expd->fetch_lines();
355 $lines = $expd->lines;
356 }
357
358 $fk_parent_line = 0;
359 $num = count($lines);
360
361 for ($i = 0; $i < $num; $i++) {
362 $desc = ($lines[$i]->desc ? $lines[$i]->desc : '');
363 // If we build one invoice for several sendings, we must put the ref of sending on the invoice line
364 if (!empty($createbills_onebythird)) {
365 $desc = dol_concatdesc($desc, $langs->trans("Order").': '.$expdCmdSrc->ref. ' - '. $langs->trans("Shipment").': '.$expd->ref.($expd->date_shipping ? ' - '.dol_print_date($expd->date_shipping, 'day') : ''));
366 }
367
368 if ($lines[$i]->subprice < 0 && empty($conf->global->INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN)) {
369 // Negative line, we create a discount line
370 $discount = new DiscountAbsolute($db);
371 $discount->socid = $objecttmp->socid;
372 $discount->amount_ht = abs($lines[$i]->total_ht);
373 $discount->amount_tva = abs($lines[$i]->total_tva);
374 $discount->amount_ttc = abs($lines[$i]->total_ttc);
375 $discount->tva_tx = $lines[$i]->tva_tx;
376 $discount->fk_user = $user->id;
377 $discount->description = $desc;
378 $discountid = $discount->create($user);
379 if ($discountid > 0) {
380 $result = $objecttmp->insert_discount($discountid);
381 //$result=$discount->link_to_invoice($lineid,$id);
382 } else {
383 setEventMessages($discount->error, $discount->errors, 'errors');
384 $error++;
385 break;
386 }
387 } else {
388 // Positive line
389 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
390 // Date start
391 $date_start = false;
392 if ($lines[$i]->date_debut_prevue) {
393 $date_start = $lines[$i]->date_debut_prevue;
394 }
395 if ($lines[$i]->date_debut_reel) {
396 $date_start = $lines[$i]->date_debut_reel;
397 }
398 if ($lines[$i]->date_start) {
399 $date_start = $lines[$i]->date_start;
400 }
401 //Date end
402 $date_end = false;
403 if ($lines[$i]->date_fin_prevue) {
404 $date_end = $lines[$i]->date_fin_prevue;
405 }
406 if ($lines[$i]->date_fin_reel) {
407 $date_end = $lines[$i]->date_fin_reel;
408 }
409 if ($lines[$i]->date_end) {
410 $date_end = $lines[$i]->date_end;
411 }
412 // Reset fk_parent_line for no child products and special product
413 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
414 $fk_parent_line = 0;
415 }
416
417 // Extrafields
418 if (method_exists($lines[$i], 'fetch_optionals')) {
419 $lines[$i]->fetch_optionals();
420 $array_options = $lines[$i]->array_options;
421 }
422
423 $objecttmp->context['createfromclone'] = 'createfromclone';
424
425 $rang = ($nbSendings > 1) ? -1 : $lines[$i]->rang;
426 //there may already be rows from previous sendings
427 if (!empty($createbills_onebythird)) {
428 $rang = $TFactThirdNbLines[$expd->socid];
429 }
430
431 $result = $objecttmp->addline(
432 $desc,
433 $lines[$i]->subprice,
434 $lines[$i]->qty,
435 $lines[$i]->tva_tx,
436 $lines[$i]->localtax1_tx,
437 $lines[$i]->localtax2_tx,
438 $lines[$i]->fk_product,
439 $lines[$i]->remise_percent,
440 $date_start,
441 $date_end,
442 0,
443 $lines[$i]->info_bits,
444 $lines[$i]->fk_remise_except,
445 'HT',
446 0,
447 $product_type,
448 $rang,
449 $lines[$i]->special_code,
450 $objecttmp->origin,
451 $lines[$i]->rowid,
452 $fk_parent_line,
453 $lines[$i]->fk_fournprice,
454 $lines[$i]->pa_ht,
455 $lines[$i]->label,
456 !empty($array_options) ? $array_options : '',
457 100,
458 0,
459 $lines[$i]->fk_unit
460 );
461 if ($result > 0) {
462 $lineid = $result;
463 if (!empty($createbills_onebythird)) { //increment rang to keep sending
464 $TFactThirdNbLines[$expd->socid]++;
465 }
466 } else {
467 $lineid = 0;
468 $error++;
469 $errors[] = $objecttmp->error;
470 break;
471 }
472 // Defined the new fk_parent_line
473 if ($result > 0 && $lines[$i]->product_type == 9) {
474 $fk_parent_line = $result;
475 }
476 }
477 }
478 }
479 }
480
481 if (!empty($createbills_onebythird) && empty($TFactThird[$expd->socid])) {
482 $TFactThird[$expd->socid] = $objecttmp;
483 } else {
484 $TFact[$objecttmp->id] = $objecttmp;
485 }
486 }
487
488 // Build doc with all invoices
489 $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird;
490 $toselect = array();
491
492 if (!$error && $validate_invoices) {
493 $massaction = $action = 'builddoc';
494
495 foreach ($TAllFact as &$objecttmp) {
496 $result = $objecttmp->validate($user);
497 if ($result <= 0) {
498 $error++;
499 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
500 break;
501 }
502
503 $id = $objecttmp->id; // For builddoc action
504
505 // Builddoc
506 $donotredirect = 1;
507 $upload_dir = $conf->facture->dir_output;
508 $permissiontoadd = $user->hasRight('facture', 'creer');
509
510 // Call action to build doc
511 $savobject = $object;
512 $object = $objecttmp;
513 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
514 $object = $savobject;
515 }
516
517 $massaction = $action = 'confirm_createbills';
518 }
519
520 if (!$error) {
521 $db->commit();
522
523 if ($nb_bills_created == 1) {
524 $texttoshow = $langs->trans('BillXCreated', '{s1}');
525 $texttoshow = str_replace('{s1}', '<a href="'.DOL_URL_ROOT.'/compta/facture/card.php?id='.urlencode(strval($lastid)).'">'.$lastref.'</a>', $texttoshow);
526 setEventMessages($texttoshow, null, 'mesgs');
527 } else {
528 setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs');
529 }
530
531 // Make a redirect to avoid to bill twice if we make a refresh or back
532 $param = '';
533 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
534 $param .= '&contextpage='.urlencode($contextpage);
535 }
536 if ($limit > 0 && $limit != $conf->liste_limit) {
537 $param .= '&limit='.urlencode(strval($limit));
538 }
539 if ($search_all) {
540 $param .= "&search_all=".urlencode($search_all);
541 }
542 if ($search_ref_exp) {
543 $param .= "&search_ref_exp=".urlencode($search_ref_exp);
544 }
545 if ($search_ref_liv) {
546 $param .= "&search_ref_liv=".urlencode($search_ref_liv);
547 }
548 if ($search_ref_customer) {
549 $param .= "&search_ref_customer=".urlencode($search_ref_customer);
550 }
551 if ($search_user > 0) {
552 $param .= '&search_user='.urlencode($search_user);
553 }
554 if ($search_sale > 0) {
555 $param .= '&search_sale='.urlencode($search_sale);
556 }
557 if ($search_company) {
558 $param .= "&search_company=".urlencode($search_company);
559 }
560 if ($search_shipping_method_id) {
561 $param .= "&amp;search_shipping_method_id=".urlencode($search_shipping_method_id);
562 }
563 if ($search_tracking) {
564 $param .= "&search_tracking=".urlencode($search_tracking);
565 }
566 if ($search_town) {
567 $param .= '&search_town='.urlencode($search_town);
568 }
569 if ($search_zip) {
570 $param .= '&search_zip='.urlencode($search_zip);
571 }
572 if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
573 $param .= '&search_type_thirdparty='.urlencode($search_type_thirdparty);
574 }
575 if ($search_dateshipping_start) {
576 $param .= '&search_dateshipping_startday='.urlencode(dol_print_date($search_dateshipping_start, '%d')).'&search_dateshipping_startmonth='.urlencode(dol_print_date($search_dateshipping_start, '%m')).'&search_dateshipping_startyear='.urlencode(dol_print_date($search_dateshipping_start, '%Y'));
577 }
578 if ($search_dateshipping_end) {
579 $param .= '&search_dateshipping_endday='.urlencode(dol_print_date($search_dateshipping_end, '%d')).'&search_dateshipping_endmonth='.urlencode(dol_print_date($search_dateshipping_end, '%m')).'&search_dateshipping_endyear='.urlencode(dol_print_date($search_dateshipping_end, '%Y'));
580 }
581 if ($search_datedelivery_start) {
582 $param .= '&search_datedelivery_startday='.urlencode(dol_print_date($search_datedelivery_start, '%d')).'&search_datedelivery_startmonth='.urlencode(dol_print_date($search_datedelivery_start, '%m')).'&search_datedelivery_startyear='.urlencode(dol_print_date($search_datedelivery_start, '%Y'));
583 }
584 if ($search_datedelivery_end) {
585 $param .= '&search_datedelivery_endday='.urlencode(dol_print_date($search_datedelivery_end, '%d')).'&search_datedelivery_endmonth='.urlencode(dol_print_date($search_datedelivery_end, '%m')).'&search_datedelivery_endyear='.urlencode(dol_print_date($search_datedelivery_end, '%Y'));
586 }
587 if ($search_datereceipt_start) {
588 $param .= '&search_datereceipt_startday='.urlencode(dol_print_date($search_datereceipt_start, '%d')).'&search_datereceipt_startmonth='.urlencode(dol_print_date($search_datereceipt_start, '%m')).'&search_datereceipt_startyear='.urlencode(dol_print_date($search_datereceipt_start, '%Y'));
589 }
590 if ($search_datereceipt_end) {
591 $param .= '&search_datereceipt_endday='.urlencode(dol_print_date($search_datereceipt_end, '%d')).'&search_datereceipt_endmonth='.urlencode(dol_print_date($search_datereceipt_end, '%m')).'&search_datereceipt_endyear='.urlencode(dol_print_date($search_datereceipt_end, '%Y'));
592 }
593 if ($search_product_category != '') {
594 $param .= '&search_product_category='.urlencode($search_product_category);
595 }
596 if (($search_categ_cus > 0) || ($search_categ_cus == -2)) {
597 $param .= '&search_categ_cus='.urlencode($search_categ_cus);
598 }
599 if ($search_status != '') {
600 $param .= '&search_status='.urlencode($search_status);
601 }
602 if ($search_signed_status != '' && $search_signed_status >= 0) {
603 $param .= '&search_signed_status='.urlencode($search_signed_status);
604 }
605 if ($optioncss != '') {
606 $param .= '&optioncss='.urlencode($optioncss);
607 }
608 if ($search_billed != '') {
609 $param .= '&billed='.urlencode($search_billed);
610 }
611
612 header("Location: ".$_SERVER['PHP_SELF'].'?'.$param);
613 exit;
614 } else {
615 $db->rollback();
616
617 $action = 'create';
618 $_GET["origin"] = $_POST["origin"];
619 $_GET["originid"] = $_POST["originid"];
620 if (!empty($errors)) {
621 setEventMessages(null, $errors, 'errors');
622 } else {
623 setEventMessages("Error", null, 'errors');
624 }
625 $error++;
626 }
627 }
628
629 // If massaction is close
630 if ($massaction == 'classifyclose') {
631 $error = 0;
632 $selectids = GETPOST('toselect', 'array');
633 foreach ($selectids as $selectid) {
634 // $object->fetch($selectid);
635 $object->fetch($selectid);
636 $result = $object->setClosed();
637 }
638
639 $massaction = $action = 'classifyclose';
640
641 if ($result < 0) {
642 $error++;
643 }
644
645
646 if (!$error) {
647 $db->commit();
648
649 setEventMessage($langs->trans("Close Done"));
650 header('Location: '.$_SERVER["PHP_SELF"]);
651 exit;
652 } else {
653 $db->rollback();
654 exit;
655 }
656 }
657}
658
659/*
660 * View
661 */
662
663$now = dol_now();
664
665$form = new Form($db);
666$formother = new FormOther($db);
667$formfile = new FormFile($db);
668$companystatic = new Societe($db);
669$formcompany = new FormCompany($db);
670$shipment = new Expedition($db);
671
672$title = $langs->trans('Shipments');
673$help_url = 'EN:Module_Shipments|FR:Module_Exp&eacute;ditions|ES:M&oacute;dulo_Expediciones';
674
675llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'bodyforlist mod-expedition page-list');
676
677$sql = 'SELECT';
678if ($search_all || $search_user > 0) {
679 $sql = 'SELECT DISTINCT';
680}
681$sql .= " e.rowid, e.ref, e.ref_customer, e.date_expedition as date_expedition, e.weight, e.weight_units, e.date_expedition, e.date_delivery as delivery_date, e.fk_statut, e.signed_status, e.billed, e.tracking_number, e.fk_shipping_method,";
682if (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY')) {
683 // Link for delivery fields ref and date. Does not duplicate the line because we should always have only 1 link or 0 per shipment
684 $sql .= " l.date_delivery as date_reception,";
685}
686$sql .= " s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, ";
687$sql .= " typent.code as typent_code,";
688$sql .= " state.code_departement as state_code, state.nom as state_name,";
689$sql .= " e.date_creation as date_creation, e.tms as date_modification,e.note_public, e.note_private,";
690$sql .= " u.login";
691// Add fields from extrafields
692if (!empty($extrafields->attributes[$object->table_element]['label'])) {
693 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
694 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
695 }
696}
697// Add fields from hooks
698$parameters = array();
699$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
700$sql .= $hookmanager->resPrint;
701
702$sqlfields = $sql; // $sql fields to remove for count total
703
704$sql .= " FROM ".MAIN_DB_PREFIX."expedition as e";
705if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
706 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (e.rowid = ef.fk_object)";
707}
708if ($search_all) {
709 $sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'expeditiondet as ed ON e.rowid=ed.fk_expedition';
710}
711$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc";
712$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
713$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
714$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
715if (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY')) {
716 // Link for delivery fields ref and date. Does not duplicate the line because we should always have only 1 link or 0 per shipment
717 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as ee ON e.rowid = ee.fk_source AND ee.sourcetype = 'shipping' AND ee.targettype = 'delivery'";
718 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."delivery as l ON l.rowid = ee.fk_target";
719}
720$sql .= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON e.fk_user_author = u.rowid';
721if ($search_user > 0) { // Get link to order to get the order id in eesource.fk_source
722 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as eesource ON eesource.fk_target = e.rowid AND eesource.targettype = 'shipping' AND eesource.sourcetype = 'commande'";
723}
724if ($search_user > 0) {
725 $sql .= ", ".MAIN_DB_PREFIX."element_contact as ec";
726 $sql .= ", ".MAIN_DB_PREFIX."c_type_contact as tc";
727}
728
729// Add table from hooks
730$parameters = array();
731$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
732$sql .= $hookmanager->resPrint;
733
734$sql .= " WHERE e.entity IN (".getEntity('expedition').")";
735
736if ($socid > 0) {
737 $sql .= " AND s.rowid = ".((int) $socid);
738}
739if ($socid) {
740 $sql .= " AND e.fk_soc = ".((int) $socid);
741}
742if ($search_status != '' && $search_status >= 0) {
743 $sql .= " AND e.fk_statut = ".((int) $search_status);
744}
745if ($search_signed_status != '' && $search_signed_status >= 0) {
746 $sql .= ' AND e.signed_status = '.urlencode($search_signed_status);
747}
748if ($search_ref_customer != '') {
749 $sql .= natural_search('e.ref_customer', $search_ref_customer);
750}
751if ($search_billed != '' && $search_billed >= 0) {
752 $sql .= ' AND e.billed = '.((int) $search_billed);
753}
754if ($search_town) {
755 $sql .= natural_search('s.town', $search_town);
756}
757if ($search_zip) {
758 $sql .= natural_search("s.zip", $search_zip);
759}
760if ($search_state) {
761 $sql .= natural_search("state.nom", $search_state);
762}
763if ($search_country) {
764 $sql .= " AND s.fk_pays IN (".$db->sanitize($search_country).')';
765}
766if (!empty($search_shipping_method_ids)) {
767 $sql .= " AND e.fk_shipping_method IN (".$db->sanitize(implode(',', $search_shipping_method_ids)).')';
768}
769if ($search_tracking) {
770 $sql .= natural_search("e.tracking_number", $search_tracking);
771}
772if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
773 $sql .= " AND s.fk_typent IN (".$db->sanitize($search_type_thirdparty).')';
774}
775if ($search_user > 0) {
776 // The contact on a shipment is also the contact of the order.
777 $sql .= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='commande' AND tc.source='internal' AND ec.element_id = eesource.fk_source AND ec.fk_socpeople = ".((int) $search_user);
778}
779if ($search_company) {
780 $sql .= natural_search('s.nom', $search_company);
781}
782if ($search_ref_exp) {
783 $sql .= natural_search('e.ref', $search_ref_exp);
784}
785if ($search_dateshipping_start) {
786 $sql .= " AND e.date_expedition >= '".$db->idate($search_dateshipping_start)."'";
787}
788if ($search_dateshipping_end) {
789 $sql .= " AND e.date_expedition <= '".$db->idate($search_dateshipping_end)."'";
790}
791if ($search_datedelivery_start) {
792 $sql .= " AND e.date_delivery >= '".$db->idate($search_datedelivery_start)."'";
793}
794if ($search_datedelivery_end) {
795 $sql .= " AND e.date_delivery <= '".$db->idate($search_datedelivery_end)."'";
796}
797if (getDolGlobalInt('MAIN_SUBMODULE_DELIVERY')) {
798 if ($search_ref_liv) {
799 $sql .= natural_search('l.ref', $search_ref_liv);
800 }
801 if ($search_datereceipt_start) {
802 $sql .= " AND l.date_delivery >= '".$db->idate($search_datereceipt_start)."'";
803 }
804 if ($search_datereceipt_end) {
805 $sql .= " AND l.date_delivery <= '".$db->idate($search_datereceipt_end)."'";
806 }
807}
808if ($search_all) {
809 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
810}
811// Search on sale representative
812if ($search_sale && $search_sale != '-1') {
813 if ($search_sale == -2) {
814 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = e.fk_soc)";
815 } elseif ($search_sale > 0) {
816 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = e.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
817 }
818}
819// Search for tag/category ($searchCategoryCustomerList is an array of ID)
820$searchCategoryCustomerOperator = -1;
821$searchCategoryCustomerList = array($search_categ_cus);
822if (!empty($searchCategoryCustomerList)) {
823 $searchCategoryCustomerSqlList = array();
824 $listofcategoryid = '';
825 foreach ($searchCategoryCustomerList as $searchCategoryCustomer) {
826 if (intval($searchCategoryCustomer) == -2) {
827 $searchCategoryCustomerSqlList[] = "NOT EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc)";
828 } elseif (intval($searchCategoryCustomer) > 0) {
829 if ($searchCategoryCustomerOperator == 0) {
830 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie = ".((int) $searchCategoryCustomer).")";
831 } else {
832 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryCustomer);
833 }
834 }
835 }
836 if ($listofcategoryid) {
837 $searchCategoryCustomerSqlList[] = " EXISTS (SELECT cs.fk_soc FROM ".MAIN_DB_PREFIX."categorie_societe as cs WHERE s.rowid = cs.fk_soc AND cs.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
838 }
839 if ($searchCategoryCustomerOperator == 1) {
840 if (!empty($searchCategoryCustomerSqlList)) {
841 $sql .= " AND (".implode(' OR ', $searchCategoryCustomerSqlList).")";
842 }
843 } else {
844 if (!empty($searchCategoryCustomerSqlList)) {
845 $sql .= " AND (".implode(' AND ', $searchCategoryCustomerSqlList).")";
846 }
847 }
848}
849// Search for tag/category ($searchCategoryProductList is an array of ID)
850$searchCategoryProductOperator = -1;
851$searchCategoryProductList = array($search_product_category);
852if (!empty($searchCategoryProductList)) {
853 $searchCategoryProductSqlList = array();
854 $listofcategoryid = '';
855 foreach ($searchCategoryProductList as $searchCategoryProduct) {
856 if (intval($searchCategoryProduct) == -2) {
857 $searchCategoryProductSqlList[] = "NOT EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_elementdet = cd.rowid AND cd.fk_product = ck.fk_product)";
858 } elseif (intval($searchCategoryProduct) > 0) {
859 if ($searchCategoryProductOperator == 0) {
860 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_elementdet = cd.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie = ".((int) $searchCategoryProduct).")";
861 } else {
862 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryProduct);
863 }
864 }
865 }
866 if ($listofcategoryid) {
867 $searchCategoryProductSqlList[] = " EXISTS (SELECT ck.fk_product FROM ".MAIN_DB_PREFIX."categorie_product as ck, ".MAIN_DB_PREFIX."expeditiondet as ed, ".MAIN_DB_PREFIX."commandedet as cd WHERE ed.fk_expedition = e.rowid AND ed.fk_elementdet = cd.rowid AND cd.fk_product = ck.fk_product AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
868 }
869 if ($searchCategoryProductOperator == 1) {
870 if (!empty($searchCategoryProductSqlList)) {
871 $sql .= " AND (".implode(' OR ', $searchCategoryProductSqlList).")";
872 }
873 } else {
874 if (!empty($searchCategoryProductSqlList)) {
875 $sql .= " AND (".implode(' AND ', $searchCategoryProductSqlList).")";
876 }
877 }
878}
879// Add where from extra fields
880include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
881
882// Add where from hooks
883$parameters = array();
884$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
885$sql .= $hookmanager->resPrint;
886
887// Add HAVING from hooks
888$parameters = array();
889$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
890$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
891
892$nbtotalofrecords = '';
893if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
894 /* The fast and low memory method to get and count full list converts the sql into a sql count */
895 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
896 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
897 $resql = $db->query($sqlforcount);
898 if ($resql) {
899 $objforcount = $db->fetch_object($resql);
900 $nbtotalofrecords = $objforcount->nbtotalofrecords;
901 } else {
902 dol_print_error($db);
903 }
904
905 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
906 $page = 0;
907 $offset = 0;
908 }
909 $db->free($resql);
910}
911
912// Complete request and execute it with limit
913$sql .= $db->order($sortfield, $sortorder);
914if ($limit) {
915 $sql .= $db->plimit($limit + 1, $offset);
916}
917
918//print $sql;
919$resql = $db->query($sql);
920if (!$resql) {
921 dol_print_error($db);
922 exit;
923}
924
925$num = $db->num_rows($resql);
926
927$arrayofselected = is_array($toselect) ? $toselect : array();
928
929// Redirect to expedition card if there is only one result for global search
930if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all) {
931 $obj = $db->fetch_object($resql);
932 $id = $obj->rowid;
933 header("Location: ".DOL_URL_ROOT.'/expedition/card.php?id='.$id);
934 exit;
935}
936
937if ($socid > 0) {
938 $soc = new Societe($db);
939 $soc->fetch($socid);
940 if (empty($search_company)) {
941 $search_company = $soc->name;
942 }
943}
944
945$param = '';
946if ($socid > 0) {
947 $param .= '&socid='.urlencode((string) ($socid));
948}
949if (!empty($mode)) {
950 $param .= '&mode='.urlencode($mode);
951}
952if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
953 $param .= '&contextpage='.urlencode($contextpage);
954}
955if ($limit > 0 && $limit != $conf->liste_limit) {
956 $param .= '&limit='.((int) $limit);
957}
958if ($search_all) {
959 $param .= "&search_all=".urlencode($search_all);
960}
961if ($search_ref_exp) {
962 $param .= "&search_ref_exp=".urlencode($search_ref_exp);
963}
964if ($search_ref_liv) {
965 $param .= "&search_ref_liv=".urlencode($search_ref_liv);
966}
967if ($search_ref_customer) {
968 $param .= "&search_ref_customer=".urlencode($search_ref_customer);
969}
970if ($search_user > 0) {
971 $param .= '&search_user='.urlencode((string) ($search_user));
972}
973if ($search_sale > 0) {
974 $param .= '&search_sale='.urlencode((string) ($search_sale));
975}
976if ($search_company) {
977 $param .= "&search_company=".urlencode($search_company);
978}
979if ($search_shipping_method_ids) {
980 foreach ($search_shipping_method_ids as $value) {
981 $param .= "&amp;search_shipping_method_ids[]=".urlencode($value);
982 }
983}
984if ($search_tracking) {
985 $param .= "&search_tracking=".urlencode($search_tracking);
986}
987if ($search_town) {
988 $param .= '&search_town='.urlencode($search_town);
989}
990if ($search_zip) {
991 $param .= '&search_zip='.urlencode($search_zip);
992}
993if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
994 $param .= '&search_type_thirdparty='.urlencode((string) ($search_type_thirdparty));
995}
996if ($search_dateshipping_start) {
997 $param .= '&search_dateshipping_startday='.urlencode(dol_print_date($search_dateshipping_start, '%d')).'&search_dateshipping_startmonth='.urlencode(dol_print_date($search_dateshipping_start, '%m')).'&search_dateshipping_startyear='.urlencode(dol_print_date($search_dateshipping_start, '%Y'));
998}
999if ($search_dateshipping_end) {
1000 $param .= '&search_dateshipping_endday='.urlencode(dol_print_date($search_dateshipping_end, '%d')).'&search_dateshipping_endmonth='.urlencode(dol_print_date($search_dateshipping_end, '%m')).'&search_dateshipping_endyear='.urlencode(dol_print_date($search_dateshipping_end, '%Y'));
1001}
1002if ($search_datedelivery_start) {
1003 $param .= '&search_datedelivery_startday='.urlencode(dol_print_date($search_datedelivery_start, '%d')).'&search_datedelivery_startmonth='.urlencode(dol_print_date($search_datedelivery_start, '%m')).'&search_datedelivery_startyear='.urlencode(dol_print_date($search_datedelivery_start, '%Y'));
1004}
1005if ($search_datedelivery_end) {
1006 $param .= '&search_datedelivery_endday='.urlencode(dol_print_date($search_datedelivery_end, '%d')).'&search_datedelivery_endmonth='.urlencode(dol_print_date($search_datedelivery_end, '%m')).'&search_datedelivery_endyear='.urlencode(dol_print_date($search_datedelivery_end, '%Y'));
1007}
1008if ($search_datereceipt_start) {
1009 $param .= '&search_datereceipt_startday='.urlencode(dol_print_date($search_datereceipt_start, '%d')).'&search_datereceipt_startmonth='.urlencode(dol_print_date($search_datereceipt_start, '%m')).'&search_datereceipt_startyear='.urlencode(dol_print_date($search_datereceipt_start, '%Y'));
1010}
1011if ($search_datereceipt_end) {
1012 $param .= '&search_datereceipt_endday='.urlencode(dol_print_date($search_datereceipt_end, '%d')).'&search_datereceipt_endmonth='.urlencode(dol_print_date($search_datereceipt_end, '%m')).'&search_datereceipt_endyear='.urlencode(dol_print_date($search_datereceipt_end, '%Y'));
1013}
1014if ($search_product_category != '') {
1015 $param .= '&search_product_category='.urlencode((string) ($search_product_category));
1016}
1017if (($search_categ_cus > 0) || ($search_categ_cus == -2)) {
1018 $param .= '&search_categ_cus='.urlencode((string) ($search_categ_cus));
1019}
1020if ($search_status != '') {
1021 $param .= '&search_status='.urlencode($search_status);
1022}
1023if ($search_signed_status != '' && $search_signed_status >= 0) {
1024 $param .= '&search_signed_status='.urlencode($search_signed_status);
1025}
1026if ($optioncss != '') {
1027 $param .= '&optioncss='.urlencode($optioncss);
1028}
1029// Add $param from extra fields
1030include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
1031
1032// Add $param from hooks
1033$parameters = array('param' => &$param);
1034$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1035$param .= $hookmanager->resPrint;
1036
1037$arrayofmassactions = array(
1038 'generate_doc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
1039 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
1040 'classifyclose' => img_picto('', 'stop-circle', 'class="pictofixedwidth"').$langs->trans("Close"),
1041 'presend' => img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
1042);
1043if ($user->hasRight('facture', 'creer')) {
1044 $arrayofmassactions['createbills'] = img_picto('', 'bill', 'class="pictofixedwidth"').$langs->trans("CreateInvoiceForThisCustomerFromSendings");
1045}
1046if (in_array($massaction, array('presend', 'createbills'))) {
1047 $arrayofmassactions = array();
1048}
1049$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
1050
1051// Currently: a sending can't create from sending list
1052// $url = DOL_URL_ROOT.'/expedition/card.php?action=create';
1053// if (!empty($socid)) $url .= '&socid='.$socid;
1054// $newcardbutton = dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', $url, '', $user->rights->expedition->creer);
1055$newcardbutton = '';
1056$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'));
1057$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'));
1058$newcardbutton .= dolGetButtonTitleSeparator();
1059$newcardbutton .= dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/expedition/card.php?action=create2', '', $user->hasRight('expedition', 'creer'));
1060
1061$i = 0;
1062print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">'."\n";
1063if ($optioncss != '') {
1064 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
1065}
1066print '<input type="hidden" name="token" value="'.newToken().'">';
1067print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
1068print '<input type="hidden" name="action" value="list">';
1069print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
1070print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
1071print '<input type="hidden" name="socid" value="'.$socid.'">';
1072print '<input type="hidden" name="mode" value="'.$mode.'">';
1073
1074// @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1075print_barre_liste($langs->trans('Shipments'), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'dolly', 0, $newcardbutton, '', $limit, 0, 0, 1);
1076
1077$topicmail = "SendShippingRef";
1078$modelmail = "shipping_send";
1079$objecttmp = new Expedition($db);
1080$trackid = 'shi'.$object->id;
1081include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
1082
1083if ($massaction == 'createbills') {
1084 print '<input type="hidden" name="massaction" value="confirm_createbills">';
1085
1086 print '<table class="noborder centpercent">';
1087 print '<tr>';
1088 print '<td class="titlefield">';
1089 print $langs->trans('DateInvoice');
1090 print '</td>';
1091 print '<td>';
1092 print $form->selectDate('', '', '', '', '', '', 1, 1);
1093 print '</td>';
1094 print '</tr>';
1095 print '<tr>';
1096 print '<td>';
1097 print $langs->trans('CreateOneBillByThird');
1098 print '</td>';
1099 print '<td>';
1100 print $form->selectyesno('createbills_onebythird', '', 1);
1101 print '</td>';
1102 print '</tr>';
1103 print '<tr>';
1104 print '<td>';
1105 print $langs->trans('ValidateInvoices');
1106 print '</td>';
1107 print '<td>';
1108 if (!empty($conf->stock->enabled) && !empty($conf->global->STOCK_CALCULATE_ON_BILL)) {
1109 print $form->selectyesno('validate_invoices', 0, 1, 1);
1110 $langs->load("errors");
1111 print ' ('.$langs->trans("WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal").')';
1112 } else {
1113 print $form->selectyesno('validate_invoices', 0, 1);
1114 }
1115 if (!empty($conf->workflow->enabled) && !empty($conf->global->WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER)) {
1116 print ' &nbsp; &nbsp; <span class="opacitymedium">'.$langs->trans("IfValidateInvoiceIsNoSendingStayUnbilled").'</span>';
1117 } else {
1118 print ' &nbsp; &nbsp; <span class="opacitymedium">'.$langs->trans("OptionToSetSendingBilledNotEnabled").'</span>';
1119 }
1120 print '</td>';
1121 print '</tr>';
1122 print '</table>';
1123
1124 print '<br>';
1125 print '<div class="center">';
1126 print '<input type="submit" class="button" id="createbills" name="createbills" value="'.$langs->trans('CreateInvoiceForThisCustomerFromSendings').'"> ';
1127 print '<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
1128 print '</div>';
1129 print '<br>';
1130}
1131
1132if ($search_all) {
1133 foreach ($fieldstosearchall as $key => $val) {
1134 $fieldstosearchall[$key] = $langs->trans($val);
1135 }
1136 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
1137}
1138
1139$moreforfilter = '';
1140
1141// If the user can view prospects other than his'
1142if ($user->hasRight('user', 'user', 'lire')) {
1143 $langs->load("commercial");
1144 $moreforfilter .= '<div class="divsearchfield">';
1145 $tmptitle = $langs->trans('ThirdPartiesOfSaleRepresentative');
1146 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"');
1147 $moreforfilter .= $formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, $tmptitle, 'maxwidth200');
1148 $moreforfilter .= '</div>';
1149}
1150// If the user can view other users
1151if ($user->hasRight('user', 'user', 'lire')) {
1152 $moreforfilter .= '<div class="divsearchfield">';
1153 $tmptitle = $langs->trans('LinkedToSpecificUsers');
1154 $moreforfilter .= img_picto($tmptitle, 'user', 'class="pictofixedwidth"');
1155 $moreforfilter .= $form->select_dolusers($search_user, 'search_user', $tmptitle, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth200');
1156 $moreforfilter .= '</div>';
1157}
1158// If the user can view prospects other than his'
1159if (isModEnabled('category') && $user->hasRight('categorie', 'lire') && ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire'))) {
1160 include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1161 $moreforfilter .= '<div class="divsearchfield">';
1162 $tmptitle = $langs->trans('IncludingProductWithTag');
1163 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"');
1164 //$cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1);
1165 //$moreforfilter .= $form->selectarray('search_product_category', $cate_arbo, $search_product_category, 1, 0, 0, '', 0, 0, 0, 0, 'maxwidth300', 1);
1166 $moreforfilter .= $formother->select_categories(Categorie::TYPE_PRODUCT, $search_product_category, 'search_product_category', 1, $tmptitle);
1167
1168 $moreforfilter .= '</div>';
1169}
1170if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
1171 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
1172 $moreforfilter .= '<div class="divsearchfield">';
1173 $tmptitle = $langs->trans('CustomersProspectsCategoriesShort');
1174 $moreforfilter .= img_picto($tmptitle, 'category', 'class="pictofixedwidth"');
1175 $moreforfilter .= $formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $tmptitle);
1176 $moreforfilter .= '</div>';
1177}
1178$parameters = array();
1179$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1180if (empty($reshook)) {
1181 $moreforfilter .= $hookmanager->resPrint;
1182} else {
1183 $moreforfilter = $hookmanager->resPrint;
1184}
1185
1186if (!empty($moreforfilter)) {
1187 print '<div class="liste_titre liste_titre_bydiv centpercent">';
1188 print $moreforfilter;
1189 print '</div>';
1190}
1191
1192$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
1193$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN'));
1194if ($massactionbutton) {
1195 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); // This also change content of $arrayfields
1196}
1197
1198print '<div class="div-table-responsive">';
1199print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
1200
1201// Fields title search
1202// --------------------------------------------------------------------
1203print '<tr class="liste_titre_filter">';
1204// Action column
1205if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1206 print '<td class="liste_titre center maxwidthsearch">';
1207 $searchpicto = $form->showFilterButtons('left');
1208 print $searchpicto;
1209 print '</td>';
1210}
1211// Ref
1212if (!empty($arrayfields['e.ref']['checked'])) {
1213 print '<td class="liste_titre">';
1214 print '<input class="flat" size="6" type="text" name="search_ref_exp" value="'.$search_ref_exp.'">';
1215 print '</td>';
1216}
1217// Ref customer
1218if (!empty($arrayfields['e.ref_customer']['checked'])) {
1219 print '<td class="liste_titre">';
1220 print '<input class="flat" size="6" type="text" name="search_ref_customer" value="'.$search_ref_customer.'">';
1221 print '</td>';
1222}
1223// Thirdparty
1224if (!empty($arrayfields['s.nom']['checked'])) {
1225 print '<td class="liste_titre left">';
1226 print '<input class="flat" type="text" size="8" name="search_company" value="'.dol_escape_htmltag($search_company).'">';
1227 print '</td>';
1228}
1229// Town
1230if (!empty($arrayfields['s.town']['checked'])) {
1231 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_town" value="'.$search_town.'"></td>';
1232}
1233// Zip
1234if (!empty($arrayfields['s.zip']['checked'])) {
1235 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_zip" value="'.$search_zip.'"></td>';
1236}
1237// State
1238if (!empty($arrayfields['state.nom']['checked'])) {
1239 print '<td class="liste_titre">';
1240 print '<input class="flat" size="4" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1241 print '</td>';
1242}
1243// Country
1244if (!empty($arrayfields['country.code_iso']['checked'])) {
1245 print '<td class="liste_titre center">';
1246 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1247 print '</td>';
1248}
1249// Company type
1250if (!empty($arrayfields['typent.code']['checked'])) {
1251 print '<td class="liste_titre maxwidthonsmartphone center">';
1252 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'), 'maxwidth75', 1);
1253 print '</td>';
1254}
1255// Weight
1256if (!empty($arrayfields['e.weight']['checked'])) {
1257 print '<td class="liste_titre maxwidthonsmartphone center">';
1258
1259 print '</td>';
1260}
1261// Date delivery planned
1262if (!empty($arrayfields['e.date_delivery']['checked'])) {
1263 print '<td class="liste_titre center">';
1264 print '<div class="nowrapfordate">';
1265 print $form->selectDate($search_datedelivery_start ? $search_datedelivery_start : -1, 'search_datedelivery_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1266 print '</div>';
1267 print '<div class="nowrapfordate">';
1268 print $form->selectDate($search_datedelivery_end ? $search_datedelivery_end : -1, 'search_datedelivery_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1269 print '</div>';
1270 print '</td>';
1271}
1272// Date shipping
1273if (!empty($arrayfields['e.date_expedition']['checked'])) {
1274 print '<td class="liste_titre center">';
1275 print '<div class="nowrapfordate">';
1276 print $form->selectDate($search_dateshipping_start ? $search_dateshipping_start : -1, 'search_dateshipping_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1277 print '</div>';
1278 print '<div class="nowrapfordate">';
1279 print $form->selectDate($search_dateshipping_end ? $search_dateshipping_end : -1, 'search_dateshipping_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1280 print '</div>';
1281 print '</td>';
1282}
1283if (!empty($arrayfields['e.fk_shipping_method']['checked'])) {
1284 // Delivery method
1285 print '<td class="liste_titre center">';
1286 $shipment->fetch_delivery_methods();
1287 print $form->selectarray("search_shipping_method_ids[]", $shipment->meths, $search_shipping_method_ids, 1, 0, 0, 'multiple', 1, 0, 0, '', 'maxwidth150');
1288 print "</td>\n";
1289}
1290// Tracking number
1291if (!empty($arrayfields['e.tracking_number']['checked'])) {
1292 print '<td class="liste_titre center">';
1293 print '<input class="flat" size="6" type="text" name="search_tracking" value="'.dol_escape_htmltag($search_tracking).'">';
1294 print '</td>';
1295}
1296if (!empty($arrayfields['l.ref']['checked'])) {
1297 // Delivery ref
1298 print '<td class="liste_titre">';
1299 print '<input class="flat width75" type="text" name="search_ref_liv" value="'.dol_escape_htmltag($search_ref_liv).'"';
1300 print '</td>';
1301}
1302if (!empty($arrayfields['l.date_delivery']['checked'])) {
1303 // Date reception
1304 print '<td class="liste_titre center">';
1305 print '<div class="nowrapfordate">';
1306 print $form->selectDate($search_datereceipt_start ? $search_datereceipt_start : -1, 'search_datereceipt_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1307 print '</div>';
1308 print '<div class="nowrapfordate">';
1309 print $form->selectDate($search_datereceipt_end ? $search_datereceipt_end : -1, 'search_datereceipt_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1310 print '</div>';
1311 print '</td>';
1312}
1313// Note public
1314if (!empty($arrayfields['e.note_public']['checked'])) {
1315 print '<td class="liste_titre">';
1316 print '</td>';
1317}
1318// Note private
1319if (!empty($arrayfields['e.note_private']['checked'])) {
1320 print '<td class="liste_titre">';
1321 print '</td>';
1322}
1323// Extra fields
1324include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1325
1326// Fields from hook
1327$parameters = array('arrayfields' => $arrayfields);
1328$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1329print $hookmanager->resPrint;
1330// Date creation
1331if (!empty($arrayfields['e.datec']['checked'])) {
1332 print '<td class="liste_titre">';
1333 print '</td>';
1334}
1335// Date modification
1336if (!empty($arrayfields['e.tms']['checked'])) {
1337 print '<td class="liste_titre">';
1338 print '</td>';
1339}
1340// Status
1341if (!empty($arrayfields['e.fk_statut']['checked'])) {
1342 print '<td class="liste_titre right parentonrightofpage">';
1343 print $form->selectarray('search_status', array('0' => $langs->trans('StatusSendingDraftShort'), '1' => $langs->trans('StatusSendingValidatedShort'), '2' => $langs->trans('StatusSendingProcessedShort')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
1344 print '</td>';
1345}
1346// Signed status
1347if (!empty($arrayfields['e.signed_status']['checked'])) {
1348 print '<td class="liste_titre center">';
1349 $list_signed_status = $object->getSignedStatusLocalisedArray();
1350 print $form->selectarray('search_signed_status', $list_signed_status, $search_signed_status, 1, 0, 0, '', 1, 0, 0, '', 'search_status');
1351 print '</td>';
1352}
1353// Status billed
1354if (!empty($arrayfields['e.billed']['checked'])) {
1355 print '<td class="liste_titre maxwidthonsmartphone center">';
1356 print $form->selectyesno('search_billed', $search_billed, 1, 0, 1);
1357 print '</td>';
1358}
1359// Action column
1360if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1361 print '<td class="liste_titre center maxwidthsearch">';
1362 $searchpicto = $form->showFilterButtons();
1363 print $searchpicto;
1364 print '</td>';
1365}
1366print '</tr>'."\n";
1367
1368$totalarray = array();
1369$totalarray['nbfield'] = 0;
1370
1371// Fields title label
1372// --------------------------------------------------------------------
1373print '<tr class="liste_titre">';
1374// Action column
1375if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1376 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1377 $totalarray['nbfield']++;
1378}
1379if (!empty($arrayfields['e.ref']['checked'])) {
1380 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1381 print_liste_field_titre($arrayfields['e.ref']['label'], $_SERVER["PHP_SELF"], "e.ref", "", $param, '', $sortfield, $sortorder);
1382 $totalarray['nbfield']++;
1383}
1384if (!empty($arrayfields['e.ref_customer']['checked'])) {
1385 print_liste_field_titre($arrayfields['e.ref_customer']['label'], $_SERVER["PHP_SELF"], "e.ref_customer", "", $param, '', $sortfield, $sortorder);
1386 $totalarray['nbfield']++;
1387}
1388if (!empty($arrayfields['s.nom']['checked'])) {
1389 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder, 'left ');
1390 $totalarray['nbfield']++;
1391}
1392if (!empty($arrayfields['s.town']['checked'])) {
1393 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1394 $totalarray['nbfield']++;
1395}
1396if (!empty($arrayfields['s.zip']['checked'])) {
1397 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1398 $totalarray['nbfield']++;
1399}
1400if (!empty($arrayfields['state.nom']['checked'])) {
1401 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1402 $totalarray['nbfield']++;
1403}
1404if (!empty($arrayfields['country.code_iso']['checked'])) {
1405 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1406 $totalarray['nbfield']++;
1407}
1408if (!empty($arrayfields['typent.code']['checked'])) {
1409 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1410 $totalarray['nbfield']++;
1411}
1412if (!empty($arrayfields['e.weight']['checked'])) {
1413 print_liste_field_titre($arrayfields['e.weight']['label'], $_SERVER["PHP_SELF"], "e.weight", "", $param, '', $sortfield, $sortorder, 'center ');
1414 $totalarray['nbfield']++;
1415}
1416if (!empty($arrayfields['e.date_delivery']['checked'])) {
1417 print_liste_field_titre($arrayfields['e.date_delivery']['label'], $_SERVER["PHP_SELF"], "e.date_delivery", "", $param, '', $sortfield, $sortorder, 'center ');
1418 $totalarray['nbfield']++;
1419}
1420if (!empty($arrayfields['e.date_expedition']['checked'])) {
1421 print_liste_field_titre($arrayfields['e.date_expedition']['label'], $_SERVER["PHP_SELF"], "e.date_expedition", "", $param, '', $sortfield, $sortorder, 'center ');
1422 $totalarray['nbfield']++;
1423}
1424if (!empty($arrayfields['e.fk_shipping_method']['checked'])) {
1425 print_liste_field_titre($arrayfields['e.fk_shipping_method']['label'], $_SERVER["PHP_SELF"], "e.fk_shipping_method", "", $param, '', $sortfield, $sortorder, 'center ');
1426 $totalarray['nbfield']++;
1427}
1428if (!empty($arrayfields['e.tracking_number']['checked'])) {
1429 print_liste_field_titre($arrayfields['e.tracking_number']['label'], $_SERVER["PHP_SELF"], "e.tracking_number", "", $param, '', $sortfield, $sortorder, 'center ');
1430 $totalarray['nbfield']++;
1431}
1432if (!empty($arrayfields['l.ref']['checked'])) {
1433 print_liste_field_titre($arrayfields['l.ref']['label'], $_SERVER["PHP_SELF"], "l.ref", "", $param, '', $sortfield, $sortorder);
1434 $totalarray['nbfield']++;
1435}
1436if (!empty($arrayfields['l.date_delivery']['checked'])) {
1437 print_liste_field_titre($arrayfields['l.date_delivery']['label'], $_SERVER["PHP_SELF"], "l.date_delivery", "", $param, '', $sortfield, $sortorder, 'center ');
1438 $totalarray['nbfield']++;
1439}
1440if (!empty($arrayfields['e.note_public']['checked'])) {
1441 print_liste_field_titre($arrayfields['e.note_public']['label'], $_SERVER["PHP_SELF"], "e.note_public", "", $param, '', $sortfield, $sortorder, 'right ');
1442}
1443if (!empty($arrayfields['e.note_private']['checked'])) {
1444 print_liste_field_titre($arrayfields['e.note_private']['label'], $_SERVER["PHP_SELF"], "e.note_private", "", $param, '', $sortfield, $sortorder, 'right ');
1445}
1446
1447// Extra fields
1448include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1449// Hook fields
1450$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, '$totalarray' => &$totalarray);
1451$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1452print $hookmanager->resPrint;
1453if (!empty($arrayfields['e.datec']['checked'])) {
1454 print_liste_field_titre($arrayfields['e.datec']['label'], $_SERVER["PHP_SELF"], "e.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1455 $totalarray['nbfield']++;
1456}
1457if (!empty($arrayfields['e.tms']['checked'])) {
1458 print_liste_field_titre($arrayfields['e.tms']['label'], $_SERVER["PHP_SELF"], "e.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1459 $totalarray['nbfield']++;
1460}
1461if (!empty($arrayfields['e.fk_statut']['checked'])) {
1462 print_liste_field_titre($arrayfields['e.fk_statut']['label'], $_SERVER["PHP_SELF"], "e.fk_statut", "", $param, '', $sortfield, $sortorder, 'right ');
1463 $totalarray['nbfield']++;
1464}
1465if (!empty($arrayfields['e.signed_status']['checked'])) {
1466 print_liste_field_titre($arrayfields['e.signed_status']['label'], $_SERVER["PHP_SELF"], "e.signed_status", "", $param, '', $sortfield, $sortorder, 'center ');
1467 $totalarray['nbfield']++;
1468}
1469if (!empty($arrayfields['e.billed']['checked'])) {
1470 print_liste_field_titre($arrayfields['e.billed']['label'], $_SERVER["PHP_SELF"], "e.billed", "", $param, '', $sortfield, $sortorder, 'center ');
1471 $totalarray['nbfield']++;
1472}
1473// Action column
1474if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1475 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1476 $totalarray['nbfield']++;
1477}
1478print "</tr>\n";
1479
1480$typenArray = $formcompany->typent_array(1);
1481
1482// Loop on record
1483// --------------------------------------------------------------------
1484$i = 0;
1485$savnbfield = $totalarray['nbfield'];
1486$totalarray = array();
1487$totalarray['nbfield'] = 0;
1488$imaxinloop = ($limit ? min($num, $limit) : $num);
1489while ($i < $imaxinloop) {
1490 $obj = $db->fetch_object($resql);
1491 if (empty($obj)) {
1492 break; // Should not happen
1493 }
1494
1495 $companystatic->id = $obj->socid;
1496 $companystatic->ref = $obj->name;
1497 $companystatic->name = $obj->name;
1498
1499 $object = new Expedition($db);
1500 $object->fetch($obj->rowid);
1501
1502 if ($mode == 'kanban') {
1503 if ($i == 0) {
1504 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1505 print '<div class="box-flex-container kanban">';
1506 }
1507 $object->date_delivery = $obj->delivery_date;
1508 $object->town = $obj->town;
1509
1510 // Output Kanban
1511 $selected = -1;
1512 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1513 $selected = 0;
1514 if (in_array($object->id, $arrayofselected)) {
1515 $selected = 1;
1516 }
1517 }
1518 print $object->getKanbanView('', array('thirdparty' => $companystatic->getNomUrl(1), 'selected' => $selected));
1519 if ($i == min($num, $limit) - 1) {
1520 print '</div>';
1521 print '</td></tr>';
1522 }
1523 } else {
1524 print '<tr class="oddeven">';
1525
1526 // Action column
1527 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1528 print '<td class="nowrap center">';
1529 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1530 $selected = 0;
1531 if (in_array($obj->rowid, $arrayofselected)) {
1532 $selected = 1;
1533 }
1534 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1535 }
1536 print '</td>';
1537 }
1538 // Ref
1539 if (!empty($arrayfields['e.ref']['checked'])) {
1540 print '<td class="nowraponall">';
1541 print $object->getNomUrl(1);
1542 $filedir = ($conf->expedition->multidir_output[$object->entity] ? $conf->expedition->multidir_output[$object->entity] : $conf->expedition->dir_output).'/sending/'.get_exdir(0, 0, 0, 1, $object, '');
1543 $filename = dol_sanitizeFileName($object->ref);
1544 print $formfile->getDocumentsLink('expedition', $filename, $filedir);
1545 print "</td>\n";
1546 if (!$i) {
1547 $totalarray['nbfield']++;
1548 }
1549 }
1550
1551 // Ref customer
1552 if (!empty($arrayfields['e.ref_customer']['checked'])) {
1553 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->ref_customer).'">';
1554 print dol_escape_htmltag($obj->ref_customer);
1555 print "</td>\n";
1556 if (!$i) {
1557 $totalarray['nbfield']++;
1558 }
1559 }
1560
1561 // Third party
1562 if (!empty($arrayfields['s.nom']['checked'])) {
1563 print '<td class="tdoverflowmax150">';
1564 print $companystatic->getNomUrl(1);
1565 print '</td>';
1566 if (!$i) {
1567 $totalarray['nbfield']++;
1568 }
1569 }
1570 // Town
1571 if (!empty($arrayfields['s.town']['checked'])) {
1572 print '<td class="nocellnopadd">';
1573 print dol_escape_htmltag($obj->town);
1574 print '</td>';
1575 if (!$i) {
1576 $totalarray['nbfield']++;
1577 }
1578 }
1579 // Zip
1580 if (!empty($arrayfields['s.zip']['checked'])) {
1581 print '<td class="nocellnopadd center">';
1582 print dol_escape_htmltag($obj->zip);
1583 print '</td>';
1584 if (!$i) {
1585 $totalarray['nbfield']++;
1586 }
1587 }
1588 // State
1589 if (!empty($arrayfields['state.nom']['checked'])) {
1590 print '<td class="center">'.$obj->state_name."</td>\n";
1591 if (!$i) {
1592 $totalarray['nbfield']++;
1593 }
1594 }
1595 // Country
1596 if (!empty($arrayfields['country.code_iso']['checked'])) {
1597 print '<td class="center">';
1598 $tmparray = getCountry($obj->fk_pays, 'all');
1599 print dol_escape_htmltag($tmparray['label']);
1600 print '</td>';
1601 if (!$i) {
1602 $totalarray['nbfield']++;
1603 }
1604 }
1605 // Type ent
1606 if (!empty($arrayfields['typent.code']['checked'])) {
1607 print '<td class="center">';
1608 if (isset($typenArray[$obj->typent_code])) {
1609 print $typenArray[$obj->typent_code];
1610 }
1611 print '</td>';
1612 if (!$i) {
1613 $totalarray['nbfield']++;
1614 }
1615 }
1616 // Weight
1617 if (!empty($arrayfields['e.weight']['checked'])) {
1618 print '<td class="center">';
1619 if (empty($object->trueWeight)) {
1620 $tmparray = $object->getTotalWeightVolume();
1621 print showDimensionInBestUnit($tmparray['weight'], 0, "weight", $langs, getDolGlobalInt('MAIN_WEIGHT_DEFAULT_ROUND', -1), isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no');
1622 print $form->textwithpicto('', $langs->trans('EstimatedWeight'), 1);
1623 } else {
1624 print $object->trueWeight;
1625 print ($object->trueWeight && $object->weight_units != '') ? ' '.measuringUnitString(0, "weight", (string) $object->weight_units) : '';
1626 }
1627 print '</td>';
1628 if (!$i) {
1629 $totalarray['nbfield']++;
1630 }
1631 }
1632 // Date delivery planned
1633 if (!empty($arrayfields['e.date_delivery']['checked'])) {
1634 print '<td class="center nowraponall">';
1635 print dol_print_date($db->jdate($obj->delivery_date), "dayhour");
1636 print "</td>\n";
1637 if (!$i) {
1638 $totalarray['nbfield']++;
1639 }
1640 }
1641 // Date shipping
1642 if (!empty($arrayfields['e.date_expedition']['checked'])) {
1643 print '<td class="center nowraponall">';
1644 print dol_print_date($db->jdate($obj->date_expedition), "dayhour");
1645 print "</td>\n";
1646 if (!$i) {
1647 $totalarray['nbfield']++;
1648 }
1649 }
1650 if (!empty($arrayfields['e.fk_shipping_method']['checked'])) {
1651 // Get code using getLabelFromKey
1652 $code = $langs->getLabelFromKey($db, $object->shipping_method_id, 'c_shipment_mode', 'rowid', 'code');
1653 print '<td class="center tdoverflowmax150" title="'.dol_escape_htmltag($langs->trans("SendingMethod".strtoupper($code))).'">';
1654 if ($object->shipping_method_id > 0) {
1655 print $langs->trans("SendingMethod".strtoupper($code));
1656 }
1657 print '</td>';
1658 if (!$i) {
1659 $totalarray['nbfield']++;
1660 }
1661 }
1662 // Tracking number
1663 if (!empty($arrayfields['e.tracking_number']['checked'])) {
1664 $object->getUrlTrackingStatus($obj->tracking_number);
1665 print '<td class="center" title="'.dol_escape_htmltag($object->tracking_url).'">'.$object->tracking_url."</td>\n";
1666 if (!$i) {
1667 $totalarray['nbfield']++;
1668 }
1669 }
1670
1671 if (!empty($arrayfields['l.ref']['checked']) || !empty($arrayfields['l.date_delivery']['checked'])) {
1672 $object->fetchObjectLinked();
1673 $receiving = '';
1674 if (array_key_exists('delivery', $object->linkedObjects) && count($object->linkedObjects['delivery']) > 0) {
1675 $receiving = reset($object->linkedObjects['delivery']);
1676 }
1677
1678 if (!empty($arrayfields['l.ref']['checked'])) {
1679 // Ref
1680 print '<td class="nowraponall">';
1681 print !empty($receiving) ? $receiving->getNomUrl($db) : '';
1682 print '</td>';
1683 }
1684
1685 if (!empty($arrayfields['l.date_delivery']['checked'])) {
1686 // Date received
1687 print '<td class="center nowraponall">';
1688 print dol_print_date($db->jdate($obj->date_reception), "day");
1689 print '</td>'."\n";
1690 }
1691 }
1692 // Note public
1693 if (!empty($arrayfields['e.note_public']['checked'])) {
1694 print '<td class="sensiblehtmlcontent center">';
1695 print dolPrintHTML($obj->note_public);
1696 print '</td>';
1697 if (!$i) {
1698 $totalarray['nbfield']++;
1699 }
1700 }
1701 // Note private
1702 if (!empty($arrayfields['e.note_private']['checked'])) {
1703 print '<td class="sensiblehtmlcontent center">';
1704 print dolPrintHTML($obj->note_private);
1705 print '</td>';
1706 if (!$i) {
1707 $totalarray['nbfield']++;
1708 }
1709 }
1710 // Extra fields
1711 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1712 // Fields from hook
1713 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1714 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1715 print $hookmanager->resPrint;
1716 // Date creation
1717 if (!empty($arrayfields['e.datec']['checked'])) {
1718 print '<td class="center nowraponall">';
1719 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuserrel');
1720 print '</td>';
1721 if (!$i) {
1722 $totalarray['nbfield']++;
1723 }
1724 }
1725 // Date modification
1726 if (!empty($arrayfields['e.tms']['checked'])) {
1727 print '<td class="center nowraponall">';
1728 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1729 print '</td>';
1730 if (!$i) {
1731 $totalarray['nbfield']++;
1732 }
1733 }
1734 // Status
1735 if (!empty($arrayfields['e.fk_statut']['checked'])) {
1736 print '<td class="right nowrap">'.$object->getLibStatut(5).'</td>';
1737 if (!$i) {
1738 $totalarray['nbfield']++;
1739 }
1740 }
1741 // Signed Status
1742 if (!empty($arrayfields['e.signed_status']['checked'])) {
1743 print '<td class="center">'.$object->getLibSignedStatus(5).'</td>';
1744 if (!$i) {
1745 $totalarray['nbfield']++;
1746 }
1747 }
1748 // Billed
1749 if (!empty($arrayfields['e.billed']['checked'])) {
1750 print '<td class="center">'.yn($obj->billed).'</td>';
1751 if (!$i) {
1752 $totalarray['nbfield']++;
1753 }
1754 }
1755
1756 // Action column
1757 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1758 print '<td class="nowrap center">';
1759 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1760 $selected = 0;
1761 if (in_array($obj->rowid, $arrayofselected)) {
1762 $selected = 1;
1763 }
1764 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1765 }
1766 print '</td>';
1767 }
1768 if (!$i) {
1769 $totalarray['nbfield']++;
1770 }
1771
1772 print "</tr>\n";
1773 }
1774 $i++;
1775}
1776
1777// If no record found
1778if ($num == 0) {
1779 $colspan = 1;
1780 foreach ($arrayfields as $key => $val) {
1781 if (!empty($val['checked'])) {
1782 $colspan++;
1783 }
1784 }
1785 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1786}
1787
1788$db->free($resql);
1789
1790$parameters = array('arrayfields' => $arrayfields, 'totalarray' => $totalarray, 'sql' => $sql);
1791$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1792print $hookmanager->resPrint;
1793
1794print "</table>";
1795print "</div>";
1796print '</form>';
1797
1798$hidegeneratedfilelistifempty = 1;
1799if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1800 $hidegeneratedfilelistifempty = 0;
1801}
1802
1803// Show list of available documents
1804$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1805$urlsource .= str_replace('&amp;', '&', $param);
1806
1807$filedir = $diroutputmassaction;
1808$genallowed = $user->hasRight('expedition', 'lire');
1809$delallowed = $user->hasRight('expedition', 'creer');
1810$title = '';
1811
1812print $formfile->showdocuments('massfilesarea_sendings', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1813
1814// End of page
1815llxFooter();
1816$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
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:71
Class to manage customers orders.
Class to manage absolute discounts.
Class to manage standard extra fields.
Class to manage invoices.
Class to build HTML component for third parties management Only common components are here.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage third parties objects (customers, suppliers, prospects...)
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
llxFooter()
Footer empty.
Definition document.php:107
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...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
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.