dolibarr 21.0.0-alpha
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@capnetworks.com>
5 * Copyright (C) 2016 Ferran Marcet <fmarcet@2byte.es>
6 * Copyright (C) 2023-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
7 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php';
33require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
34require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
35require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40
41$langs->loadLangs(array("sendings", "receptions", "deliveries", 'companies', 'bills', 'orders'));
42
43$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'shipmentlist'; // To manage different context of search
44
45$socid = GETPOSTINT('socid');
46
47$action = GETPOST('action', 'alpha');
48$massaction = GETPOST('massaction', 'alpha');
49$toselect = GETPOST('toselect', 'array');
50$optioncss = GETPOST('optioncss', 'alpha');
51$mode = GETPOST('mode', 'alpha');
52
53
54$search_ref_rcp = GETPOST("search_ref_rcp");
55$search_ref_liv = GETPOST('search_ref_liv');
56$search_ref_supplier = GETPOST('search_ref_supplier');
57$search_company = GETPOST("search_company");
58$search_town = GETPOST('search_town', 'alpha');
59$search_zip = GETPOST('search_zip', 'alpha');
60$search_state = GETPOST("search_state");
61$search_country = GETPOST("search_country", 'aZ09');
62$search_type_thirdparty = GETPOST("search_type_thirdparty", 'intcomma');
63$search_date_delivery_startday = GETPOSTINT('search_date_delivery_startday');
64$search_date_delivery_startmonth = GETPOSTINT('search_date_delivery_startmonth');
65$search_date_delivery_startyear = GETPOSTINT('search_date_delivery_startyear');
66$search_date_delivery_endday = GETPOSTINT('search_date_delivery_endday');
67$search_date_delivery_endmonth = GETPOSTINT('search_date_delivery_endmonth');
68$search_date_delivery_endyear = GETPOSTINT('search_date_delivery_endyear');
69$search_date_delivery_start = dol_mktime(0, 0, 0, $search_date_delivery_startmonth, $search_date_delivery_startday, $search_date_delivery_startyear); // Use tzserver
70$search_date_delivery_end = dol_mktime(23, 59, 59, $search_date_delivery_endmonth, $search_date_delivery_endday, $search_date_delivery_endyear);
71$search_date_create_startday = GETPOSTINT('search_date_create_startday');
72$search_date_create_startmonth = GETPOSTINT('search_date_create_startmonth');
73$search_date_create_startyear = GETPOSTINT('search_date_create_startyear');
74$search_date_create_endday = GETPOSTINT('search_date_create_endday');
75$search_date_create_endmonth = GETPOSTINT('search_date_create_endmonth');
76$search_date_create_endyear = GETPOSTINT('search_date_create_endyear');
77$search_date_create_start = dol_mktime(0, 0, 0, $search_date_create_startmonth, $search_date_create_startday, $search_date_create_startyear); // Use tzserver
78$search_date_create_end = dol_mktime(23, 59, 59, $search_date_create_endmonth, $search_date_create_endday, $search_date_create_endyear);
79$search_billed = GETPOST("search_billed", 'intcomma');
80$search_status = GETPOST('search_status', 'intcomma');
81$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
82
83$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
84$sortfield = GETPOST('sortfield', 'aZ09comma');
85$sortorder = GETPOST('sortorder', 'aZ09comma');
86$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
87if (!$sortfield) {
88 $sortfield = "e.ref";
89}
90if (!$sortorder) {
91 $sortorder = "DESC";
92}
93if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
94 // If $page is not defined, or '' or -1 or if we click on clear filters
95 $page = 0;
96}
97$offset = $limit * $page;
98$pageprev = $page - 1;
99$pagenext = $page + 1;
100
101$diroutputmassaction = $conf->reception->multidir_output[$conf->entity].'/temp/massgeneration/'.$user->id;
102$object = new Reception($db);
103
104// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
105$hookmanager->initHooks(array('receptionlist'));
106$extrafields = new ExtraFields($db);
107
108// Fetch optionals attributes and labels
109$extrafields->fetch_name_optionals_label($object->table_element);
110$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
111
112// List of fields to search into when doing a "search in all"
113$fieldstosearchall = array(
114 'e.ref' => "Ref",
115 'e.ref_supplier' => "RefSupplier",
116 's.nom' => "ThirdParty",
117 'e.note_public' => 'NotePublic',
118);
119if (empty($user->socid)) {
120 $fieldstosearchall["e.note_private"] = "NotePrivate";
121}
122
123$checkedtypetiers = 0;
124$arrayfields = array(
125 'e.ref' => array('label' => $langs->trans("Ref"), 'checked' => 1),
126 'e.ref_supplier' => array('label' => $langs->trans("RefSupplier"), 'checked' => 1),
127 's.nom' => array('label' => $langs->trans("ThirdParty"), 'checked' => 1),
128 's.town' => array('label' => $langs->trans("Town"), 'checked' => 1),
129 's.zip' => array('label' => $langs->trans("Zip"), 'checked' => 1),
130 'state.nom' => array('label' => $langs->trans("StateShort"), 'checked' => 0),
131 'country.code_iso' => array('label' => $langs->trans("Country"), 'checked' => 0),
132 'typent.code' => array('label' => $langs->trans("ThirdPartyType"), 'checked' => $checkedtypetiers),
133 'e.date_delivery' => array('label' => $langs->trans("DateDeliveryPlanned"), 'checked' => 1),
134 'e.datec' => array('label' => $langs->trans("DateCreation"), 'checked' => 0, 'position' => 500),
135 'e.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => 0, 'position' => 500),
136 'e.fk_statut' => array('label' => $langs->trans("Status"), 'checked' => 1, 'position' => 1000),
137 'e.billed' => array('label' => $langs->trans("Billed"), 'checked' => 1, 'position' => 1000, 'enabled' => 'getDolGlobalString("WORKFLOW_BILL_ON_RECEPTION") !== "0"')
138);
139
140// Extra fields
141include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
142
143$object->fields = dol_sort_array($object->fields, 'position');
144$arrayfields = dol_sort_array($arrayfields, 'position');
145'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
146
147$error = 0;
148
149// Security check
150$receptionid = GETPOSTINT('id');
151if ($user->socid) {
152 $socid = $user->socid;
153}
154$result = restrictedArea($user, 'reception', $receptionid, '');
155
156
157/*
158 * Actions
159 */
160
161if (GETPOST('cancel', 'alpha')) {
162 $action = 'list';
163 $massaction = '';
164}
165if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_createbills') {
166 $massaction = '';
167}
168
169$parameters = array('socid' => $socid, 'arrayfields' => &$arrayfields);
170$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
171if ($reshook < 0) {
172 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
173}
174
175include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
176
177// Purge search criteria
178if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
179 $search_ref_supplier = '';
180 $search_ref_rcp = '';
181 $search_ref_liv = '';
182 $search_company = '';
183 $search_town = '';
184 $search_zip = "";
185 $search_state = "";
186 $search_country = '';
187 $search_type_thirdparty = '';
188 $search_date_delivery_startday = '';
189 $search_date_delivery_startmonth = '';
190 $search_date_delivery_startyear = '';
191 $search_date_delivery_endday = '';
192 $search_date_delivery_endmonth = '';
193 $search_date_delivery_endyear = '';
194 $search_date_delivery_start = '';
195 $search_date_delivery_end = '';
196 $search_date_create_startday = '';
197 $search_date_create_startmonth = '';
198 $search_date_create_startyear = '';
199 $search_date_create_endday = '';
200 $search_date_create_endmonth = '';
201 $search_date_create_endyear = '';
202 $search_date_create_start = '';
203 $search_date_create_end = '';
204 $search_billed = '';
205 $search_status = '';
206 $toselect = array();
207 $search_array_options = array();
208}
209
210if (empty($reshook)) {
211 // Mass actions
212 $objectclass = 'Reception';
213 $objectlabel = 'Receptions';
214 $permissiontoread = $user->hasRight('reception', 'lire');
215 $permissiontoadd = $user->hasRight('reception', 'creer');
216 $permissiontodelete = $user->hasRight('reception', 'supprimer');
217 $uploaddir = $conf->reception->multidir_output[$conf->entity];
218 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
219
220 if ($massaction == 'confirm_createbills' && ($user->hasRight("fournisseur", "facture", "creer") || $user->hasRight("supplier_invoice", "creer"))) {
221 $receptions = GETPOST('toselect', 'array');
222 $createbills_onebythird = GETPOSTINT('createbills_onebythird');
223 $validate_invoices = GETPOSTINT('validate_invoices');
224
225 $errors = array();
226
227 $TFact = array();
228 $TFactThird = array();
229 $TFactThirdNbLines = array();
230
231 $nb_bills_created = 0;
232 $lastid = 0;
233 $lastref = '';
234
235 $db->begin();
236
237 //sort ids to keep order if one bill per third
238 sort($receptions);
239 foreach ($receptions as $id_reception) {
240 $rcp = new Reception($db);
241 // We not allow invoice reception that are in draft status
242 if ($rcp->fetch($id_reception) <= 0 || $rcp->statut == $rcp::STATUS_DRAFT) {
243 $errors[] = $langs->trans('StatusOfRefMustBe', $rcp->ref, $langs->transnoentities("StatusReceptionValidatedShort"));
244 $error++;
245 continue;
246 }
247
248 $objecttmp = new FactureFournisseur($db);
249 if (!empty($createbills_onebythird) && !empty($TFactThird[$rcp->socid])) {
250 // If option "one bill per third" is set, and an invoice for this thirdparty was already created, we reuse it.
251 $objecttmp = $TFactThird[$rcp->socid];
252
253 // Add all links of this new reception to the existing invoice
254 $objecttmp->fetchObjectLinked();
255 $rcp->fetchObjectLinked();
256 if (!empty($rcp->linkedObjectsIds['order_supplier']) && is_array($rcp->linkedObjectsIds['order_supplier'])) {
257 foreach ($rcp->linkedObjectsIds['order_supplier'] as $key => $value) {
258 if (empty($objecttmp->linkedObjectsIds['order_supplier']) || !in_array($value, $objecttmp->linkedObjectsIds['order_supplier'])) { //Don't try to link if already linked
259 $objecttmp->add_object_linked('order_supplier', $value); // add supplier order linked object
260 }
261 }
262 }
263 } else {
264 $cond_reglement_id = 0;
265 $mode_reglement_id = 0;
266 $fk_account = 0;
267 $transport_mode_id = 0;
268 if (!empty($rcp->cond_reglement_id)) {
269 $cond_reglement_id = $rcp->cond_reglement_id;
270 }
271 if (!empty($rcp->mode_reglement_id)) {
272 $mode_reglement_id = $rcp->mode_reglement_id;
273 }
274 if (!empty($rcp->fk_account)) {
275 $fk_account = $rcp->fk_account;
276 }
277 if (!empty($rcp->transport_mode_id)) {
278 $transport_mode_id = $rcp->transport_mode_id;
279 }
280
281 if (empty($cond_reglement_id)
282 || empty($mode_reglement_id)
283 || empty($fk_account)
284 || empty($transport_mode_id)
285 ) {
286 if (!isset($rcp->supplier_order)) {
287 $rcp->fetch_origin();
288 }
289
290 // try to get from source of reception (supplier order)
291 if (!empty($rcp->origin_object)) {
292 $supplierOrder = $rcp->origin_object;
293 if (empty($cond_reglement_id) && !empty($supplierOrder->cond_reglement_id)) {
294 $cond_reglement_id = $supplierOrder->cond_reglement_id;
295 }
296 if (empty($mode_reglement_id) && !empty($supplierOrder->mode_reglement_id)) {
297 $mode_reglement_id = $supplierOrder->mode_reglement_id;
298 }
299 if (empty($fk_account) && !empty($supplierOrder->fk_account)) {
300 $fk_account = $supplierOrder->fk_account;
301 }
302 if (empty($transport_mode_id) && !empty($supplierOrder->transport_mode_id)) {
303 $transport_mode_id = $supplierOrder->transport_mode_id;
304 }
305 }
306
307 // try get from third-party of reception
308 if (!empty($rcp->thirdparty)) {
309 $soc = $rcp->thirdparty;
310 if (empty($cond_reglement_id) && !empty($soc->cond_reglement_supplier_id)) {
311 $cond_reglement_id = $soc->cond_reglement_supplier_id;
312 }
313 if (empty($mode_reglement_id) && !empty($soc->mode_reglement_supplier_id)) {
314 $mode_reglement_id = $soc->mode_reglement_supplier_id;
315 }
316 if (empty($fk_account) && !empty($soc->fk_account)) {
317 $fk_account = $soc->fk_account;
318 }
319 if (empty($transport_mode_id) && !empty($soc->transport_mode_id)) {
320 $transport_mode_id = $soc->transport_mode_id;
321 }
322 }
323 }
324
325 // If we want one invoice per reception or if there is no first invoice yet for this thirdparty.
326 $objecttmp->socid = $rcp->socid;
327 $objecttmp->type = $objecttmp::TYPE_STANDARD;
328 $objecttmp->cond_reglement_id = $cond_reglement_id;
329 $objecttmp->mode_reglement_id = $mode_reglement_id;
330 $objecttmp->fk_account = $fk_account;
331 $objecttmp->transport_mode_id = $transport_mode_id;
332
333 // if the VAT reverse-charge is activated by default in supplier card to resume the information
334 $objecttmp->vat_reverse_charge = $soc->vat_reverse_charge;
335
336 $objecttmp->fk_project = $rcp->fk_project;
337 //$objecttmp->multicurrency_code = $rcp->multicurrency_code;
338 if (empty($createbills_onebythird)) {
339 $objecttmp->ref_supplier = $rcp->ref;
340 } else {
341 // Set a unique value for the invoice for the n reception
342 $objecttmp->ref_supplier = $langs->trans("Reception").' '.dol_print_date(dol_now(), 'dayhourlog').'-'.$rcp->socid;
343 }
344
345 $datefacture = dol_mktime(12, 0, 0, GETPOSTINT('remonth'), GETPOSTINT('reday'), GETPOSTINT('reyear'));
346 if (empty($datefacture)) {
347 $datefacture = dol_now();
348 }
349
350 $objecttmp->date = $datefacture;
351 $objecttmp->origin = 'reception';
352 $objecttmp->origin_id = $id_reception;
353
354 // Auto calculation of date due if not filled by user
355 if (empty($objecttmp->date_echeance)) {
356 $objecttmp->date_echeance = $objecttmp->calculate_date_lim_reglement();
357 }
358
359 $objecttmp->array_options = $rcp->array_options; // Copy extrafields
360
361 // Set $objecttmp->linked_objects with all links order_supplier existing on reception, so same links will be added to the generated supplier invoice
362 $rcp->fetchObjectLinked();
363 if (count($rcp->linkedObjectsIds['order_supplier']) > 0) {
364 foreach ($rcp->linkedObjectsIds['order_supplier'] as $key => $value) {
365 $objecttmp->linked_objects['order_supplier'] = $value;
366 }
367 }
368
369 $res = $objecttmp->create($user); // This should create the supplier invoice + links into $objecttmp->linked_objects + add a link to ->origin_id
370
371 //var_dump($objecttmp->error);exit;
372 if ($res > 0) {
373 $nb_bills_created++;
374 $lastref = $objecttmp->ref;
375 $lastid = $objecttmp->id;
376
377 $TFactThird[$rcp->socid] = $objecttmp;
378 $TFactThirdNbLines[$rcp->socid] = 0; //init nblines to have lines ordered by expedition and rang
379 } else {
380 $langs->load("errors");
381 $errors[] = $rcp->ref.' : '.$langs->trans($objecttmp->error);
382 $error++;
383 }
384 }
385
386 if ($objecttmp->id > 0) {
387 $res = $objecttmp->add_object_linked($objecttmp->origin, $id_reception);
388
389 if ($res == 0) {
390 $errors[] = $objecttmp->error;
391 $error++;
392 }
393
394 if (!$error) {
395 $lines = $rcp->lines;
396 if (empty($lines) && method_exists($rcp, 'fetch_lines')) {
397 $rcp->fetch_lines();
398 $lines = $rcp->lines;
399 }
400
401 $fk_parent_line = 0;
402 $num = count($lines);
403
404 for ($i = 0; $i < $num; $i++) {
405 $desc = ($lines[$i]->desc ? $lines[$i]->desc : $lines[$i]->libelle);
406 // If we build one invoice for several reception, we must put the ref of reception on the invoice line
407 if (!empty($createbills_onebythird)) {
408 $desc = dol_concatdesc($desc, $langs->trans("Reception").' '.$rcp->ref);
409 $desc .= (!empty($rcp->date_reception) ? ' - '.dol_print_date($rcp->date_reception, 'day') : '');
410 }
411
412 if ($lines[$i]->subprice < 0) {
413 // Negative line, we create a discount line
414 $discount = new DiscountAbsolute($db);
415 $discount->fk_soc = $objecttmp->socid;
416 $discount->socid = $objecttmp->socid;
417 $discount->amount_ht = abs($lines[$i]->total_ht);
418 $discount->amount_tva = abs($lines[$i]->total_tva);
419 $discount->amount_ttc = abs($lines[$i]->total_ttc);
420 $discount->tva_tx = $lines[$i]->tva_tx;
421 $discount->fk_user = $user->id;
422 $discount->description = $desc;
423 $discountid = $discount->create($user);
424 if ($discountid > 0) {
425 $result = $objecttmp->insert_discount($discountid);
426 //$result=$discount->link_to_invoice($lineid,$id);
427 } else {
428 setEventMessages($discount->error, $discount->errors, 'errors');
429 $error++;
430 break;
431 }
432 } else {
433 // Positive line
434 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
435 // Date start
436 $date_start = false;
437 if ($lines[$i]->date_debut_prevue) {
438 $date_start = $lines[$i]->date_debut_prevue;
439 }
440 if ($lines[$i]->date_debut_reel) {
441 $date_start = $lines[$i]->date_debut_reel;
442 }
443 if ($lines[$i]->date_start) {
444 $date_start = $lines[$i]->date_start;
445 }
446 //Date end
447 $date_end = false;
448 if ($lines[$i]->date_fin_prevue) {
449 $date_end = $lines[$i]->date_fin_prevue;
450 }
451 if ($lines[$i]->date_fin_reel) {
452 $date_end = $lines[$i]->date_fin_reel;
453 }
454 if ($lines[$i]->date_end) {
455 $date_end = $lines[$i]->date_end;
456 }
457 // Reset fk_parent_line for no child products and special product
458 if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
459 $fk_parent_line = 0;
460 }
461
462 // Extrafields
463 if (method_exists($lines[$i], 'fetch_optionals')) {
464 $lines[$i]->fetch_optionals();
465 $array_options = $lines[$i]->array_options;
466 }
467
468 $objecttmp->context['createfromclone'] = 'createfromclone';
469
470 $rang = $i;
471 //there may already be rows from previous receptions
472 if (!empty($createbills_onebythird)) {
473 $rang = $TFactThirdNbLines[$rcp->socid];
474 }
475
476 $result = $objecttmp->addline(
477 $desc,
478 $lines[$i]->subprice,
479 $lines[$i]->tva_tx,
480 $lines[$i]->localtax1_tx,
481 $lines[$i]->localtax2_tx,
482 $lines[$i]->qty,
483 $lines[$i]->fk_product,
484 $lines[$i]->remise_percent,
485 $date_start,
486 $date_end,
487 0,
488 $lines[$i]->info_bits,
489 'HT',
490 $product_type,
491 $rang,
492 false,
493 array(),
494 null,
495 $lines[$i]->rowid,
496 0,
497 $lines[$i]->ref_supplier
498 );
499
500 $rcp->add_object_linked('facture_fourn_det', $result);
501
502 if ($result > 0) {
503 $lineid = $result;
504 if (!empty($createbills_onebythird)) { //increment rang to keep order
505 $TFactThirdNbLines[$rcp->socid]++;
506 }
507 } else {
508 $lineid = 0;
509 $error++;
510 break;
511 }
512 // Defined the new fk_parent_line
513 if ($result > 0 && $lines[$i]->product_type == 9) {
514 $fk_parent_line = $result;
515 }
516 }
517 }
518 }
519 }
520
521 //$rcp->classifyBilled($user); // Disabled. This behavior must be set or not using the workflow module.
522
523 if (!empty($createbills_onebythird) && empty($TFactThird[$rcp->socid])) {
524 $TFactThird[$rcp->socid] = $objecttmp;
525 } else {
526 $TFact[$objecttmp->id] = $objecttmp;
527 }
528 }
529
530 // Build doc with all invoices
531 $TAllFact = empty($createbills_onebythird) ? $TFact : $TFactThird;
532 $toselect = array();
533
534 if (!$error && $validate_invoices) {
535 $massaction = $action = 'builddoc';
536 foreach ($TAllFact as &$objecttmp) {
537 $result = $objecttmp->validate($user);
538 if ($result <= 0) {
539 $error++;
540 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
541 break;
542 }
543
544 $id = $objecttmp->id; // For builddoc action
545 $lastref = $objecttmp->ref; // generated ref
546 $object = $objecttmp;
547
548 // Fac builddoc
549 $donotredirect = 1;
550 $upload_dir = $conf->fournisseur->facture->dir_output;
551 $permissiontoadd = ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer'));
552
553 // Call action to build doc
554 $savobject = $object;
555 $object = $objecttmp;
556 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
557 $object = $savobject;
558 }
559
560 $massaction = $action = 'confirm_createbills';
561 }
562
563 if (!$error) {
564 $db->commit();
565
566 if ($nb_bills_created == 1) {
567 $texttoshow = $langs->trans('BillXCreated', '{s1}');
568 $texttoshow = str_replace('{s1}', '<a href="'.DOL_URL_ROOT.'/fourn/facture/card.php?id='.urlencode((string) ($lastid)).'">'.$lastref.'</a>', $texttoshow);
569 setEventMessages($texttoshow, null, 'mesgs');
570 } else {
571 setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs');
572 }
573 } else {
574 $db->rollback();
575
576 $action = 'create';
577 $_GET["origin"] = $_POST["origin"]; // Keep this ?
578 $_GET["originid"] = $_POST["originid"]; // Keep this ?
579 setEventMessages($object->error, $errors, 'errors');
580 $error++;
581 }
582 }
583}
584
585
586/*
587 * View
588 */
589
590$now = dol_now();
591
592$form = new Form($db);
593$companystatic = new Societe($db);
594$reception = new Reception($db);
595$formcompany = new FormCompany($db);
596$formfile = new FormFile($db);
597
598
599$helpurl = 'EN:Module_Receptions|FR:Module_Receptions|ES:M&oacute;dulo_Receptiones';
600llxHeader('', $langs->trans('ListOfReceptions'), $helpurl, '', 0, 0, '', '', '', 'bodyforlist mod-reception page-list');
601
602$sql = "SELECT e.rowid, e.ref, e.ref_supplier, e.date_reception as date_reception, e.date_delivery as delivery_date, l.date_delivery as date_reception2, e.fk_statut as status, e.billed,";
603$sql .= " s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client,";
604$sql .= " typent.code as typent_code,";
605$sql .= " state.code_departement as state_code, state.nom as state_name,";
606$sql .= " e.date_creation as date_creation, e.tms as date_modification";
607// Add fields from extrafields
608if (!empty($extrafields->attributes[$object->table_element]['label'])) {
609 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
610 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
611 }
612}
613// Add fields from hooks
614$parameters = array();
615$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
616$sql .= $hookmanager->resPrint;
617
618$sqlfields = $sql; // $sql fields to remove for count total
619
620$sql .= " FROM ".MAIN_DB_PREFIX."reception as e";
621if (!empty($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
622 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (e.rowid = ef.fk_object)";
623}
624$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = e.fk_soc";
625$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
626$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
627$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
628$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as ee ON e.rowid = ee.fk_source AND ee.sourcetype = 'reception' AND ee.targettype = 'delivery'";
629$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."delivery as l ON l.rowid = ee.fk_target";
630// Add table from hooks
631$parameters = array();
632$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
633$sql .= $hookmanager->resPrint;
634$sql .= " WHERE e.entity IN (".getEntity('reception').")";
635if ($socid) {
636 $sql .= " AND e.fk_soc = ".((int) $socid);
637}
638if ($search_status != '' && $search_status >= 0) {
639 $sql .= " AND e.fk_statut = ".((int) $search_status);
640}
641if ($search_billed != '' && $search_billed >= 0) {
642 $sql .= ' AND e.billed = '.((int) $search_billed);
643}
644if ($search_town) {
645 $sql .= natural_search('s.town', $search_town);
646}
647if ($search_zip) {
648 $sql .= natural_search("s.zip", $search_zip);
649}
650if ($search_state) {
651 $sql .= natural_search("state.nom", $search_state);
652}
653if ($search_country) {
654 $sql .= " AND s.fk_pays IN (".$db->sanitize($search_country).')';
655}
656if ($search_type_thirdparty != '' && $search_type_thirdparty > 0) {
657 $sql .= " AND s.fk_typent IN (".$db->sanitize($search_type_thirdparty).')';
658}
659if ($search_date_delivery_start) {
660 $sql .= " AND e.date_delivery >= '".$db->idate($search_date_delivery_start)."'";
661}
662if ($search_date_delivery_end) {
663 $sql .= " AND e.date_delivery <= '".$db->idate($search_date_delivery_end)."'";
664}
665if ($search_date_create_start) {
666 $sql .= " AND e.date_creation >= '".$db->idate($search_date_create_start)."'";
667}
668if ($search_date_create_end) {
669 $sql .= " AND e.date_creation <= '".$db->idate($search_date_create_end)."'";
670}
671if ($search_ref_rcp) {
672 $sql .= natural_search('e.ref', $search_ref_rcp);
673}
674if ($search_ref_liv) {
675 $sql .= natural_search('l.ref', $search_ref_liv);
676}
677if ($search_company) {
678 $sql .= natural_search('s.nom', $search_company);
679}
680if ($search_ref_supplier) {
681 $sql .= natural_search('e.ref_supplier', $search_ref_supplier);
682}
683if ($search_all) {
684 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
685}
686// Search on sale representative
687/*
688if ($search_sale && $search_sale != '-1') {
689 if ($search_sale == -2) {
690 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc)";
691 } elseif ($search_sale > 0) {
692 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = c.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
693 }
694}
695*/
696// Add where from extra fields
697include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
698// Add where from hooks
699$parameters = array();
700$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook
701$sql .= $hookmanager->resPrint;
702
703// Add HAVING from hooks
704$parameters = array();
705$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object); // Note that $action and $object may have been modified by hook
706$sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
707
708$nbtotalofrecords = '';
709if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
710 /* The fast and low memory method to get and count full list converts the sql into a sql count */
711 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
712 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
713 $resql = $db->query($sqlforcount);
714 if ($resql) {
715 $objforcount = $db->fetch_object($resql);
716 $nbtotalofrecords = $objforcount->nbtotalofrecords;
717 } else {
718 dol_print_error($db);
719 }
720
721 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
722 $page = 0;
723 $offset = 0;
724 }
725 $db->free($resql);
726}
727
728// Complete request and execute it with limit
729$sql .= $db->order($sortfield, $sortorder);
730if ($limit) {
731 $sql .= $db->plimit($limit + 1, $offset);
732}
733
734//print $sql;
735$resql = $db->query($sql);
736if (!$resql) {
737 dol_print_error($db);
738 exit;
739}
740
741$num = $db->num_rows($resql);
742
743$reception = new Reception($db);
744
745$arrayofselected = is_array($toselect) ? $toselect : array();
746
747$param = '';
748if (!empty($mode)) {
749 $param .= '&mode='.urlencode($mode);
750}
751if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
752 $param .= '&contextpage='.urlencode($contextpage);
753}
754if ($limit > 0 && $limit != $conf->liste_limit) {
755 $param .= '&limit='.((int) $limit);
756}
757if ($search_all) {
758 $param .= "&search_all=".urlencode($search_all);
759}
760if ($search_ref_rcp) {
761 $param .= "&search_ref_rcp=".urlencode($search_ref_rcp);
762}
763if ($search_ref_liv) {
764 $param .= "&search_ref_liv=".urlencode($search_ref_liv);
765}
766if ($search_company) {
767 $param .= "&search_company=".urlencode($search_company);
768}
769if ($optioncss != '') {
770 $param .= '&optioncss='.urlencode($optioncss);
771}
772if ($search_billed != '' && $search_billed >= 0) {
773 $param .= "&search_billed=".urlencode((string) ($search_billed));
774}
775if ($search_town) {
776 $param .= "&search_town=".urlencode($search_town);
777}
778if ($search_zip) {
779 $param .= "&search_zip=".urlencode($search_zip);
780}
781if ($search_state) {
782 $param .= "&search_state=".urlencode($search_state);
783}
784if ($search_status != '') {
785 $param .= "&search_status=".urlencode($search_status);
786}
787if ($search_country) {
788 $param .= "&search_country=".urlencode((string) ($search_country));
789}
790if ($search_type_thirdparty) {
791 $param .= "&search_type_thirdparty=".urlencode((string) ($search_type_thirdparty));
792}
793if ($search_date_delivery_startday) {
794 $param .= '&search_date_delivery_startday='.urlencode((string) ($search_date_delivery_startday));
795}
796if ($search_date_delivery_startmonth) {
797 $param .= '&search_date_delivery_startmonth='.urlencode((string) ($search_date_delivery_startmonth));
798}
799if ($search_date_delivery_startyear) {
800 $param .= '&search_date_delivery_startyear='.urlencode((string) ($search_date_delivery_startyear));
801}
802if ($search_date_delivery_endday) {
803 $param .= '&search_date_delivery_endday='.urlencode((string) ($search_date_delivery_endday));
804}
805if ($search_date_delivery_endmonth) {
806 $param .= '&search_date_delivery_endmonth='.urlencode((string) ($search_date_delivery_endmonth));
807}
808if ($search_date_delivery_endyear) {
809 $param .= '&search_date_delivery_endyear='.urlencode((string) ($search_date_delivery_endyear));
810}
811if ($search_date_create_startday) {
812 $param .= '&search_date_create_startday='.urlencode((string) ($search_date_create_startday));
813}
814if ($search_date_create_startmonth) {
815 $param .= '&search_date_create_startmonth='.urlencode((string) ($search_date_create_startmonth));
816}
817if ($search_date_create_startyear) {
818 $param .= '&search_date_create_startyear='.urlencode((string) ($search_date_create_startyear));
819}
820if ($search_date_create_endday) {
821 $param .= '&search_date_create_endday='.urlencode((string) ($search_date_create_endday));
822}
823if ($search_date_create_endmonth) {
824 $param .= '&search_date_create_endmonth='.urlencode((string) ($search_date_create_endmonth));
825}
826if ($search_date_create_endyear) {
827 $param .= '&search_date_create_endyear='.urlencode((string) ($search_date_create_endyear));
828}
829if ($search_ref_supplier) {
830 $param .= "&search_ref_supplier=".urlencode($search_ref_supplier);
831}
832// Add $param from extra fields
833if ($search_array_options) {
834 foreach ($search_array_options as $key => $val) {
835 $crit = $val;
836 $tmpkey = preg_replace('/search_options_/', '', $key);
837 if (is_array($val) && array_key_exists('start', $val) && array_key_exists('end', $val)) {
838 // date range from list filters is stored as array('start' => <timestamp>, 'end' => <timestamp>)
839 // start date
840 $param .= '&search_options_'.$tmpkey.'_startyear='.dol_print_date($val['start'], '%Y');
841 $param .= '&search_options_'.$tmpkey.'_startmonth='.dol_print_date($val['start'], '%m');
842 $param .= '&search_options_'.$tmpkey.'_startday='.dol_print_date($val['start'], '%d');
843 $param .= '&search_options_'.$tmpkey.'_starthour='.dol_print_date($val['start'], '%H');
844 $param .= '&search_options_'.$tmpkey.'_startmin='.dol_print_date($val['start'], '%M');
845 // end date
846 $param .= '&search_options_'.$tmpkey.'_endyear='.dol_print_date($val['end'], '%Y');
847 $param .= '&search_options_'.$tmpkey.'_endmonth='.dol_print_date($val['end'], '%m');
848 $param .= '&search_options_'.$tmpkey.'_endday='.dol_print_date($val['end'], '%d');
849 $param .= '&search_options_'.$tmpkey.'_endhour='.dol_print_date($val['end'], '%H');
850 $param .= '&search_options_'.$tmpkey.'_endmin='.dol_print_date($val['end'], '%M');
851 $val = '';
852 }
853 if ($val != '') {
854 $param .= '&search_options_'.$tmpkey.'='.urlencode($val);
855 }
856 }
857}
858
859
860$arrayofmassactions = array(
861 'builddoc' => img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
862 // 'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
863);
864
865if ($user->hasRight('fournisseur', 'facture', 'creer') || $user->hasRight('supplier_invoice', 'creer')) {
866 $arrayofmassactions['createbills'] = $langs->trans("CreateInvoiceForThisReceptions");
867}
868if (in_array($massaction, array('presend', 'createbills'))) {
869 $arrayofmassactions = array();
870}
871$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
872
873// Currently: a sending can't create from sending list
874// $url = DOL_URL_ROOT.'/expedition/card.php?action=create';
875// if (!empty($socid)) $url .= '&socid='.$socid;
876// $newcardbutton = dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', $url, '', $user->rights->expedition->creer);
877$newcardbutton = '';
878$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'));
879$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'));
880$newcardbutton .= dolGetButtonTitleSeparator();
881$newcardbutton .= dolGetButtonTitle($langs->trans('NewReception'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/reception/card.php?action=create2', '', $user->hasRight('reception', 'creer'));
882
883$i = 0;
884print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">'."\n";
885if ($optioncss != '') {
886 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
887}
888print '<input type="hidden" name="token" value="'.newToken().'">';
889print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
890print '<input type="hidden" name="action" value="list">';
891print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
892print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
893print '<input type="hidden" name="mode" value="'.$mode.'">';
894
895// @phan-suppress-next-line PhanPluginSuspiciousParamOrder
896print_barre_liste($langs->trans('ListOfReceptions'), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'dollyrevert', 0, $newcardbutton, '', $limit, 0, 0, 1);
897
898if ($massaction == 'createbills') {
899 //var_dump($_REQUEST);
900 print '<input type="hidden" name="massaction" value="confirm_createbills">';
901
902 print '<table class="noborder" width="100%" >';
903 print '<tr>';
904 print '<td class="titlefieldmiddle">';
905 print $langs->trans('DateInvoice');
906 print '</td>';
907 print '<td>';
908 print $form->selectDate('', '', 0, 0, 0, '', 1, 1);
909 print '</td>';
910 print '</tr>';
911 print '<tr>';
912 print '<td>';
913 print $langs->trans('CreateOneBillByThird');
914 print '</td>';
915 print '<td>';
916 print $form->selectyesno('createbills_onebythird', '', 1);
917 print '</td>';
918 print '</tr>';
919 print '<tr>';
920 print '<td>';
921 print $langs->trans('ValidateInvoices');
922 print '</td>';
923 print '<td>';
924 if (isModEnabled('stock') && getDolGlobalString('STOCK_CALCULATE_ON_BILL')) {
925 print $form->selectyesno('validate_invoices', 0, 1, 1);
926 print ' ('.$langs->trans("AutoValidationNotPossibleWhenStockIsDecreasedOnInvoiceValidation").')';
927 } else {
928 print $form->selectyesno('validate_invoices', 0, 1);
929 }
930 print '</td>';
931 print '</tr>';
932 print '</table>';
933
934 print '<br>';
935 print '<div class="center">';
936 print '<input type="submit" class="button" id="createbills" name="createbills" value="'.$langs->trans('CreateInvoiceForThisReceptions').'"> ';
937 print '<input type="submit" class="button button-cancel" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
938 print '</div>';
939 print '<br>';
940}
941
942if ($search_all) {
943 foreach ($fieldstosearchall as $key => $val) {
944 $fieldstosearchall[$key] = $langs->trans($val);
945 }
946 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>';
947}
948
949$moreforfilter = '';
950
951if (!empty($moreforfilter)) {
952 print '<div class="liste_titre liste_titre_bydiv centpercent">';
953 print $moreforfilter;
954 $parameters = array('type' => $type);
955 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
956 print $hookmanager->resPrint;
957 print '</div>';
958}
959
960$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
961$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN'));
962if ($massactionbutton) {
963 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1); // This also change content of $arrayfields
964}
965
966print '<div class="div-table-responsive">';
967print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
968
969// Fields title search
970// --------------------------------------------------------------------
971print '<tr class="liste_titre_filter">';
972// Action column
973if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
974 print '<td class="liste_titre center maxwidthsearch">';
975 $searchpicto = $form->showFilterButtons('left');
976 print $searchpicto;
977 print '</td>';
978}
979// Ref
980if (!empty($arrayfields['e.ref']['checked'])) {
981 print '<td class="liste_titre">';
982 print '<input class="flat" size="6" type="text" name="search_ref_rcp" value="'.$search_ref_rcp.'">';
983 print '</td>';
984}
985// Ref customer
986if (!empty($arrayfields['e.ref_supplier']['checked'])) {
987 print '<td class="liste_titre">';
988 print '<input class="flat" size="6" type="text" name="search_ref_supplier" value="'.$search_ref_supplier.'">';
989 print '</td>';
990}
991// Thirdparty
992if (!empty($arrayfields['s.nom']['checked'])) {
993 print '<td class="liste_titre left">';
994 print '<input class="flat" type="text" size="8" name="search_company" value="'.dol_escape_htmltag($search_company).'">';
995 print '</td>';
996}
997// Town
998if (!empty($arrayfields['s.town']['checked'])) {
999 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_town" value="'.$search_town.'"></td>';
1000}
1001// Zip
1002if (!empty($arrayfields['s.zip']['checked'])) {
1003 print '<td class="liste_titre"><input class="flat" type="text" size="6" name="search_zip" value="'.$search_zip.'"></td>';
1004}
1005// State
1006if (!empty($arrayfields['state.nom']['checked'])) {
1007 print '<td class="liste_titre">';
1008 print '<input class="flat" size="4" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
1009 print '</td>';
1010}
1011// Country
1012if (!empty($arrayfields['country.code_iso']['checked'])) {
1013 print '<td class="liste_titre center">';
1014 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
1015 print '</td>';
1016}
1017// Company type
1018if (!empty($arrayfields['typent.code']['checked'])) {
1019 print '<td class="liste_titre maxwidthonsmartphone center">';
1020 print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 1, 0, 0, '', 0, 0, 0, (!getDolGlobalString('SOCIETE_SORT_ON_TYPEENT') ? 'ASC' : $conf->global->SOCIETE_SORT_ON_TYPEENT), '', 1);
1021 print '</td>';
1022}
1023// Date delivery planned
1024if (!empty($arrayfields['e.date_delivery']['checked'])) {
1025 print '<td class="liste_titre center">';
1026 print '<div class="nowrapfordate">';
1027 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'));
1028 print '</div>';
1029 print '<div class="nowrapfordate">';
1030 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'));
1031 print '</div>';
1032 print '</td>';
1033}
1034if (!empty($arrayfields['l.ref']['checked'])) {
1035 // Delivery ref
1036 print '<td class="liste_titre">';
1037 print '<input class="flat" type="text" name="search_ref_liv" value="'.dol_escape_htmltag($search_ref_liv).'"';
1038 print '</td>';
1039}
1040if (!empty($arrayfields['l.date_delivery']['checked'])) {
1041 // Date received
1042 print '<td class="liste_titre center">&nbsp;</td>';
1043}
1044// Extra fields
1045include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1046
1047// Fields from hook
1048$parameters = array('arrayfields' => $arrayfields);
1049$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1050print $hookmanager->resPrint;
1051// Date creation
1052if (!empty($arrayfields['e.datec']['checked'])) {
1053 print '<td class="liste_titre center">';
1054 print '<div class="nowrapfordate">';
1055 print $form->selectDate($search_date_create_start ? $search_date_create_start : -1, 'search_date_create_start', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1056 print '</div>';
1057 print '<div class="nowrapfordate">';
1058 print $form->selectDate($search_date_create_end ? $search_date_create_end : -1, 'search_date_create_end', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1059 print '</div>';
1060 print '</td>';
1061}
1062// Date modification
1063if (!empty($arrayfields['e.tms']['checked'])) {
1064 print '<td class="liste_titre">';
1065 print '</td>';
1066}
1067// Status
1068if (!empty($arrayfields['e.fk_statut']['checked'])) {
1069 print '<td class="liste_titre right parentonrightofpage">';
1070 print $form->selectarray('search_status', array('0' => $langs->trans('StatusReceptionDraftShort'), '1' => $langs->trans('StatusReceptionValidatedShort'), '2' => $langs->trans('StatusReceptionProcessedShort')), $search_status, 1, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
1071 print '</td>';
1072}
1073// Status billed
1074if (!empty($arrayfields['e.billed']['checked'])) {
1075 print '<td class="liste_titre maxwidthonsmartphone center">';
1076 print $form->selectyesno('search_billed', $search_billed, 1, 0, 1);
1077 print '</td>';
1078}
1079// Action column
1080if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1081 print '<td class="liste_titre middle">';
1082 $searchpicto = $form->showFilterButtons();
1083 print $searchpicto;
1084 print '</td>';
1085}
1086print '</tr>'."\n";
1087
1088$totalarray = array();
1089$totalarray['nbfield'] = 0;
1090
1091// Fields title label
1092// --------------------------------------------------------------------
1093print '<tr class="liste_titre">';
1094// Action column
1095if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1096 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1097 $totalarray['nbfield']++;
1098}
1099if (!empty($arrayfields['e.ref']['checked'])) {
1100 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1101 print_liste_field_titre($arrayfields['e.ref']['label'], $_SERVER["PHP_SELF"], "e.ref", "", $param, '', $sortfield, $sortorder);
1102 $totalarray['nbfield']++;
1103}
1104if (!empty($arrayfields['e.ref_supplier']['checked'])) {
1105 print_liste_field_titre($arrayfields['e.ref_supplier']['label'], $_SERVER["PHP_SELF"], "e.ref_supplier", "", $param, '', $sortfield, $sortorder);
1106 $totalarray['nbfield']++;
1107}
1108if (!empty($arrayfields['s.nom']['checked'])) {
1109 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", "", $param, '', $sortfield, $sortorder, 'left ');
1110 $totalarray['nbfield']++;
1111}
1112if (!empty($arrayfields['s.town']['checked'])) {
1113 print_liste_field_titre($arrayfields['s.town']['label'], $_SERVER["PHP_SELF"], 's.town', '', $param, '', $sortfield, $sortorder);
1114 $totalarray['nbfield']++;
1115}
1116if (!empty($arrayfields['s.zip']['checked'])) {
1117 print_liste_field_titre($arrayfields['s.zip']['label'], $_SERVER["PHP_SELF"], 's.zip', '', $param, '', $sortfield, $sortorder);
1118 $totalarray['nbfield']++;
1119}
1120if (!empty($arrayfields['state.nom']['checked'])) {
1121 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1122 $totalarray['nbfield']++;
1123}
1124if (!empty($arrayfields['country.code_iso']['checked'])) {
1125 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1126 $totalarray['nbfield']++;
1127}
1128if (!empty($arrayfields['typent.code']['checked'])) {
1129 print_liste_field_titre($arrayfields['typent.code']['label'], $_SERVER["PHP_SELF"], "typent.code", "", $param, '', $sortfield, $sortorder, 'center ');
1130 $totalarray['nbfield']++;
1131}
1132if (!empty($arrayfields['e.date_delivery']['checked'])) {
1133 print_liste_field_titre($arrayfields['e.date_delivery']['label'], $_SERVER["PHP_SELF"], "e.date_delivery", "", $param, '', $sortfield, $sortorder, 'center ');
1134 $totalarray['nbfield']++;
1135}
1136if (!empty($arrayfields['l.ref']['checked'])) {
1137 print_liste_field_titre($arrayfields['l.ref']['label'], $_SERVER["PHP_SELF"], "l.ref", "", $param, '', $sortfield, $sortorder);
1138 $totalarray['nbfield']++;
1139}
1140if (!empty($arrayfields['l.date_delivery']['checked'])) {
1141 print_liste_field_titre($arrayfields['l.date_delivery']['label'], $_SERVER["PHP_SELF"], "l.date_delivery", "", $param, '', $sortfield, $sortorder, 'center ');
1142 $totalarray['nbfield']++;
1143}
1144// Extra fields
1145include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1146// Hook fields
1147$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, '$totalarray' => &$totalarray);
1148$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
1149print $hookmanager->resPrint;
1150if (!empty($arrayfields['e.datec']['checked'])) {
1151 print_liste_field_titre($arrayfields['e.datec']['label'], $_SERVER["PHP_SELF"], "e.date_creation", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1152 $totalarray['nbfield']++;
1153}
1154if (!empty($arrayfields['e.tms']['checked'])) {
1155 print_liste_field_titre($arrayfields['e.tms']['label'], $_SERVER["PHP_SELF"], "e.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1156 $totalarray['nbfield']++;
1157}
1158if (!empty($arrayfields['e.fk_statut']['checked'])) {
1159 print_liste_field_titre($arrayfields['e.fk_statut']['label'], $_SERVER["PHP_SELF"], "e.fk_statut", "", $param, '', $sortfield, $sortorder, 'right ');
1160 $totalarray['nbfield']++;
1161}
1162if (!empty($arrayfields['e.billed']['checked'])) {
1163 print_liste_field_titre($arrayfields['e.billed']['label'], $_SERVER["PHP_SELF"], "e.billed", "", $param, '', $sortfield, $sortorder, 'center ');
1164 $totalarray['nbfield']++;
1165}
1166// Action column
1167if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1168 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ');
1169 $totalarray['nbfield']++;
1170}
1171print "</tr>\n";
1172
1173
1174// Loop on record
1175// --------------------------------------------------------------------
1176$i = 0;
1177$savnbfield = $totalarray['nbfield'];
1178$totalarray = array();
1179$totalarray['nbfield'] = 0;
1180$imaxinloop = ($limit ? min($num, $limit) : $num);
1181while ($i < $imaxinloop) {
1182 $obj = $db->fetch_object($resql);
1183 if (empty($obj)) {
1184 break; // Should not happen
1185 }
1186
1187 $reception->id = $obj->rowid;
1188 $reception->ref = $obj->ref;
1189 //$reception->ref_supplier = $obj->ref_supplier;
1190 $reception->statut = $obj->status;
1191 $reception->status = $obj->status;
1192 $reception->socid = $obj->socid;
1193 $reception->billed = $obj->billed;
1194
1195 $reception->fetch_thirdparty();
1196
1197 $object = $reception;
1198
1199 $companystatic->id = $obj->socid;
1200 $companystatic->ref = $obj->name;
1201 $companystatic->name = $obj->name;
1202
1203 if ($mode == 'kanban') {
1204 if ($i == 0) {
1205 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1206 print '<div class="box-flex-container kanban">';
1207 }
1208 $object->date_delivery = $obj->delivery_date;
1209 $object->town = $obj->town;
1210
1211 // Output Kanban
1212 $selected = -1;
1213 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1214 $selected = 0;
1215 if (in_array($object->id, $arrayofselected)) {
1216 $selected = 1;
1217 }
1218 }
1219 print $object->getKanbanView('', array('thirdparty' => $companystatic->getNomUrl(1), 'selected' => $selected));
1220 if ($i == min($num, $limit) - 1) {
1221 print '</div>';
1222 print '</td></tr>';
1223 }
1224 } else {
1225 print '<tr class="oddeven">';
1226
1227 // Action column
1228 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1229 print '<td class="nowrap center">';
1230 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1231 $selected = 0;
1232 if (in_array($obj->rowid, $arrayofselected)) {
1233 $selected = 1;
1234 }
1235 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1236 }
1237 print '</td>';
1238 }
1239 // Ref
1240 if (!empty($arrayfields['e.ref']['checked'])) {
1241 print '<td class="nowraponall">';
1242 print $reception->getNomUrl(1);
1243 $filename = dol_sanitizeFileName($reception->ref);
1244 $filedir = $conf->reception->dir_output.'/'.dol_sanitizeFileName($reception->ref);
1245 $urlsource = $_SERVER['PHP_SELF'].'?id='.$reception->id;
1246 print $formfile->getDocumentsLink($reception->element, $filename, $filedir);
1247 print "</td>\n";
1248
1249 if (!$i) {
1250 $totalarray['nbfield']++;
1251 }
1252 }
1253
1254 // Ref supplier
1255 if (!empty($arrayfields['e.ref_supplier']['checked'])) {
1256 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($obj->ref_supplier).'">';
1257 print dol_escape_htmltag($obj->ref_supplier);
1258 print "</td>\n";
1259 if (!$i) {
1260 $totalarray['nbfield']++;
1261 }
1262 }
1263
1264 // Third party
1265 if (!empty($arrayfields['s.nom']['checked'])) {
1266 print '<td class="tdoverflowmax150">';
1267 print $companystatic->getNomUrl(1);
1268 print '</td>';
1269 if (!$i) {
1270 $totalarray['nbfield']++;
1271 }
1272 }
1273 // Town
1274 if (!empty($arrayfields['s.town']['checked'])) {
1275 print '<td class="nocellnopadd tdoverflowmax200" title="'.dol_escape_htmltag($obj->town).'">';
1276 print dol_escape_htmltag($obj->town);
1277 print '</td>';
1278 if (!$i) {
1279 $totalarray['nbfield']++;
1280 }
1281 }
1282 // Zip
1283 if (!empty($arrayfields['s.zip']['checked'])) {
1284 print '<td class="nocellnopadd center"">';
1285 print dol_escape_htmltag($obj->zip);
1286 print '</td>';
1287 if (!$i) {
1288 $totalarray['nbfield']++;
1289 }
1290 }
1291 // State
1292 if (!empty($arrayfields['state.nom']['checked'])) {
1293 print "<td>".dol_escape_htmltag($obj->state_name)."</td>\n";
1294 if (!$i) {
1295 $totalarray['nbfield']++;
1296 }
1297 }
1298 // Country
1299 if (!empty($arrayfields['country.code_iso']['checked'])) {
1300 print '<td class="center">';
1301 $tmparray = getCountry($obj->fk_pays, 'all');
1302 print dol_escape_htmltag($tmparray['label']);
1303 print '</td>';
1304 if (!$i) {
1305 $totalarray['nbfield']++;
1306 }
1307 }
1308 // Type ent
1309 if (!empty($arrayfields['typent.code']['checked'])) {
1310 print '<td class="center">';
1311 if (!isset($typenArray) || empty($typenArray)) {
1312 $typenArray = $formcompany->typent_array(1);
1313 }
1314 if (isset($typenArray[$obj->typent_code])) {
1315 print $typenArray[$obj->typent_code];
1316 }
1317 print '</td>';
1318 if (!$i) {
1319 $totalarray['nbfield']++;
1320 }
1321 }
1322
1323 // Date delivery planned
1324 if (!empty($arrayfields['e.date_delivery']['checked'])) {
1325 print '<td class="center">';
1326 print dol_print_date($db->jdate($obj->delivery_date), "day");
1327 /*$now = time();
1328 if ( ($now - $db->jdate($obj->date_reception)) > $conf->warnings->lim && $obj->statutid == 1 )
1329 {
1330 }*/
1331 print "</td>\n";
1332 if (!$i) {
1333 $totalarray['nbfield']++;
1334 }
1335 }
1336
1337 if (!empty($arrayfields['l.ref']['checked']) || !empty($arrayfields['l.date_delivery']['checked'])) {
1338 $reception->fetchObjectLinked($reception->id, $reception->element);
1339 $receiving = '';
1340 if (count($reception->linkedObjects['delivery']) > 0) {
1341 $receiving = reset($reception->linkedObjects['delivery']);
1342 }
1343
1344 if (!empty($arrayfields['l.ref']['checked'])) {
1345 // Ref
1346 print '<td>';
1347 print !empty($receiving) ? $receiving->getNomUrl($db) : '';
1348 print '</td>';
1349 }
1350
1351 if (!empty($arrayfields['l.date_delivery']['checked'])) {
1352 // Date received
1353 print '<td class="center">';
1354 print dol_print_date($db->jdate($obj->date_reception), "day");
1355 print '</td>'."\n";
1356 }
1357 }
1358
1359 // Extra fields
1360 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1361
1362 // Fields from hook
1363 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1364 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1365 print $hookmanager->resPrint;
1366 // Date creation
1367 if (!empty($arrayfields['e.datec']['checked'])) {
1368 print '<td class="center nowraponall">';
1369 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuserrel');
1370 print '</td>';
1371 if (!$i) {
1372 $totalarray['nbfield']++;
1373 }
1374 }
1375 // Date modification
1376 if (!empty($arrayfields['e.tms']['checked'])) {
1377 print '<td class="center nowraponall">';
1378 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuserrel');
1379 print '</td>';
1380 if (!$i) {
1381 $totalarray['nbfield']++;
1382 }
1383 }
1384 // Status
1385 if (!empty($arrayfields['e.fk_statut']['checked'])) {
1386 print '<td class="right nowrap">'.$reception->LibStatut($obj->status, 5).'</td>';
1387 if (!$i) {
1388 $totalarray['nbfield']++;
1389 }
1390 }
1391 // Billed
1392 if (!empty($arrayfields['e.billed']['checked'])) {
1393 print '<td class="center">'.yn($obj->billed).'</td>';
1394 if (!$i) {
1395 $totalarray['nbfield']++;
1396 }
1397 }
1398
1399 // Action column
1400 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1401 print '<td class="nowrap center">';
1402 if ($massactionbutton || $massaction) {
1403 // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1404 $selected = 0;
1405 if (in_array($obj->rowid, $arrayofselected)) {
1406 $selected = 1;
1407 }
1408 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1409 }
1410 print '</td>';
1411 }
1412 if (!$i) {
1413 $totalarray['nbfield']++;
1414 }
1415
1416 print "</tr>\n";
1417 }
1418 $i++;
1419}
1420
1421// If no record found
1422if ($num == 0) {
1423 $colspan = 1;
1424 foreach ($arrayfields as $key => $val) {
1425 if (!empty($val['checked'])) {
1426 $colspan++;
1427 }
1428 }
1429 print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
1430}
1431
1432// Show total line
1433include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1434
1435$parameters = array('arrayfields' => $arrayfields, 'totalarray' => $totalarray, 'sql' => $sql);
1436$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters); // Note that $action and $object may have been modified by hook
1437print $hookmanager->resPrint;
1438
1439print "</table>";
1440print "</div>";
1441print '</form>';
1442
1443$db->free($resql);
1444
1445$hidegeneratedfilelistifempty = 1;
1446if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1447 $hidegeneratedfilelistifempty = 0;
1448}
1449
1450// Show list of available documents
1451$urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1452$urlsource .= str_replace('&amp;', '&', $param);
1453
1454$filedir = $diroutputmassaction;
1455$genallowed = $user->hasRight('reception', 'lire');
1456$delallowed = $user->hasRight('reception', 'creer');
1457$title = '';
1458
1459print $formfile->showdocuments('massfilesarea_receipts', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1460
1461// End of page
1462llxFooter();
1463$db->close();
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage absolute discounts.
Class to manage standard extra fields.
Class to manage suppliers 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 to manage receptions.
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.
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.
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...
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.