From 1e929e647df87dacb6c6abe099587c930ef93412 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Fri, 5 Aug 2016 10:02:36 +0200 Subject: [PATCH] better management of dispatch status --- .../class/fournisseur.commande.class.php | 114 +- htdocs/fourn/commande/dispatch.php | 1130 ++++++++--------- 2 files changed, 591 insertions(+), 653 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index ec7d3843fa0..b01ae40d62e 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -2686,6 +2686,63 @@ class CommandeFournisseur extends CommonOrder return $text; } + + /** + * Calc status regarding dispatch stock + * + * @param User $user + * @return int <0 si ko, >0 si ok + */ + public function calcAndSetStatusDispatch(User $user) { + global $conf; + + if (! empty($conf->commande->enabled) && ! empty($conf->fournisseur->enabled)) + { + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; + + $qtydelivered=array(); + $qtywished=array(); + + $supplierorderdispatch = new CommandeFournisseurDispatch($this->db); + $filter=array('t.fk_commande'=>$this->id); + if (!empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) { + $filter['t.status']=1; + } + $ret=$supplierorderdispatch->fetchAll('','',0,0,$filter); + if ($ret<0) { + $this->error=$supplierorderdispatch->error; $this->errors=$supplierorderdispatch->errors; + return $ret; + } else { + if (is_array($supplierorderdispatch->lines) && count($supplierorderdispatch->lines)>0) { + //Build array with quantity deliverd by product + foreach($supplierorderdispatch->lines as $line) { + $qtydelivered[$line->fk_product]+=$line->qty; + } + foreach($this->lines as $line) { + $qtywished[$line->fk_product]+=$line->qty; + } + //Compare array + $diff_array=array_diff_assoc($qtydelivered,$qtywished); + if (count($diff_array)==0) { + //No diff => mean everythings is received + $ret=$this->setStatus($user,5); + if ($ret<0) { + $this->error=$object->error; $this->errors=$object->errors; + } + } else { + //Diff => received partially + $ret=$this->setStatus($user,4); + if ($ret<0) { + $this->error=$object->error; $this->errors=$object->errors; + } + } + } + } + + + return 1; + } + } } @@ -3056,62 +3113,5 @@ class CommandeFournisseurLigne extends CommonOrderLine return -1; } } - - /** - * Calc status regarding dispatch stock - * - * @param User $user - * @return int <0 si ko, >0 si ok - */ - public function calcAndSetStatusDispatch(User $user) { - global $conf; - - if (! empty($conf->commande->enabled) && ! empty($conf->fournisseur->enabled) && ! empty($conf->global->WORKFLOW_SUPPLIER_ORDER_CLASSIFY_RECEIPT_ORDER)) - { - require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; - - $qtydelivered=array(); - $qtywished=array(); - - $supplierorderdispatch = new CommandeFournisseurDispatch($this->db); - $filter=array('t.fk_commande'=>$this->id); - if (!empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) { - $filter['t.status']=1; - } - $ret=$supplierorderdispatch->fetchAll('','',0,0,$filter); - if ($ret<0) { - $this->error=$supplierorderdispatch->error; $this->errors=$supplierorderdispatch->errors; - return $ret; - } else { - if (is_array($supplierorderdispatch->lines) && count($supplierorderdispatch->lines)>0) { - //Build array with quantity deliverd by product - foreach($supplierorderdispatch->lines as $line) { - $qtydelivered[$line->fk_product]+=$line->qty; - } - foreach($this->lines as $line) { - $qtywished[$line->fk_product]+=$line->qty; - } - //Compare array - $diff_array=array_diff_assoc($qtydelivered,$qtywished); - if (count($diff_array)==0) { - //No diff => mean everythings is received - $ret=$this->setStatus($user,5); - if ($ret<0) { - $this->error=$object->error; $this->errors=$object->errors; - } - } else { - //Diff => received partially - $ret=$this->setStatus($user,4); - if ($ret<0) { - $this->error=$object->error; $this->errors=$object->errors; - } - } - } - } - - - return 1; - } - } } diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index cbcfd214f57..8494e160223 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -5,6 +5,7 @@ * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2010 Juanjo Menent * Copyright (C) 2014 Cedric Gross + * Copyright (C) 2016 Florian Henry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,19 +23,19 @@ */ /** - * \file htdocs/fourn/commande/dispatch.php - * \ingroup commande - * \brief Page to dispatch receiving + * \file htdocs/fourn/commande/dispatch.php + * \ingroup commande + * \brief Page to dispatch receiving */ - require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php'; -require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; -require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; -if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_order/modules_commandefournisseur.php'; +require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/fourn.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.commande.class.php'; +require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.commande.dispatch.class.php'; +require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; +if (! empty($conf->projet->enabled)) + require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php'; $langs->load('orders'); $langs->load('sendings'); @@ -43,170 +44,179 @@ $langs->load('bills'); $langs->load('deliveries'); $langs->load('products'); $langs->load('stocks'); -if (! empty($conf->productbatch->enabled)) $langs->load('productbatch'); +if (! empty($conf->productbatch->enabled)) + $langs->load('productbatch'); -// Security check -$id = GETPOST("id",'int'); + // Security check +$id = GETPOST("id", 'int'); +$ref = GETPOST('ref'); $lineid = GETPOST('lineid', 'int'); $action = GETPOST('action'); -if ($user->societe_id) $socid=$user->societe_id; +if ($user->societe_id) + $socid = $user->societe_id; $result = restrictedArea($user, 'fournisseur', $id, '', 'commande'); -if (empty($conf->stock->enabled)) -{ +if (empty($conf->stock->enabled)) { accessforbidden(); } -// Recuperation de l'id de projet -$projectid = 0; -if ($_GET["projectid"]) $projectid = GETPOST("projectid",'int'); - -$mesg=''; +// Recuperation de l'id de projet +$projectid = 0; +if ($_GET["projectid"]) + $projectid = GETPOST("projectid", 'int'); +$commande = new CommandeFournisseur($db); +if ($id > 0 || ! empty($ref)) { + $result = $commande->fetch($id, $ref); + if ($result < 0) { + setEventMessages($commande->error, $commande->errors, 'errors'); + } + $result = $commande->fetch_thirdparty(); + if ($result < 0) { + setEventMessages($commande->error, $commande->errors, 'errors'); + } +} /* * Actions */ -if ($action == 'checkdispatchline' && - ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) -) -{ +if ($action == 'checkdispatchline' && ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check)))) { $supplierorderdispatch = new CommandeFournisseurDispatch($db); - $result=$supplierorderdispatch->fetch($lineid); - if (! $result) dol_print_error($db); - $result=$supplierorderdispatch->setStatut(1); - if ($result < 0) - { + $result = $supplierorderdispatch->fetch($lineid); + if (! $result) + dol_print_error($db); + $result = $supplierorderdispatch->setStatut(1); + if ($result < 0) { setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors, 'errors'); - $error++; - $action=''; + $error ++; + $action = ''; + } else { + $result = $commande->calcAndSetStatusDispatch($user); + if ($result < 0) { + setEventMessages($commande->error, $commande->errors, 'errors'); + $error ++; + $action = ''; + } } } -if ($action == 'uncheckdispatchline' && - ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) -) -{ +if ($action == 'uncheckdispatchline' && ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check)))) { $supplierorderdispatch = new CommandeFournisseurDispatch($db); - $result=$supplierorderdispatch->fetch($lineid); - if (! $result) dol_print_error($db); - $result=$supplierorderdispatch->setStatut(0); - if ($result < 0) - { + $result = $supplierorderdispatch->fetch($lineid); + if (! $result) + dol_print_error($db); + $result = $supplierorderdispatch->setStatut(0); + if ($result < 0) { setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors, 'errors'); - $error++; - $action=''; + $error ++; + $action = ''; + } else { + $result = $commande->calcAndSetStatusDispatch($user); + if ($result < 0) { + setEventMessages($commande->error, $commande->errors, 'errors'); + $error ++; + $action = ''; + } } } -if ($action == 'denydispatchline' && - ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) -) -{ +if ($action == 'denydispatchline' && ! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check)))) { $supplierorderdispatch = new CommandeFournisseurDispatch($db); - $result=$supplierorderdispatch->fetch($lineid); - if (! $result) dol_print_error($db); - $result=$supplierorderdispatch->setStatut(2); - if ($result < 0) - { + $result = $supplierorderdispatch->fetch($lineid); + if (! $result) + dol_print_error($db); + $result = $supplierorderdispatch->setStatut(2); + if ($result < 0) { setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors, 'errors'); - $error++; - $action=''; + $error ++; + $action = ''; + } else { + $result = $commande->calcAndSetStatusDispatch($user); + if ($result < 0) { + setEventMessages($commande->error, $commande->errors, 'errors'); + $error ++; + $action = ''; + } } } -if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) -{ - $commande = new CommandeFournisseur($db); - $commande->fetch($id); - - $error=0; +if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) { + $error = 0; $db->begin(); - $pos=0; - foreach($_POST as $key => $value) - { - if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) // without batch module enabled - { - $pos++; + $pos = 0; + foreach ( $_POST as $key => $value ) { + // without batch module enabled + if (preg_match('/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) { + $pos ++; - //$numline=$reg[2] + 1; // line of product - $numline=$pos; - $prod = "product_".$reg[1].'_'.$reg[2]; - $qty = "qty_".$reg[1].'_'.$reg[2]; - $ent = "entrepot_".$reg[1].'_'.$reg[2]; - $pu = "pu_".$reg[1].'_'.$reg[2]; // This is unit price including discount - $fk_commandefourndet = "fk_commandefourndet_".$reg[1].'_'.$reg[2]; + // $numline=$reg[2] + 1; // line of product + $numline = $pos; + $prod = "product_" . $reg[1] . '_' . $reg[2]; + $qty = "qty_" . $reg[1] . '_' . $reg[2]; + $ent = "entrepot_" . $reg[1] . '_' . $reg[2]; + $pu = "pu_" . $reg[1] . '_' . $reg[2]; // This is unit price including discount + $fk_commandefourndet = "fk_commandefourndet_" . $reg[1] . '_' . $reg[2]; - if (GETPOST($qty) > 0) // We ask to move a qty - { - if (! (GETPOST($ent,'int') > 0)) - { - dol_syslog('No dispatch for line '.$key.' as no warehouse choosed'); - $text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline); - setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); - $error++; + // We ask to move a qty + if (GETPOST($qty) > 0) { + if (! (GETPOST($ent, 'int') > 0)) { + dol_syslog('No dispatch for line ' . $key . ' as no warehouse choosed'); + $text = $langs->transnoentities('Warehouse') . ', ' . $langs->transnoentities('Line') . ' ' . ($numline); + setEventMessages($langs->trans('ErrorFieldRequired', $text), null, 'errors'); + $error ++; } - if (! $error) - { - $result = $commande->dispatchProduct($user, GETPOST($prod,'int'), GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST('comment'), '', '', '', GETPOST($fk_commandefourndet, 'int'), $notrigger); - if ($result < 0) - { + if (! $error) { + $result = $commande->dispatchProduct($user, GETPOST($prod, 'int'), GETPOST($qty), GETPOST($ent, 'int'), GETPOST($pu), GETPOST('comment'), '', '', '', GETPOST($fk_commandefourndet, 'int'), $notrigger); + if ($result < 0) { setEventMessages($commande->error, $commande->errors, 'errors'); - $error++; + $error ++; } } } } - if (preg_match('/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) // with batch module enabled - { - $pos++; + // with batch module enabled + if (preg_match('/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) { + $pos ++; - //eat-by date dispatch - //$numline=$reg[2] + 1; // line of product - $numline=$pos; - $prod = 'product_batch_'.$reg[1].'_'.$reg[2]; - $qty = 'qty_'.$reg[1].'_'.$reg[2]; - $ent = 'entrepot_'.$reg[1].'_'.$reg[2]; - $pu = 'pu_'.$reg[1].'_'.$reg[2]; - $fk_commandefourndet = 'fk_commandefourndet_'.$reg[1].'_'.$reg[2]; - $lot = 'lot_number_'.$reg[1].'_'.$reg[2]; - $dDLUO = dol_mktime(12, 0, 0, $_POST['dluo_'.$reg[1].'_'.$reg[2].'month'], $_POST['dluo_'.$reg[1].'_'.$reg[2].'day'], $_POST['dluo_'.$reg[1].'_'.$reg[2].'year']); - $dDLC = dol_mktime(12, 0, 0, $_POST['dlc_'.$reg[1].'_'.$reg[2].'month'], $_POST['dlc_'.$reg[1].'_'.$reg[2].'day'], $_POST['dlc_'.$reg[1].'_'.$reg[2].'year']); + // eat-by date dispatch + // $numline=$reg[2] + 1; // line of product + $numline = $pos; + $prod = 'product_batch_' . $reg[1] . '_' . $reg[2]; + $qty = 'qty_' . $reg[1] . '_' . $reg[2]; + $ent = 'entrepot_' . $reg[1] . '_' . $reg[2]; + $pu = 'pu_' . $reg[1] . '_' . $reg[2]; + $fk_commandefourndet = 'fk_commandefourndet_' . $reg[1] . '_' . $reg[2]; + $lot = 'lot_number_' . $reg[1] . '_' . $reg[2]; + $dDLUO = dol_mktime(12, 0, 0, $_POST['dluo_' . $reg[1] . '_' . $reg[2] . 'month'], $_POST['dluo_' . $reg[1] . '_' . $reg[2] . 'day'], $_POST['dluo_' . $reg[1] . '_' . $reg[2] . 'year']); + $dDLC = dol_mktime(12, 0, 0, $_POST['dlc_' . $reg[1] . '_' . $reg[2] . 'month'], $_POST['dlc_' . $reg[1] . '_' . $reg[2] . 'day'], $_POST['dlc_' . $reg[1] . '_' . $reg[2] . 'year']); - $fk_commandefourndet = 'fk_commandefourndet_'.$reg[1].'_'.$reg[2]; + $fk_commandefourndet = 'fk_commandefourndet_' . $reg[1] . '_' . $reg[2]; - if (GETPOST($qty) > 0) // We ask to move a qty - { - if (! (GETPOST($ent,'int') > 0)) - { - dol_syslog('No dispatch for line '.$key.' as no warehouse choosed'); - $text = $langs->transnoentities('Warehouse').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1); - setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); - $error++; + // We ask to move a qty + if (GETPOST($qty) > 0) { + if (! (GETPOST($ent, 'int') > 0)) { + dol_syslog('No dispatch for line ' . $key . ' as no warehouse choosed'); + $text = $langs->transnoentities('Warehouse') . ', ' . $langs->transnoentities('Line') . ' ' . ($numline) . '-' . ($reg[1] + 1); + setEventMessages($langs->trans('ErrorFieldRequired', $text), null, 'errors'); + $error ++; } - if (! (GETPOST($lot, 'alpha') || $dDLUO || $dDLC)) - { - dol_syslog('No dispatch for line '.$key.' as serial/eat-by/sellby date are not set'); - $text = $langs->transnoentities('atleast1batchfield').', '.$langs->transnoentities('Line').' ' .($numline).'-'.($reg[1]+1); - setEventMessages($langs->trans('ErrorFieldRequired',$text), null, 'errors'); - $error++; + if (! (GETPOST($lot, 'alpha') || $dDLUO || $dDLC)) { + dol_syslog('No dispatch for line ' . $key . ' as serial/eat-by/sellby date are not set'); + $text = $langs->transnoentities('atleast1batchfield') . ', ' . $langs->transnoentities('Line') . ' ' . ($numline) . '-' . ($reg[1] + 1); + setEventMessages($langs->trans('ErrorFieldRequired', $text), null, 'errors'); + $error ++; } - if (! $error) - { - $result = $commande->dispatchProduct($user, GETPOST($prod,'int'), GETPOST($qty), GETPOST($ent,'int'), GETPOST($pu), GETPOST('comment'), $dDLC, $dDLUO, GETPOST($lot, 'alpha'), GETPOST($fk_commandefourndet, 'int'), $notrigger); - if ($result < 0) - { + if (! $error) { + $result = $commande->dispatchProduct($user, GETPOST($prod, 'int'), GETPOST($qty), GETPOST($ent, 'int'), GETPOST($pu), GETPOST('comment'), $dDLC, $dDLUO, GETPOST($lot, 'alpha'), GETPOST($fk_commandefourndet, 'int'), $notrigger); + if ($result < 0) { setEventMessages($commande->error, $commande->errors, 'errors'); - $error++; + $error ++; } } } @@ -215,542 +225,470 @@ if ($action == 'dispatch' && $user->rights->fournisseur->commande->receptionner) if (! $error) { $result = $commande->calcAndSetStatusDispatch($user); - if ($result < 0) - { + if ($result < 0) { setEventMessages($commande->error, $commande->errors, 'errors'); - $error++; + $error ++; } } - if (! $notrigger && ! $error) - { + if (! $notrigger && ! $error) { global $conf, $langs, $user; - // Call trigger + // Call trigger - $result = $commande->call_trigger('ORDER_SUPPLIER_DISPATCH', $user); - // End call triggers + $result = $commande->call_trigger('ORDER_SUPPLIER_DISPATCH', $user); + // End call triggers - if ($result < 0) - { + if ($result < 0) { setEventMessages($commande->error, $commande->errors, 'errors'); - $error++; + $error ++; } } - if ($result >= 0 && ! $error) - { + if ($result >= 0 && ! $error) { $db->commit(); - header("Location: dispatch.php?id=".$id); - exit; - } - else - { + header("Location: dispatch.php?id=" . $id); + exit(); + } else { $db->rollback(); } } - /* * View */ -$form = new Form($db); +$form = new Form($db); $formproduct = new FormProduct($db); $warehouse_static = new Entrepot($db); $supplierorderdispatch = new CommandeFournisseurDispatch($db); +$help_url = 'EN:CommandeFournisseur'; +llxHeader('', $langs->trans("OrderCard"), $help_url, '', 0, 0, array( + '/fourn/js/lib_dispatch.js' +)); -$help_url='EN:CommandeFournisseur'; -llxHeader('',$langs->trans("OrderCard"),$help_url,'',0,0,array('/fourn/js/lib_dispatch.js')); +$now = dol_now(); -$now=dol_now(); +if ($id > 0 || ! empty($ref)) { + $soc = new Societe($db); + $soc->fetch($commande->socid); -$id = GETPOST('id','int'); -$ref= GETPOST('ref'); -if ($id > 0 || ! empty($ref)) -{ - //if ($mesg) print $mesg.'
'; + $author = new User($db); + $author->fetch($commande->user_author_id); - $commande = new CommandeFournisseur($db); + $head = ordersupplier_prepare_head($commande); - $result=$commande->fetch($id,$ref); - if ($result >= 0) - { - $soc = new Societe($db); - $soc->fetch($commande->socid); + $title = $langs->trans("SupplierOrder"); + dol_fiche_head($head, 'dispatch', $title, 0, 'order'); - $author = new User($db); - $author->fetch($commande->user_author_id); + /* + * Commande + */ + print ''; - $head = ordersupplier_prepare_head($commande); + // Ref + print ''; + print ''; + print ''; - $title=$langs->trans("SupplierOrder"); - dol_fiche_head($head, 'dispatch', $title, 0, 'order'); + // Fournisseur + print '"; + print ''; + print ''; - /* - * Commande - */ - print '
' . $langs->trans("Ref") . ''; + print $form->showrefnav($commande, 'ref', '', 1, 'ref', 'ref'); + print '
' . $langs->trans("Supplier") . "' . $soc->getNomUrl(1, 'supplier') . '
'; + // Statut + print ''; + print ''; + print '"; - // Ref - print ''; - print ''; - print ''; - - // Fournisseur - print '"; - print ''; - print ''; - - // Statut - print ''; - print ''; - print '"; - // Date - if ($commande->methode_commande_id > 0) - { - print '"; - - if ($commande->methode_commande) - { - print ''; - } + if ($commande->methode_commande) { + print ''; } + } - // Auteur - print ''; - print ''; - print ''; + // Auteur + print ''; + print ''; + print ''; - print "
' . $langs->trans("Status") . ''; + print $commande->getLibStatut(4); + print "
'.$langs->trans("Ref").''; - print $form->showrefnav($commande,'ref','',1,'ref','ref'); - print '
'.$langs->trans("Supplier")."'.$soc->getNomUrl(1,'supplier').'
'.$langs->trans("Status").''; - print $commande->getLibStatut(4); + // Date + if ($commande->methode_commande_id > 0) { + print '
' . $langs->trans("Date") . ''; + if ($commande->date_commande) { + print dol_print_date($commande->date_commande, "dayhourtext") . "\n"; + } print "
'.$langs->trans("Date").''; - if ($commande->date_commande) - { - print dol_print_date($commande->date_commande,"dayhourtext")."\n"; - } - print "
'.$langs->trans("Method").''.$commande->methode_commande.'
' . $langs->trans("Method") . '' . $commande->methode_commande . '
'.$langs->trans("AuthorRequest").''.$author->getNomUrl(1).'
' . $langs->trans("AuthorRequest") . '' . $author->getNomUrl(1) . '
"; + print ""; - //if ($mesg) print $mesg; - print '
'; + // if ($mesg) print $mesg; + print '
'; - - $disabled=1; - if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) $disabled=0; + $disabled = 1; + if (! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) + $disabled = 0; /* - * Lignes de commandes - */ - if ($commande->statut <= 2 || $commande->statut >= 6) - { - print $langs->trans("OrderStatusNotReadyToDispatch"); - } + * Lignes de commandes + */ + if ($commande->statut <= 2 || $commande->statut >= 6) { + print $langs->trans("OrderStatusNotReadyToDispatch"); + } - if ($commande->statut == 3 || $commande->statut == 4 || $commande->statut == 5) - { - $entrepot = new Entrepot($db); - $listwarehouses=$entrepot->list_array(1); + if ($commande->statut == 3 || $commande->statut == 4 || $commande->statut == 5) { + $entrepot = new Entrepot($db); + $listwarehouses = $entrepot->list_array(1); - print '
'; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print '
'; - // Set $products_dispatched with qty dispatched for each product id - $products_dispatched = array(); - $sql = "SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty"; - $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."commande_fournisseurdet as l on l.rowid = cfd.fk_commandefourndet"; - $sql.= " WHERE cfd.fk_commande = ".$commande->id; - $sql.= " GROUP BY l.rowid, cfd.fk_product"; - - $resql = $db->query($sql); - if ($resql) - { - $num = $db->num_rows($resql); - $i = 0; - - if ($num) - { - while ($i < $num) - { - $objd = $db->fetch_object($resql); - $products_dispatched[$objd->rowid] = price2num($objd->qty, 5); - $i++; - } - } - $db->free($resql); - } - - $sql = "SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, SUM(l.qty) as qty,"; - $sql.= " p.ref, p.label, p.tobatch"; - $sql.= " FROM ".MAIN_DB_PREFIX."commande_fournisseurdet as l"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON l.fk_product=p.rowid"; - $sql.= " WHERE l.fk_commande = ".$commande->id; - if(empty($conf->global->STOCK_SUPPORTS_SERVICES)) $sql.= " AND l.product_type = 0"; - $sql.= " GROUP BY p.ref, p.label, p.tobatch, l.rowid, l.fk_product, l.subprice, l.remise_percent"; // Calculation of amount dispatched is done per fk_product so we must group by fk_product - $sql.= " ORDER BY p.ref, p.label"; - - $resql = $db->query($sql); - if ($resql) - { - $num = $db->num_rows($resql); - $i = 0; - - if ($num) - { - print ''; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "\n"; - - if (! empty($conf->productbatch->enabled)) - { - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "\n"; - } - - } - - $nbfreeproduct=0; - $nbproduct=0; - - $var=false; - while ($i < $num) - { - $objp = $db->fetch_object($resql); - - // On n'affiche pas les produits personnalises - if (! $objp->fk_product > 0) - { - $nbfreeproduct++; - } - else - { - $remaintodispatch=price2num($objp->qty - ((float) $products_dispatched[$objp->rowid]), 5); // Calculation of dispatched - if ($remaintodispatch < 0) $remaintodispatch=0; - - if ($remaintodispatch || empty($conf->global->SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED)) - { - $nbproduct++; - - $var=!$var; - - // To show detail cref and description value, we must make calculation by cref - //print ($objp->cref?' ('.$objp->cref.')':''); - //if ($objp->description) print '
'.nl2br($objp->description); - $suffix='_0_'.$i; - - print "\n"; - print ''."\n"; - print ""; - - $linktoprod=''.img_object($langs->trans("ShowProduct"),'product').' '.$objp->ref.''; - $linktoprod.=' - '.$objp->label."\n"; - - if (! empty($conf->productbatch->enabled)) - { - if ($objp->tobatch) - { - print '"; - } - else - { - print '"; - print ''; - } - } - else - { - print '"; - } - - $var=!$var; - $up_ht_disc=$objp->subprice; - if (! empty($objp->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) $up_ht_disc=price2num($up_ht_disc * (100 - $objp->remise_percent) / 100, 'MU'); - - // Qty ordered - print ''; - - // Already dispatched - print ''; - - if (! empty($conf->productbatch->enabled) && $objp->tobatch==1) - { - $type = 'batch'; - print ''; // Dispatch column - print ''; // Warehouse column - print ''; - - print ''; - print ''; - - print ''; - print ''; - print ''; - print ''; // Qty ordered + qty already dispatached - } - else - { - $type = 'dispatch'; - print ''; // Dispatch column - print ''; - print ''; - print ''; - print ''; - } - // Dispatch - print ''; - - // Warehouse - print '\n"; - - print "\n"; - } - } - $i++; - } - $db->free($resql); - } - else - { - dol_print_error($db); - } - - print "
'.$langs->trans("Description").''.$langs->trans("QtyOrdered").''.$langs->trans("QtyDispatchedShort").''.$langs->trans("QtyToDispatchShort").''.$langs->trans("Warehouse").'
'.$langs->trans("batch_number").''.$langs->trans("l_eatby").''.$langs->trans("l_sellby").' 
'; - print $linktoprod; - print "'; - print $linktoprod; - print "'; - print $langs->trans("ProductDoesNotUseBatchSerial"); - print ''; - print $linktoprod; - print "'.$objp->qty.''.$products_dispatched[$objp->rowid].''.img_picto($langs->trans('AddDispatchBatchLine'),'split.png','onClick="addDispatchLine('.$i.',\''.$type.'\')"').'
'; - print ''; - print ''; - print ''; - // hidden fields for js function - print ''; - print ''; - print ''; - print ''; - print ''; - $dlcdatesuffix=dol_mktime(0, 0, 0, GETPOST('dlc'.$suffix.'month'), GETPOST('dlc'.$suffix.'day'), GETPOST('dlc'.$suffix.'year')); - $form->select_date($dlcdatesuffix,'dlc'.$suffix,'','',1,""); - print ''; - $dluodatesuffix=dol_mktime(0, 0, 0, GETPOST('dluo'.$suffix.'month'), GETPOST('dluo'.$suffix.'day'), GETPOST('dluo'.$suffix.'year')); - $form->select_date($dluodatesuffix,'dluo'.$suffix,'','',1,""); - print ' '.img_picto($langs->trans('AddStockLocationLine'),'split.png','onClick="addDispatchLine('.$i.',\''.$type.'\')"').'
'; - print ''; - print ''; - print ''; - // hidden fields for js function - print ''; - print ''; - print ''; - print ''; - print ''; - if (count($listwarehouses)>1) - { - print $formproduct->selectWarehouses(GETPOST("entrepot".$suffix), "entrepot".$suffix,'',1,0,$objp->fk_product); - } - elseif (count($listwarehouses)==1) - { - print $formproduct->selectWarehouses(GETPOST("entrepot".$suffix), "entrepot".$suffix,'',0,0,$objp->fk_product); - } - else - { - print $langs->trans("NoWarehouseDefined"); - } - print "
\n"; - print "
\n"; - - if ($nbproduct) - { - print $langs->trans("Comment").' : '; - print 'trans("DispatchSupplierOrder",$commande->ref); - // print ' / '.$commande->ref_supplier; // Not yet available - print '" class="flat">   '; - - //print '
'; - print ''; - //print '
'; - } - if (! $nbproduct && $nbfreeproduct) - { - print $langs->trans("NoPredefinedProductToDispatch"); - } - - print '
'; - } - - dol_fiche_end(); - - - // List of lines already dispatched - $sql = "SELECT p.ref, p.label,"; - $sql.= " e.rowid as warehouse_id, e.label as entrepot,"; - $sql.= " cfd.rowid as dispatchlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status"; - $sql.= " FROM ".MAIN_DB_PREFIX."product as p,"; - $sql.= " ".MAIN_DB_PREFIX."commande_fournisseur_dispatch as cfd"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e ON cfd.fk_entrepot = e.rowid"; - $sql.= " WHERE cfd.fk_commande = ".$commande->id; - $sql.= " AND cfd.fk_product = p.rowid"; - $sql.= " ORDER BY cfd.rowid ASC"; + // Set $products_dispatched with qty dispatched for each product id + $products_dispatched = array(); + $sql = "SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty"; + $sql .= " FROM " . MAIN_DB_PREFIX . "commande_fournisseur_dispatch as cfd"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "commande_fournisseurdet as l on l.rowid = cfd.fk_commandefourndet"; + $sql .= " WHERE cfd.fk_commande = " . $commande->id; + $sql .= " GROUP BY l.rowid, cfd.fk_product"; $resql = $db->query($sql); - if ($resql) - { + if ($resql) { $num = $db->num_rows($resql); $i = 0; - if ($num > 0) - { - print "
\n"; - - print load_fiche_titre($langs->trans("ReceivingForSameOrder")); - - print ''; - - print ''; - print ''; - if (! empty($conf->productbatch->enabled)) - { - print ''; - print ''; - print ''; + if ($num) { + while ( $i < $num ) { + $objd = $db->fetch_object($resql); + $products_dispatched[$objd->rowid] = price2num($objd->qty, 5); + $i ++; } - print ''; + } + $db->free($resql); + } + + $sql = "SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, SUM(l.qty) as qty,"; + $sql .= " p.ref, p.label, p.tobatch"; + $sql .= " FROM " . MAIN_DB_PREFIX . "commande_fournisseurdet as l"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON l.fk_product=p.rowid"; + $sql .= " WHERE l.fk_commande = " . $commande->id; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) + $sql .= " AND l.product_type = 0"; + $sql .= " GROUP BY p.ref, p.label, p.tobatch, l.rowid, l.fk_product, l.subprice, l.remise_percent"; // Calculation of amount dispatched is done per fk_product so we must group by fk_product + $sql .= " ORDER BY p.ref, p.label"; + + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + if ($num) { + print ''; + + print ''; print ''; - print ''; - print ''; - if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print "\n"; - $var=false; - - while ($i < $num) - { - $objp = $db->fetch_object($resql); - - print ""; - print '\n"; - - if (! empty($conf->productbatch->enabled)) - { - print ''; - print ''; - print ''; - } - - // Qty - print ''; - print ''; - - // Warehouse - print ''; - - // Comment - print ''; - - // Status - if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) - { - print ''; - - // Add button to check/uncheck disaptching - print ''; - } - + if (! empty($conf->productbatch->enabled)) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print "\n"; - - $i++; - $var=!$var; } - $db->free($resql); - - print "
'.$langs->trans("Description").''.$langs->trans("batch_number").''.$langs->trans("l_eatby").''.$langs->trans("l_sellby").''.$langs->trans("QtyDispatched").'
' . $langs->trans("Description") . ''.$langs->trans("Warehouse").''.$langs->trans("Comment").''.$langs->trans("Status").'' . $langs->trans("QtyOrdered") . '' . $langs->trans("QtyDispatchedShort") . '' . $langs->trans("QtyToDispatchShort") . '' . $langs->trans("Warehouse") . '
'; - print ''.img_object($langs->trans("ShowProduct"),'product').' '.$objp->ref.''; - print ' - '.$objp->label; - print "'.$objp->batch.''.dol_print_date($db->jdate($objp->eatby),'day').''.dol_print_date($db->jdate($objp->sellby),'day').''.$objp->qty.' '; - $warehouse_static->id=$objp->warehouse_id; - $warehouse_static->libelle=$objp->entrepot; - print $warehouse_static->getNomUrl(1); - print ''.dol_trunc($objp->comment).''; - $supplierorderdispatch->status = (empty($objp->status)?0:$objp->status); - //print $supplierorderdispatch->status; - print $supplierorderdispatch->getLibStatut(5); - print ''; - if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) - || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check)) - ) - { - if (empty($objp->status)) - { - print ''.$langs->trans("Approve").''; - print ''.$langs->trans("Deny").''; - } - else - { - print ''.$langs->trans("Disapprove").''; - print ''.$langs->trans("Deny").''; - } - } - else - { - $disabled=''; - if ($commande->statut == 5) $disabled=1; - if (empty($objp->status)) - { - print 'dispatchlineid.'">'.$langs->trans("Approve").''; - print 'dispatchlineid.'">'.$langs->trans("Deny").''; - } - if ($objp->status == 1) - { - print 'dispatchlineid.'">'.$langs->trans("Reinit").''; - print 'dispatchlineid.'">'.$langs->trans("Deny").''; - } - if ($objp->status == 2) - { - print 'dispatchlineid.'">'.$langs->trans("Reinit").''; - print 'dispatchlineid.'">'.$langs->trans("Approve").''; - } - } - print '
' . $langs->trans("batch_number") . '' . $langs->trans("l_eatby") . '' . $langs->trans("l_sellby") . ' 
\n"; } - } - else - { + + $nbfreeproduct = 0; + $nbproduct = 0; + + $var = false; + while ( $i < $num ) { + $objp = $db->fetch_object($resql); + + // On n'affiche pas les produits personnalises + if (! $objp->fk_product > 0) { + $nbfreeproduct ++; + } else { + $remaintodispatch = price2num($objp->qty - (( float ) $products_dispatched[$objp->rowid]), 5); // Calculation of dispatched + if ($remaintodispatch < 0) + $remaintodispatch = 0; + + if ($remaintodispatch || empty($conf->global->SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED)) { + $nbproduct ++; + + $var = ! $var; + + // To show detail cref and description value, we must make calculation by cref + // print ($objp->cref?' ('.$objp->cref.')':''); + // if ($objp->description) print '
'.nl2br($objp->description); + $suffix = '_0_' . $i; + + print "\n"; + print '' . "\n"; + print ""; + + $linktoprod = '' . img_object($langs->trans("ShowProduct"), 'product') . ' ' . $objp->ref . ''; + $linktoprod .= ' - ' . $objp->label . "\n"; + + if (! empty($conf->productbatch->enabled)) { + if ($objp->tobatch) { + print ''; + print $linktoprod; + print ""; + } else { + print ''; + print $linktoprod; + print ""; + print ''; + print $langs->trans("ProductDoesNotUseBatchSerial"); + print ''; + } + } else { + print ''; + print $linktoprod; + print ""; + } + + $var = ! $var; + $up_ht_disc = $objp->subprice; + if (! empty($objp->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) + $up_ht_disc = price2num($up_ht_disc * (100 - $objp->remise_percent) / 100, 'MU'); + + // Qty ordered + print '' . $objp->qty . ''; + + // Already dispatched + print '' . $products_dispatched[$objp->rowid] . ''; + + if (! empty($conf->productbatch->enabled) && $objp->tobatch == 1) { + $type = 'batch'; + print '' . img_picto($langs->trans('AddDispatchBatchLine'), 'split.png', 'onClick="addDispatchLine(' . $i . ',\'' . $type . '\')"') . ''; // Dispatch column + print ''; // Warehouse column + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + // hidden fields for js function + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + $dlcdatesuffix = dol_mktime(0, 0, 0, GETPOST('dlc' . $suffix . 'month'), GETPOST('dlc' . $suffix . 'day'), GETPOST('dlc' . $suffix . 'year')); + $form->select_date($dlcdatesuffix, 'dlc' . $suffix, '', '', 1, ""); + print ''; + print ''; + $dluodatesuffix = dol_mktime(0, 0, 0, GETPOST('dluo' . $suffix . 'month'), GETPOST('dluo' . $suffix . 'day'), GETPOST('dluo' . $suffix . 'year')); + $form->select_date($dluodatesuffix, 'dluo' . $suffix, '', '', 1, ""); + print ''; + print ' '; // Qty ordered + qty already dispatached + } else { + $type = 'dispatch'; + print '' . img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'onClick="addDispatchLine(' . $i . ',\'' . $type . '\')"') . ''; // Dispatch column + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + // hidden fields for js function + print ''; + print ''; + print ''; + } + // Dispatch + print ''; + print ''; + print ''; + + // Warehouse + print ''; + if (count($listwarehouses) > 1) { + print $formproduct->selectWarehouses(GETPOST("entrepot" . $suffix), "entrepot" . $suffix, '', 1, 0, $objp->fk_product); + } elseif (count($listwarehouses) == 1) { + print $formproduct->selectWarehouses(GETPOST("entrepot" . $suffix), "entrepot" . $suffix, '', 0, 0, $objp->fk_product); + } else { + print $langs->trans("NoWarehouseDefined"); + } + print "\n"; + + print "\n"; + } + } + $i ++; + } + $db->free($resql); + } else { dol_print_error($db); } + + print "\n"; + print "
\n"; + + if ($nbproduct) { + print $langs->trans("Comment") . ' : '; + print 'trans("DispatchSupplierOrder", $commande->ref); + // print ' / '.$commande->ref_supplier; // Not yet available + print '" class="flat">   '; + + // print '
'; + print ''; + // print '
'; + } + if (! $nbproduct && $nbfreeproduct) { + print $langs->trans("NoPredefinedProductToDispatch"); + } + + print ''; } - else - { - // Commande non trouvee + + dol_fiche_end(); + + // List of lines already dispatched + $sql = "SELECT p.ref, p.label,"; + $sql .= " e.rowid as warehouse_id, e.label as entrepot,"; + $sql .= " cfd.rowid as dispatchlineid, cfd.fk_product, cfd.qty, cfd.eatby, cfd.sellby, cfd.batch, cfd.comment, cfd.status"; + $sql .= " FROM " . MAIN_DB_PREFIX . "product as p,"; + $sql .= " " . MAIN_DB_PREFIX . "commande_fournisseur_dispatch as cfd"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "entrepot as e ON cfd.fk_entrepot = e.rowid"; + $sql .= " WHERE cfd.fk_commande = " . $commande->id; + $sql .= " AND cfd.fk_product = p.rowid"; + $sql .= " ORDER BY cfd.rowid ASC"; + + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + + if ($num > 0) { + print "
\n"; + + print load_fiche_titre($langs->trans("ReceivingForSameOrder")); + + print ''; + + print ''; + print ''; + if (! empty($conf->productbatch->enabled)) { + print ''; + print ''; + print ''; + } + print ''; + print ''; + print ''; + print ''; + if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) + print ''; + print "\n"; + + $var = false; + + while ( $i < $num ) { + $objp = $db->fetch_object($resql); + + print ""; + print '\n"; + + if (! empty($conf->productbatch->enabled)) { + print ''; + print ''; + print ''; + } + + // Qty + print ''; + print ''; + + // Warehouse + print ''; + + // Comment + print ''; + + // Status + if (! empty($conf->global->SUPPLIER_ORDER_USE_DISPATCH_STATUS)) { + print ''; + + // Add button to check/uncheck disaptching + print ''; + } + + print "\n"; + + $i ++; + $var = ! $var; + } + $db->free($resql); + + print "
' . $langs->trans("Description") . '' . $langs->trans("batch_number") . '' . $langs->trans("l_eatby") . '' . $langs->trans("l_sellby") . '' . $langs->trans("QtyDispatched") . '' . $langs->trans("Warehouse") . '' . $langs->trans("Comment") . '' . $langs->trans("Status") . '
'; + print '' . img_object($langs->trans("ShowProduct"), 'product') . ' ' . $objp->ref . ''; + print ' - ' . $objp->label; + print "' . $objp->batch . '' . dol_print_date($db->jdate($objp->eatby), 'day') . '' . dol_print_date($db->jdate($objp->sellby), 'day') . '' . $objp->qty . ' '; + $warehouse_static->id = $objp->warehouse_id; + $warehouse_static->libelle = $objp->entrepot; + print $warehouse_static->getNomUrl(1); + print '' . dol_trunc($objp->comment) . ''; + $supplierorderdispatch->status = (empty($objp->status) ? 0 : $objp->status); + // print $supplierorderdispatch->status; + print $supplierorderdispatch->getLibStatut(5); + print ''; + if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande->receptionner)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->fournisseur->commande_advance->check))) { + if (empty($objp->status)) { + print '' . $langs->trans("Approve") . ''; + print '' . $langs->trans("Deny") . ''; + } else { + print '' . $langs->trans("Disapprove") . ''; + print '' . $langs->trans("Deny") . ''; + } + } else { + $disabled = ''; + if ($commande->statut == 5) + $disabled = 1; + if (empty($objp->status)) { + print 'dispatchlineid . '">' . $langs->trans("Approve") . ''; + print 'dispatchlineid . '">' . $langs->trans("Deny") . ''; + } + if ($objp->status == 1) { + print 'dispatchlineid . '">' . $langs->trans("Reinit") . ''; + print 'dispatchlineid . '">' . $langs->trans("Deny") . ''; + } + if ($objp->status == 2) { + print 'dispatchlineid . '">' . $langs->trans("Reinit") . ''; + print 'dispatchlineid . '">' . $langs->trans("Approve") . ''; + } + } + print '
\n"; + } + } else { dol_print_error($db); } } - llxFooter(); $db->close();