dolibarr  17.0.4
shipment.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2003-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2012-2015 Juanjo Menent <jmenent@2byte.es>
6  * Copyright (C) 2018-2021 Frédéric France <frederic.france@netlogic.fr>
7  * Copyright (C) 2018-2022 Philippe Grand <philippe.grand@atoo-net.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  */
22 
29 // Load Dolibarr environment
30 require '../main.inc.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/lib/order.lib.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/lib/sendings.lib.php';
36 require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
37 if (isModEnabled('project')) {
38  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
39  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
40 }
41 if (isModEnabled('stock')) {
42  require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
43 }
44 if (isModEnabled("propal")) {
45  require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
46 }
47 if (isModEnabled("product") || isModEnabled("service")) {
48  require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
49 }
50 
51 // Load translation files required by the page
52 $langs->loadLangs(array('orders', 'sendings', 'companies', 'bills', 'propal', 'deliveries', 'stocks', 'productbatch', 'incoterm', 'other'));
53 
54 $id = GETPOST('id', 'int'); // id of order
55 $ref = GETPOST('ref', 'alpha');
56 $action = GETPOST('action', 'aZ09');
57 
58 $hookmanager->initHooks(array('ordershipmentcard'));
59 
60 
61 // Security check
62 $socid = 0;
63 if (!empty($user->socid)) {
64  $socid = $user->socid;
65 }
66 $result = restrictedArea($user, 'commande', $id);
67 
68 $object = new Commande($db);
69 $shipment = new Expedition($db);
70 $extrafields = new ExtraFields($db);
71 
72 // fetch optionals attributes and labels
73 $extrafields->fetch_name_optionals_label($object->table_element);
74 
75 // Load object
76 include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once
77 
78 // Security check
79 if ($user->socid) {
80  $socid = $user->socid;
81 }
82 
83 $result = restrictedArea($user, 'expedition', 0, ''); // We use 0 for id, because there is no particular shipment on this tab, only id of order is known
84 
85 
86 
87 /*
88  * Actions
89  */
90 
91 $parameters = array('socid' => $socid);
92 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
93 if ($reshook < 0) {
94  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
95 }
96 
97 if (empty($reshook)) {
98  // Categorisation dans projet
99  if ($action == 'classin') {
100  $object->fetch($id);
101  $object->setProject(GETPOST('projectid', 'int'));
102  }
103 
104  if ($action == 'confirm_cloture' && GETPOST('confirm', 'alpha') == 'yes') {
105  $object->fetch($id);
106  $result = $object->cloture($user);
107  } elseif ($action == 'setref_client' && $user->rights->commande->creer) {
108  // Positionne ref commande client
109  $result = $object->set_ref_client($user, GETPOST('ref_client'));
110  if ($result < 0) {
111  setEventMessages($object->error, $object->errors, 'errors');
112  }
113  }
114 
115  if ($action == 'setdatedelivery' && $user->rights->commande->creer) {
116  $datedelivery = dol_mktime(GETPOST('liv_hour', 'int'), GETPOST('liv_min', 'int'), 0, GETPOST('liv_month', 'int'), GETPOST('liv_day', 'int'), GETPOST('liv_year', 'int'));
117 
118  $object->fetch($id);
119  $result = $object->setDeliveryDate($user, $datedelivery);
120  if ($result < 0) {
121  setEventMessages($object->error, $object->errors, 'errors');
122  }
123  }
124  /*
125  if ($action == 'setdeliveryaddress' && $user->rights->commande->creer)
126  {
127  $object = new Commande($db);
128  $object->fetch($id);
129  $object->setDeliveryAddress(GETPOST('delivery_address_id','int'));
130  if ($result < 0)
131  setEventMessages($object->error, $object->errors, 'errors');
132  }
133  */
134  if ($action == 'setmode' && $user->rights->commande->creer) {
135  $object->fetch($id);
136  $result = $object->setPaymentMethods(GETPOST('mode_reglement_id', 'int'));
137  if ($result < 0) {
138  setEventMessages($object->error, $object->errors, 'errors');
139  }
140  }
141 
142  if ($action == 'setavailability' && $user->rights->commande->creer) {
143  $object->fetch($id);
144  $result = $object->availability(GETPOST('availability_id'));
145  if ($result < 0) {
146  setEventMessages($object->error, $object->errors, 'errors');
147  }
148  }
149 
150  if ($action == 'setdemandreason' && $user->rights->commande->creer) {
151  $object->fetch($id);
152  $result = $object->demand_reason(GETPOST('demand_reason_id'));
153  if ($result < 0) {
154  setEventMessages($object->error, $object->errors, 'errors');
155  }
156  }
157 
158  if ($action == 'setconditions' && $user->rights->commande->creer) {
159  $object->fetch($id);
160  $result = $object->setPaymentTerms(GETPOST('cond_reglement_id', 'int'));
161  if ($result < 0) {
162  setEventMessages($object->error, $object->errors, 'errors');
163  }
164  } elseif ($action == 'set_incoterms' && isModEnabled('incoterm')) {
165  // Set incoterm
166  $result = $object->setIncoterms(GETPOST('incoterm_id', 'int'), GETPOST('location_incoterms', 'alpha'));
167  if ($result < 0) {
168  setEventMessages($object->error, $object->errors, 'errors');
169  }
170  }
171 
172  // shipping method
173  if ($action == 'setshippingmethod' && $user->rights->commande->creer) {
174  $object->fetch($id);
175  $result = $object->setShippingMethod(GETPOST('shipping_method_id', 'int'));
176  if ($result < 0) {
177  setEventMessages($object->error, $object->errors, 'errors');
178  }
179  }
180 
181  // warehouse
182  if ($action == 'setwarehouse' && $user->rights->commande->creer) {
183  $object->fetch($id);
184  $result = $object->setWarehouse(GETPOST('warehouse_id', 'int'));
185  if ($result < 0) {
186  setEventMessages($object->error, $object->errors, 'errors');
187  }
188  }
189 
190  if ($action == 'update_extras') {
191  $object->oldcopy = dol_clone($object);
192 
193  // Fill array 'array_options' with data from update form
194  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
195  if ($ret < 0) {
196  $error++;
197  }
198 
199  if (!$error) {
200  // Actions on extra fields
201  $result = $object->insertExtraFields('SHIPMENT_MODIFY');
202  if ($result < 0) {
203  setEventMessages($object->error, $object->errors, 'errors');
204  $error++;
205  }
206  }
207 
208  if ($error) {
209  $action = 'edit_extras';
210  }
211  }
212 
213  if ($action == 'set_thirdparty' && $user->rights->commande->creer) {
214  $object->fetch($id);
215  $object->setValueFrom('fk_soc', $socid, '', '', 'date', '', $user, 'ORDER_MODIFY');
216 
217  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id);
218  exit();
219  }
220 
221  include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
222 }
223 
224 /*
225  * View
226  */
227 
228 $form = new Form($db);
229 $formfile = new FormFile($db);
230 $formproduct = new FormProduct($db);
231 if (isModEnabled('project')) {
232  $formproject = new FormProjets($db);
233 }
234 
235 $title = $object->ref." - ".$langs->trans('Shipments');
236 $help_url = 'EN:Customers_Orders|FR:Commandes_Clients|ES:Pedidos de clientes|DE:Modul_Kundenaufträge';
237 llxHeader('', $title, $help_url);
238 
239 
240 if ($id > 0 || !empty($ref)) {
241  $object = new Commande($db);
242  if ($object->fetch($id, $ref) > 0) {
243  $object->loadExpeditions(1);
244 
245  $product_static = new Product($db);
246 
247  $soc = new Societe($db);
248  $soc->fetch($object->socid);
249 
250  $author = new User($db);
251  $author->fetch($object->user_author_id);
252 
253  $res = $object->fetch_optionals();
254 
255  $head = commande_prepare_head($object);
256  print dol_get_fiche_head($head, 'shipping', $langs->trans("CustomerOrder"), -1, 'order');
257 
258 
259  $formconfirm = '';
260 
261  // Confirm validation
262  if ($action == 'cloture') {
263  $formconfirm = $form->formconfirm($_SERVER['PHP_SELF']."?id=".urlencode($id), $langs->trans("CloseShipment"), $langs->trans("ConfirmCloseShipment"), "confirm_cloture");
264  }
265 
266  // Call Hook formConfirm
267  $parameters = array('formConfirm' => $formconfirm);
268  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
269  if (empty($reshook)) {
270  $formconfirm .= $hookmanager->resPrint;
271  } elseif ($reshook > 0) {
272  $formconfirm = $hookmanager->resPrint;
273  }
274 
275  // Print form confirm
276  print $formconfirm;
277 
278 
279  // Order card
280 
281  $linkback = '<a href="'.DOL_URL_ROOT.'/commande/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '?socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
282 
283 
284  $morehtmlref = '<div class="refidno">';
285  // Ref customer
286  $morehtmlref .= $form->editfieldkey("RefCustomer", 'ref_customer', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', 0, 1);
287  $morehtmlref .= $form->editfieldval("RefCustomer", 'ref_customer', $object->ref_client, $object, $user->rights->commande->creer, 'string', '', null, null, '', 1);
288  // Thirdparty
289  $morehtmlref .= '<br>'.$soc->getNomUrl(1);
290  // Project
291  if (isModEnabled('project')) {
292  $langs->load("projects");
293  $morehtmlref .= '<br>';
294  if (0) { // Do not change on shipment
295  $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
296  if ($action != 'classify') {
297  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
298  }
299  $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $objectsrc->socid, $objectsrc->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
300  } else {
301  if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
302  $proj = new Project($db);
303  $proj->fetch($objectsrc->fk_project);
304  $morehtmlref .= $proj->getNomUrl(1);
305  if ($proj->title) {
306  $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
307  }
308  }
309  }
310  }
311  $morehtmlref .= '</div>';
312 
313 
314  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
315 
316 
317  print '<div class="fichecenter">';
318  print '<div class="fichehalfleft">';
319  print '<div class="underbanner clearboth"></div>';
320 
321  print '<table class="border centpercent tableforfield">';
322 
323  // Discounts for third party
324  if (!empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) {
325  $filterabsolutediscount = "fk_facture_source IS NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
326  $filtercreditnote = "fk_facture_source IS NOT NULL"; // If we want deposit to be substracted to payments only and not to total of final invoice
327  } else {
328  $filterabsolutediscount = "fk_facture_source IS NULL OR (description LIKE '(DEPOSIT)%' AND description NOT LIKE '(EXCESS RECEIVED)%')";
329  $filtercreditnote = "fk_facture_source IS NOT NULL AND (description NOT LIKE '(DEPOSIT)%' OR description LIKE '(EXCESS RECEIVED)%')";
330  }
331 
332  print '<tr><td class="titlefield">'.$langs->trans('Discounts').'</td><td colspan="2">';
333 
334  $absolute_discount = $soc->getAvailableDiscounts('', $filterabsolutediscount);
335  $absolute_creditnote = $soc->getAvailableDiscounts('', $filtercreditnote);
336  $absolute_discount = price2num($absolute_discount, 'MT');
337  $absolute_creditnote = price2num($absolute_creditnote, 'MT');
338 
339  $thirdparty = $soc;
340  $discount_type = 0;
341  $backtopage = urlencode($_SERVER["PHP_SELF"].'?id='.$object->id);
342  $cannotApplyDiscount = 1;
343  include DOL_DOCUMENT_ROOT.'/core/tpl/object_discounts.tpl.php';
344  print '</td></tr>';
345 
346  // Date
347  print '<tr><td>'.$langs->trans('Date').'</td>';
348  print '<td colspan="2">';
349  print dol_print_date($object->date, 'day');
350  if ($object->hasDelay() && empty($object->delivery_date)) { // If there is a delivery date planned, warning should be on this date
351  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
352  }
353  print '</td>';
354  print '</tr>';
355 
356  // Delivery date planned
357  print '<tr><td height="10">';
358  print '<table class="nobordernopadding" width="100%"><tr><td>';
359  print $langs->trans('DateDeliveryPlanned');
360  print '</td>';
361 
362  if ($action != 'editdate_livraison') {
363  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editdate_livraison&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetDeliveryDate'), 1).'</a></td>';
364  }
365  print '</tr></table>';
366  print '</td><td colspan="2">';
367  if ($action == 'editdate_livraison') {
368  print '<form name="setdate_livraison" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" method="post">';
369  print '<input type="hidden" name="token" value="'.newToken().'">';
370  print '<input type="hidden" name="action" value="setdatedelivery">';
371  print $form->selectDate($object->delivery_date ? $object->delivery_date : -1, 'liv_', 1, 1, '', "setdate_livraison", 1, 0);
372  print '<input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
373  print '</form>';
374  } else {
375  print dol_print_date($object->delivery_date, 'dayhour');
376  if ($object->hasDelay() && !empty($object->delivery_date)) {
377  print ' '.img_picto($langs->trans("Late").' : '.$object->showDelay(), "warning");
378  }
379  }
380  print '</td>';
381  // Note on several rows
382  //print '<td rowspan="'.$nbrow.'" valign="top">'.$langs->trans('NotePublic').' :<br>';
383  //print nl2br($object->note_public);
384  //print '</td>';
385  print '</tr>';
386 
387  // Delivery delay
388  print '<tr><td height="10">';
389  print '<table class="nobordernopadding" width="100%"><tr><td>';
390  print $langs->trans('AvailabilityPeriod');
391  print '</td>';
392  if ($action != 'editavailability') {
393  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editavailability&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetAvailability'), 1).'</a></td>';
394  }
395  print '</tr></table>';
396  print '</td><td colspan="2">';
397  if ($action == 'editavailability') {
398  $form->form_availability($_SERVER['PHP_SELF'].'?id='.$object->id, $object->availability_id, 'availability_id', 1);
399  } else {
400  $form->form_availability($_SERVER['PHP_SELF'].'?id='.$object->id, $object->availability_id, 'none', 1);
401  }
402  print '</td></tr>';
403 
404  // Shipping Method
405  print '<tr><td>';
406  print '<table width="100%" class="nobordernopadding"><tr><td>';
407  print $langs->trans('SendingMethod');
408  print '</td>';
409  if ($action != 'editshippingmethod' && $user->rights->expedition->creer) {
410  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editshippingmethod&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetShippingMode'), 1).'</a></td>';
411  }
412  print '</tr></table>';
413  print '</td><td colspan="2">';
414  if ($action == 'editshippingmethod') {
415  $form->formSelectShippingMethod($_SERVER['PHP_SELF'].'?id='.$object->id, $object->shipping_method_id, 'shipping_method_id', 1);
416  } else {
417  $form->formSelectShippingMethod($_SERVER['PHP_SELF'].'?id='.$object->id, $object->shipping_method_id, 'none');
418  }
419  print '</td>';
420  print '</tr>';
421 
422  // Warehouse
423  if (isModEnabled('stock') && !empty($conf->global->WAREHOUSE_ASK_WAREHOUSE_DURING_ORDER)) {
424  require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
425  $formproduct = new FormProduct($db);
426  print '<tr><td>';
427  print '<table width="100%" class="nobordernopadding"><tr><td>';
428  print $langs->trans('Warehouse');
429  print '</td>';
430  if ($action != 'editwarehouse' && $user->rights->commande->creer) {
431  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editwarehouse&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetWarehouse'), 1).'</a></td>';
432  }
433  print '</tr></table>';
434  print '</td><td colspan="2">';
435  if ($action == 'editwarehouse') {
436  $formproduct->formSelectWarehouses($_SERVER['PHP_SELF'].'?id='.$object->id, $object->warehouse_id, 'warehouse_id', 1);
437  } else {
438  $formproduct->formSelectWarehouses($_SERVER['PHP_SELF'].'?id='.$object->id, $object->warehouse_id, 'none');
439  }
440  print '</td>';
441  print '</tr>';
442  }
443 
444  // Source reason (why we have an order)
445  print '<tr><td height="10">';
446  print '<table class="nobordernopadding" width="100%"><tr><td>';
447  print $langs->trans('Source');
448  print '</td>';
449  if ($action != 'editdemandreason') {
450  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editdemandreason&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetDemandReason'), 1).'</a></td>';
451  }
452  print '</tr></table>';
453  print '</td><td colspan="2">';
454  if ($action == 'editdemandreason') {
455  $form->formInputReason($_SERVER['PHP_SELF'].'?id='.$object->id, $object->demand_reason_id, 'demand_reason_id', 1);
456  } else {
457  $form->formInputReason($_SERVER['PHP_SELF'].'?id='.$object->id, $object->demand_reason_id, 'none');
458  }
459 
460  // Terms of payment
461  /*
462  print '<tr><td height="10">';
463  print '<table class="nobordernopadding" width="100%"><tr><td>';
464  print $langs->trans('PaymentConditionsShort');
465  print '</td>';
466 
467  if ($action != 'editconditions' && $object->statut == Expedition::STATUS_VALIDATED) print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editconditions&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetConditions'),1).'</a></td>';
468  print '</tr></table>';
469  print '</td><td colspan="2">';
470  if ($action == 'editconditions')
471  {
472  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->cond_reglement_id,'cond_reglement_id');
473  }
474  else
475  {
476  $form->form_conditions_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->cond_reglement_id,'none');
477  }
478  print '</td></tr>';
479 
480  // Mode of payment
481  print '<tr><td>';
482  print '<table class="nobordernopadding" width="100%"><tr><td>';
483  print $langs->trans('PaymentMode');
484  print '</td>';
485  if ($action != 'editmode' && $object->statut == Expedition::STATUS_VALIDATED) print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=editmode&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->trans('SetMode'),1).'</a></td>';
486  print '</tr></table>';
487  print '</td><td colspan="2">';
488  if ($action == 'editmode')
489  {
490  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->mode_reglement_id,'mode_reglement_id');
491  }
492  else
493  {
494  $form->form_modes_reglement($_SERVER['PHP_SELF'].'?id='.$object->id,$object->mode_reglement_id,'none');
495  }
496  print '</td></tr>';*/
497 
498  $tmparray = $object->getTotalWeightVolume();
499  $totalWeight = $tmparray['weight'];
500  $totalVolume = $tmparray['volume'];
501  if ($totalWeight || $totalVolume) {
502  print '<tr><td>'.$langs->trans("CalculatedWeight").'</td>';
503  print '<td colspan="2">';
504  print showDimensionInBestUnit($totalWeight, 0, "weight", $langs, isset($conf->global->MAIN_WEIGHT_DEFAULT_ROUND) ? $conf->global->MAIN_WEIGHT_DEFAULT_ROUND : -1, isset($conf->global->MAIN_WEIGHT_DEFAULT_UNIT) ? $conf->global->MAIN_WEIGHT_DEFAULT_UNIT : 'no');
505  print '</td></tr>';
506  print '<tr><td>'.$langs->trans("CalculatedVolume").'</td>';
507  print '<td colspan="2">';
508  print showDimensionInBestUnit($totalVolume, 0, "volume", $langs, isset($conf->global->MAIN_VOLUME_DEFAULT_ROUND) ? $conf->global->MAIN_VOLUME_DEFAULT_ROUND : -1, isset($conf->global->MAIN_VOLUME_DEFAULT_UNIT) ? $conf->global->MAIN_VOLUME_DEFAULT_UNIT : 'no');
509  print '</td></tr>';
510  }
511 
512  // TODO How record was recorded OrderMode (llx_c_input_method)
513 
514  // Incoterms
515  if (isModEnabled('incoterm')) {
516  print '<tr><td>';
517  print '<table width="100%" class="nobordernopadding"><tr><td>';
518  print $langs->trans('IncotermLabel');
519  print '<td><td class="right">';
520  if ($user->rights->commande->creer) {
521  print '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'/expedition/shipment.php?id='.$object->id.'&action=editincoterm&token='.newToken().'">'.img_edit().'</a>';
522  } else {
523  print '&nbsp;';
524  }
525  print '</td></tr></table>';
526  print '</td>';
527  print '<td colspan="2">';
528  if ($action != 'editincoterm') {
529  print $form->textwithpicto($object->display_incoterms(), $object->label_incoterms, 1);
530  } else {
531  print $form->select_incoterms((!empty($object->fk_incoterms) ? $object->fk_incoterms : ''), (!empty($object->location_incoterms) ? $object->location_incoterms : ''), $_SERVER['PHP_SELF'].'?id='.$object->id);
532  }
533  print '</td></tr>';
534  }
535 
536  $expe = new Expedition($db);
537  $extrafields->fetch_name_optionals_label($expe->table_element);
538 
539  // Other attributes
540  $cols = 2;
541  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
542 
543  print '</table>';
544 
545  print '</div>';
546  print '<div class="fichehalfright">';
547  print '<div class="underbanner clearboth"></div>';
548 
549  print '<table class="border centpercent tableforfield">';
550 
551  if (isModEnabled("multicurrency") && ($object->multicurrency_code != $conf->currency)) {
552  // Multicurrency Amount HT
553  print '<tr><td class="titlefieldmiddle">'.$form->editfieldkey('MulticurrencyAmountHT', 'multicurrency_total_ht', '', $object, 0).'</td>';
554  print '<td class="nowrap">'.price($object->multicurrency_total_ht, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
555  print '</tr>';
556 
557  // Multicurrency Amount VAT
558  print '<tr><td>'.$form->editfieldkey('MulticurrencyAmountVAT', 'multicurrency_total_tva', '', $object, 0).'</td>';
559  print '<td class="nowrap">'.price($object->multicurrency_total_tva, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
560  print '</tr>';
561 
562  // Multicurrency Amount TTC
563  print '<tr><td>'.$form->editfieldkey('MulticurrencyAmountTTC', 'multicurrency_total_ttc', '', $object, 0).'</td>';
564  print '<td class="nowrap">'.price($object->multicurrency_total_ttc, '', $langs, 0, - 1, - 1, (!empty($object->multicurrency_code) ? $object->multicurrency_code : $conf->currency)).'</td>';
565  print '</tr>';
566  }
567 
568  // Total HT
569  print '<tr><td class="titlefieldmiddle">'.$langs->trans('AmountHT').'</td>';
570  print '<td>'.price($object->total_ht, 0, '', 1, -1, -1, $conf->currency).'</td>';
571  print '</tr>';
572 
573  // Total VAT
574  print '<tr><td>'.$langs->trans('AmountVAT').'</td><td>'.price($object->total_tva, 0, '', 1, -1, -1, $conf->currency).'</td>';
575  print '</tr>';
576 
577  // Amount Local Taxes
578  if ($mysoc->localtax1_assuj == "1" || $object->total_localtax1 != 0) { // Localtax1
579  print '<tr><td>'.$langs->transcountry("AmountLT1", $mysoc->country_code).'</td>';
580  print '<td>'.price($object->total_localtax1, 1, '', 1, - 1, - 1, $conf->currency).'</td></tr>';
581  }
582  if ($mysoc->localtax2_assuj == "1" || $object->total_localtax2 != 0) { // Localtax2 IRPF
583  print '<tr><td>'.$langs->transcountry("AmountLT2", $mysoc->country_code).'</td>';
584  print '<td>'.price($object->total_localtax2, 1, '', 1, - 1, - 1, $conf->currency).'</td></tr>';
585  }
586 
587  // Total TTC
588  print '<tr><td>'.$langs->trans('AmountTTC').'</td><td>'.price($object->total_ttc, 0, '', 1, -1, -1, $conf->currency).'</td>';
589  print '</tr>';
590 
591  print '</table>';
592 
593  print '</div>';
594  print '</div>';
595 
596  print '<div class="clearboth"></div><br>';
597 
598 
603  print '<table id="tablelines" class="noborder noshadow" width="100%">';
604 
605  $sql = "SELECT cd.rowid, cd.fk_product, cd.product_type as type, cd.label, cd.description,";
606  $sql .= " cd.price, cd.tva_tx, cd.subprice,";
607  $sql .= " cd.qty, cd.fk_unit,";
608  $sql .= ' cd.date_start,';
609  $sql .= ' cd.date_end,';
610  $sql .= ' cd.special_code,';
611  $sql .= ' p.rowid as prodid, p.label as product_label, p.entity, p.ref, p.fk_product_type as product_type, p.description as product_desc,';
612  $sql .= ' p.weight, p.weight_units, p.length, p.length_units, p.width, p.width_units, p.height, p.height_units,';
613  $sql .= ' p.surface, p.surface_units, p.volume, p.volume_units';
614  $sql .= ', p.tobatch, p.tosell, p.tobuy, p.barcode';
615  $sql .= ', u.short_label as unit_order';
616  $sql .= " FROM ".MAIN_DB_PREFIX."commandedet as cd";
617  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON cd.fk_product = p.rowid";
618  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_units as u ON cd.fk_unit = u.rowid";
619  $sql .= " WHERE cd.fk_commande = ".((int) $object->id);
620  $sql .= " ORDER BY cd.rang, cd.rowid";
621 
622  //print $sql;
623  dol_syslog("shipment.php", LOG_DEBUG);
624  $resql = $db->query($sql);
625  if ($resql) {
626  $num = $db->num_rows($resql);
627  $i = 0;
628  print '<thead>';
629  print '<tr class="liste_titre">';
630  print '<th>'.$langs->trans("Description").'</th>';
631  print '<th class="center">'.$langs->trans("QtyOrdered").'</th>';
632  print '<th class="center">'.$langs->trans("QtyShipped").'</th>';
633  print '<th class="center">'.$langs->trans("KeepToShip").'</th>';
634  if (isModEnabled('stock')) {
635  print '<th class="center">'.$langs->trans("RealStock").'</th>';
636  } else {
637  print '<th>&nbsp;</th>';
638  }
639  print "</tr>\n";
640  print '</thead>';
641 
642  $toBeShipped = array();
643  $toBeShippedTotal = 0;
644  while ($i < $num) {
645  $objp = $db->fetch_object($resql);
646 
647  $parameters = array('i' => $i, 'line' => $objp, 'num' => $num);
648  $reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $object, $action);
649  if ($reshook < 0) {
650  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
651  }
652 
653  if (empty($reshook)) {
654  // Show product and description
655  $type = isset($objp->type) ? $objp->type : $objp->product_type;
656 
657  // Try to enhance type detection using date_start and date_end for free lines where type
658  // was not saved.
659  if (!empty($objp->date_start)) {
660  $type = 1;
661  }
662  if (!empty($objp->date_end)) {
663  $type = 1;
664  }
665 
666  print '<tr class="oddeven">';
667 
668  // Product label
669  if ($objp->fk_product > 0) {
670  // Define output language
671  if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
672  $object->fetch_thirdparty();
673 
674  $prod = new Product($db);
675  $prod->id = $objp->fk_product;
676  $prod->entity = $objp->entity;
677  $prod->getMultiLangs();
678 
679  $outputlangs = $langs;
680  $newlang = '';
681  if (empty($newlang) && GETPOST('lang_id', 'aZ09')) {
682  $newlang = GETPOST('lang_id', 'aZ09');
683  }
684  if (empty($newlang)) {
685  $newlang = $object->thirdparty->default_lang;
686  }
687  if (!empty($newlang)) {
688  $outputlangs = new Translate("", $conf);
689  $outputlangs->setDefaultLang($newlang);
690  }
691 
692  $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $objp->product_label;
693  } else {
694  $label = (!empty($objp->label) ? $objp->label : $objp->product_label);
695  }
696 
697  print '<td>';
698  print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne
699 
700  // Show product and description
701  $product_static->type = $type;
702  $product_static->id = $objp->fk_product;
703  $product_static->ref = $objp->ref;
704  $product_static->entity = $objp->entity;
705  $product_static->status = $objp->tosell;
706  $product_static->status_buy = $objp->tobuy;
707  $product_static->status_batch = $objp->tobatch;
708  $product_static->barcode = $objp->barcode;
709 
710  $product_static->weight = $objp->weight;
711  $product_static->weight_units = $objp->weight_units;
712  $product_static->length = $objp->length;
713  $product_static->length_units = $objp->length_units;
714  $product_static->width = $objp->width;
715  $product_static->width_units = $objp->width_units;
716  $product_static->height = $objp->height;
717  $product_static->height_units = $objp->height_units;
718  $product_static->surface = $objp->surface;
719  $product_static->surface_units = $objp->surface_units;
720  $product_static->volume = $objp->volume;
721  $product_static->volume_units = $objp->volume_units;
722 
723  $text = $product_static->getNomUrl(1);
724  $text .= ' - '.$label;
725  $description = (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE') ? '' : dol_htmlentitiesbr($objp->description)).'<br>';
726  $description .= $product_static->show_photos('product', $conf->product->multidir_output[$product_static->entity], 1, 1, 0, 0, 0, 80);
727  print $form->textwithtooltip($text, $description, 3, '', '', $i);
728 
729  // Show range
730  print_date_range($db->jdate($objp->date_start), $db->jdate($objp->date_end));
731 
732  // Add description in form
733  if (getDolGlobalInt('PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
734  print ($objp->description && $objp->description != $objp->product_label) ? '<br>'.dol_htmlentitiesbr($objp->description) : '';
735  }
736 
737  print '</td>';
738  } else {
739  print "<td>";
740  if ($type == 1) {
741  $text = img_object($langs->trans('Service'), 'service');
742  } else {
743  $text = img_object($langs->trans('Product'), 'product');
744  }
745 
746  if (!empty($objp->label)) {
747  $text .= ' <strong>'.$objp->label.'</strong>';
748  print $form->textwithtooltip($text, $objp->description, 3, '', '', $i);
749  } else {
750  print $text.' '.nl2br($objp->description);
751  }
752 
753  // Show range
754  print_date_range($db->jdate($objp->date_start), $db->jdate($objp->date_end));
755  print "</td>\n";
756  }
757 
758  // Qty ordered
759  print '<td class="center">'.$objp->qty.($objp->unit_order ? ' '.$objp->unit_order : '').'</td>';
760 
761  // Qty already shipped
762  $qtyProdCom = $objp->qty;
763  print '<td class="center">';
764  // Nb of sending products for this line of order
765  $qtyAlreadyShipped = (!empty($object->expeditions[$objp->rowid]) ? $object->expeditions[$objp->rowid] : 0);
766  print $qtyAlreadyShipped;
767  print ($objp->unit_order ? ' '.$objp->unit_order : '').'</td>';
768 
769  // Qty remains to ship
770  print '<td class="center">';
771  if ($type == 0 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
772  $toBeShipped[$objp->fk_product] = $objp->qty - $qtyAlreadyShipped;
773  $toBeShippedTotal += $toBeShipped[$objp->fk_product];
774  print $toBeShipped[$objp->fk_product];
775  } else {
776  print '0 ('.$langs->trans("Service").')';
777  }
778  print ($objp->unit_order ? ' '.$objp->unit_order : '').'</td>';
779 
780  if ($objp->fk_product > 0) {
781  $product = new Product($db);
782  $product->fetch($objp->fk_product);
783  $product->load_stock('warehouseopen');
784  }
785 
786  if ($objp->fk_product > 0 && ($type == Product::TYPE_PRODUCT || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) && isModEnabled('stock')) {
787  print '<td class="center">';
788  print $product->stock_reel;
789  if ($product->stock_reel < $toBeShipped[$objp->fk_product]) {
790  print ' '.img_warning($langs->trans("StockTooLow"));
791  if (!empty($conf->global->STOCK_CORRECT_STOCK_IN_SHIPMENT)) {
792  $nbPiece = $toBeShipped[$objp->fk_product] - $product->stock_reel;
793  print ' &nbsp; '.$langs->trans("GoTo").' <a href="'.DOL_URL_ROOT.'/product/stock/product.php?id='.((int) $product->id).'&action=correction&nbpiece='.urlencode($nbPiece).'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.((int) $object->id)).'">'.$langs->trans("CorrectStock").'</a>';
794  }
795  }
796  print '</td>';
797  } else {
798  print '<td>&nbsp;</td>';
799  }
800  print "</tr>\n";
801 
802  // Show subproducts lines
803  if ($objp->fk_product > 0 && !empty($conf->global->PRODUIT_SOUSPRODUITS)) {
804  // Set tree of subproducts in product->sousprods
805  $product->get_sousproduits_arbo();
806  //var_dump($product->sousprods);exit;
807 
808  // Define a new tree with quantiies recalculated
809  $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
810  //var_dump($prods_arbo);
811  if (count($prods_arbo) > 0) {
812  foreach ($prods_arbo as $key => $value) {
813  $img = '';
814  if ($value['stock'] < $value['stock_alert']) {
815  $img = img_warning($langs->trans("StockTooLow"));
816  }
817  print '<tr class="oddeven"><td>&nbsp; &nbsp; &nbsp; -> <a href="'.DOL_URL_ROOT."/product/card.php?id=".$value['id'].'">'.$value['fullpath'].'</a> ('.$value['nb'].')</td>';
818  print '<td class="center"> '.$value['nb_total'].'</td>';
819  print '<td>&nbsp;</td>';
820  print '<td>&nbsp;</td>';
821  print '<td class="center">'.$value['stock'].' '.$img.'</td></tr>'."\n";
822  }
823  }
824  }
825  }
826  $i++;
827  }
828  $db->free($resql);
829 
830  if (!$num) {
831  print '<tr '.$bc[false].'><td colspan="5">'.$langs->trans("NoArticleOfTypeProduct").'<br>';
832  }
833 
834  print "</table>";
835  } else {
836  dol_print_error($db);
837  }
838 
839  print '</div>';
840 
841 
842  /*
843  * Boutons Actions
844  */
845 
846  if (empty($user->socid)) {
847  print '<div class="tabsAction">';
848 
849  // Bouton expedier sans gestion des stocks
850  if (!isModEnabled('stock') && ($object->statut > Commande::STATUS_DRAFT && $object->statut < Commande::STATUS_CLOSED)) {
851  if ($user->rights->expedition->creer) {
852  print '<a class="butAction" href="'.DOL_URL_ROOT.'/expedition/card.php?action=create&amp;origin=commande&amp;object_id='.$id.'">'.$langs->trans("CreateShipment").'</a>';
853  if ($toBeShippedTotal <= 0) {
854  print ' '.img_warning($langs->trans("WarningNoQtyLeftToSend"));
855  }
856  } else {
857  print '<a class="butActionRefused classfortooltip" href="#">'.$langs->trans("CreateShipment").'</a>';
858  }
859  }
860  print "</div>";
861  }
862 
863 
864  // Bouton expedier avec gestion des stocks
865 
866  if (isModEnabled('stock') && $object->statut == Commande::STATUS_DRAFT) {
867  print $langs->trans("ValidateOrderFirstBeforeShipment");
868  }
869 
870  if (isModEnabled('stock') && ($object->statut > Commande::STATUS_DRAFT && $object->statut < Commande::STATUS_CLOSED)) {
871  if ($user->rights->expedition->creer) {
872  //print load_fiche_titre($langs->trans("CreateShipment"));
873  print '<div class="tabsAction">';
874 
875  print '<form method="GET" action="'.DOL_URL_ROOT.'/expedition/card.php">';
876  print '<input type="hidden" name="action" value="create">';
877  //print '<input type="hidden" name="id" value="'.$object->id.'">';
878  print '<input type="hidden" name="shipping_method_id" value="'.$object->shipping_method_id.'">';
879  print '<input type="hidden" name="origin" value="commande">';
880  print '<input type="hidden" name="origin_id" value="'.$object->id.'">';
881  print '<input type="hidden" name="projectid" value="'.$object->fk_project.'">';
882  //print '<table class="border centpercent">';
883 
884  $langs->load("stocks");
885 
886  //print '<tr>';
887 
888  if (isModEnabled('stock')) {
889  //print '<td>';
890  print $langs->trans("WarehouseSource");
891  //print '</td>';
892  //print '<td>';
893  print $formproduct->selectWarehouses(!empty($object->warehouse_id) ? $object->warehouse_id : 'ifone', 'entrepot_id', '', 1, 0, 0, '', 0, 0, array(), 'minwidth200');
894  if (count($formproduct->cache_warehouses) <= 0) {
895  print ' &nbsp; '.$langs->trans("WarehouseSourceNotDefined").' <a href="'.DOL_URL_ROOT.'/product/stock/card.php?action=create">'.$langs->trans("AddOne").'</a>';
896  }
897  //print '</td>';
898  }
899  //print '<td class="center">';
900  print '<input type="submit" class="butAction" named="save" value="'.$langs->trans("CreateShipment").'">';
901  if ($toBeShippedTotal <= 0) {
902  print ' '.img_warning($langs->trans("WarningNoQtyLeftToSend"));
903  }
904  //print '</td></tr>';
905 
906  //print "</table>";
907  print "</form>\n";
908 
909  print '</div>';
910 
911  $somethingshown = 1;
912  } else {
913  print '<div class="tabsAction">';
914  print '<a class="butActionRefused classfortooltip" href="#">'.$langs->trans("CreateShipment").'</a>';
915  print '</div>';
916  }
917  }
918 
919  show_list_sending_receive('commande', $object->id);
920  } else {
921  /* Order not found */
922  setEventMessages($langs->trans("NonExistentOrder"), null, 'errors');
923  }
924 }
925 
926 // End of page
927 llxFooter();
928 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage customers orders.
const STATUS_CLOSED
Closed (Sent, billed or not)
const STATUS_DRAFT
Draft status.
Class to manage shipments.
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage building of HTML components.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
print_date_range($date_start, $date_end, $format='', $outputlangs='')
Format output for start and end date.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$formconfirm
if ($action == 'delbookkeepingyear') {
commande_prepare_head(Commande $object)
Prepare array with list of tabs.
Definition: order.lib.php:34
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.
show_list_sending_receive($origin, $origin_id, $filter='')
List sendings and receive receipts.