diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index e2648b257e4f3a9660a0ca295e691337e4ba8aa2..21f012afa813f994fa0b8b51f70b60382335ca35 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -54,6 +54,7 @@ CanceledBy=Canceled by %s ClosedBy=Closed by %s FileWasRemoved=File was deleted DirWasRemoved=Directory was removed +FeatureNotYetAvailableShort=Available in a next version FeatureNotYetAvailable=Feature not yet available in this version FeatureExperimental=Experimental feature. Not stable in this version FeatureDevelopment=Development feature. Not stable in this version diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index b1303c96169ac99510b8a28a9eb2071195e99d68..05958d2bf33cd98e333a815fd78d2b50f5d6d65c 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -34,6 +34,7 @@ NumberOfUnit=Number of units TotalStock=Total in stock StockTooLow=Stock too low EnhancedValue=Value +PMPValue=Value EnhancedValueOfWarehouses=Warehouses value UserWarehouseAutoCreate=Create a stock automatically when creating a user QtyDispatched=Quantity dispatched diff --git a/htdocs/langs/fr_FR/other.lang b/htdocs/langs/fr_FR/other.lang index 432417a04a6b79c7e6f02843870314a2c82db655..f7c4fd783560ed8a110ee17eedf7245be8156af8 100644 --- a/htdocs/langs/fr_FR/other.lang +++ b/htdocs/langs/fr_FR/other.lang @@ -54,6 +54,7 @@ CanceledBy=Annul ClosedBy=Clotur� par %s FileWasRemoved=Le fichier a �t� supprim� DirWasRemoved=Le r�pertoire a �t� supprim� +FeatureNotYetAvailableShort=Disponible dans une prochaine version FeatureNotYetAvailable=Fonctionnalit� pas encore disponible dans cette version FeatureExperimental=Fonctionnalit� exp�rimentale. Non stable dans cette version FeatureDevelopment=Fonctionnalit� en d�veloppement. Non stable dans cette version diff --git a/htdocs/langs/fr_FR/stocks.lang b/htdocs/langs/fr_FR/stocks.lang index 1f99d60ae31a226728647e316f4a9221ca8b3d77..3e61885cd1c04207dfbb2e565861ea23ac7803a0 100644 --- a/htdocs/langs/fr_FR/stocks.lang +++ b/htdocs/langs/fr_FR/stocks.lang @@ -34,6 +34,7 @@ NumberOfUnit=Nombre de pi TotalStock=Total en stock StockTooLow=Stock insuffisant EnhancedValue=Valorisation +PMPValue=Valorisation (PMP) EnhancedValueOfWarehouses=Valorisation des stocks UserWarehouseAutoCreate=Cr�er un stock automatiquement � la cr�ation d'un utilisateur QtyDispatched=Quantit� ventil�e diff --git a/htdocs/product/stock/fiche.php b/htdocs/product/stock/fiche.php index 1dcbb48d93ce7f1037db79410010df8d0b9fb363..8857e6a863c728eb2ab41b285b9a6ccb0933c144 100644 --- a/htdocs/product/stock/fiche.php +++ b/htdocs/product/stock/fiche.php @@ -265,11 +265,13 @@ else // Statut print '<tr><td>'.$langs->trans("Status").'</td><td colspan="3">'.$entrepot->getLibStatut(4).'</td></tr>'; + // Nb of products print '<tr><td valign="top">'.$langs->trans("NumberOfProducts").'</td><td colspan="3">'; - print $entrepot->nb_products(); + $nb=$entrepot->nb_products(); + print empty($nb)?'0':$nb; print "</td></tr>"; - // Dernier mouvement + // Last movement $sql = "SELECT max( ".$db->pdate("m.datem").") as datem"; $sql .= " FROM llx_stock_mouvement as m"; $sql .= " WHERE m.fk_entrepot = '".$entrepot->id."';"; @@ -320,12 +322,14 @@ else print_liste_field_titre($langs->trans("Product"),"", "p.ref","&id=".$_GET['id'],"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Label"),"", "p.label","&id=".$_GET['id'],"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Units"),"", "ps.reel","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("PMP"),"", "ps.pmp","&id=".$_GET['id'],"",'align="center"',$sortfield,$sortorder); if ($user->rights->stock->mouvement->creer) print '<td> </td>'; if ($user->rights->stock->creer) print '<td> </td>'; print "</tr>"; - $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, ps.reel as value "; - $sql .= " FROM ".MAIN_DB_PREFIX."product_stock ps, ".MAIN_DB_PREFIX."product p "; + $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit,"; + $sql.= " ps.reel as value"; + $sql.= " FROM ".MAIN_DB_PREFIX."product_stock ps, ".MAIN_DB_PREFIX."product p "; if ($conf->categorie->enabled && !$user->rights->categorie->voir) { $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON cp.fk_product = p.rowid"; @@ -375,8 +379,11 @@ else print img_object($langs->trans("ShowProduct"),"product").' '.$objp->ref; print "</a></td>"; print '<td>'.$objp->produit.'</td>'; + print '<td align="right">'.$objp->value.'</td>'; - + + print '<td align="center">'.$langs->trans("FeatureNotYetAvailableShort").'</td>'; + if ($user->rights->stock->mouvement->creer) { print '<td align="center"><a href="'.DOL_URL_ROOT.'/product/stock/product.php?dwid='.$entrepot->id.'&id='.$objp->rowid.'&action=transfert">'; diff --git a/htdocs/product/stock/mouvementstock.class.php b/htdocs/product/stock/mouvementstock.class.php index 72e1aae3d8f5cccd7773637f6ec5c3c0345ac4c2..98f585ce492d9557d5ab04fe45c995df49c6331b 100644 --- a/htdocs/product/stock/mouvementstock.class.php +++ b/htdocs/product/stock/mouvementstock.class.php @@ -45,7 +45,7 @@ class MouvementStock function _create($user, $fk_product, $entrepot_id, $qty, $type, $price=0) { global $conf; - + $error = 0; dolibarr_syslog("MouvementStock::_Create $user->id, $fk_product, $entrepot_id, qty=$qty, type=$type, $price"); @@ -59,7 +59,7 @@ class MouvementStock $sql.= " (datem, fk_product, fk_entrepot, value, type_mouvement, fk_user_author, price)"; $sql.= " VALUES (".$this->db->idate(mktime()).", ".$fk_product.", ".$entrepot_id.", ".$qty.", ".$type.", ".$user->id; $sql.= ",'".price2num($price)."')"; - + dolibarr_syslog("MouvementStock::_create sql=".$sql, LOG_DEBUG); if ($resql = $this->db->query($sql)) { @@ -70,8 +70,8 @@ class MouvementStock dolibarr_syslog("MouvementStock::_Create ".$this->error); $error = -1; } - - // Get current value of stock + + // Test if there is already a record for couple (warehouse / product) $num = 0; if ($error == 0) { @@ -108,7 +108,9 @@ class MouvementStock dolibarr_syslog("MouvementStock::_Create sql=".$sql, LOG_DEBUG); if ($this->db->query($sql)) { - + // TODO + // Update value of PMP in product_stock + } else { @@ -117,24 +119,26 @@ class MouvementStock } } + /* if ($error == 0) { $valo_mouvement = 0; $error = $this->CalculateValoPmp($mvid, $fk_product, $qty, $price, $valo_mouvement); } - + if ($error == 0) { $error = $this->CalculateEntrepotValoPmp($user, $entrepot_id, $valo_mouvement); } + */ } - - // Add movement for sub products + + // Add movement for sub products if ($error == 0 && $conf->global->PRODUIT_SOUSPRODUITS) { $error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, $price=0); } - + // composition module if ($error == 0 && $qty < 0 && $conf->global->MAIN_MODULE_COMPOSITION) { @@ -157,7 +161,7 @@ class MouvementStock /** - * \brief Create movement in databse for all subproducts + * \brief Create movement in database for all subproducts * \return int <0 si ko, 0 si ok */ function _createSubProduct($user, $idProduct, $entrepot_id, $qty, $type, $price=0) @@ -198,52 +202,93 @@ class MouvementStock return $error; } + + /** + * \brief Cr�e un mouvement en base pour toutes les compositions de produits + * \return int <0 si ko, 0 si ok + */ + function _createProductComposition($user, $fk_product, $entrepot_id, $qty, $type, $price=0) + { + + + dolibarr_syslog("MouvementStock::_createComposition $user->id, $fk_product, $entrepot_id, $qty, $type, $price"); + $products_compo = array(); + + $sql = "SELECT fk_product_composition, qte, etat_stock"; + $sql.= " FROM ".MAIN_DB_PREFIX."product_composition"; + $sql.= " WHERE fk_product = $fk_product;"; + + $all = $this->db->query($sql); + + if ($all) + { + while($item = $this->db->fetch_object($all) ) + { + if($item->etat_stock != 0) array_push($products_compo,$item); + } + $this->db->free($resql); + } + else + { + dolibarr_syslog("MouvementStock::_Create echec update ".$this->error); + return -1; + } + + foreach($products_compo as $product) + { + $this->_create($user, $product->fk_product_composition, $entrepot_id, ($qty*$product->qte), $type, $price=0); + } + + return 0; + } + + + /** + * \brief Decrease stock for product and subproducts + * \return int <0 if KO, >0 if OK + */ + function livraison($user, $fk_product, $entrepot_id, $qty) + { + return $this->_create($user, $fk_product, $entrepot_id, (0 - $qty), 2); + } /** - * \brief Cr�e un mouvement en base pour toutes les compositions de produits - * \return int <0 si ko, 0 si ok - */ - function _createProductComposition($user, $fk_product, $entrepot_id, $qty, $type, $price=0) - { - - - dolibarr_syslog("MouvementStock::_createComposition $user->id, $fk_product, $entrepot_id, $qty, $type, $price"); - $products_compo = array(); - - $sql = "SELECT fk_product_composition, qte, etat_stock"; - $sql.= " FROM ".MAIN_DB_PREFIX."product_composition"; - $sql.= " WHERE fk_product = $fk_product;"; - - $all = $this->db->query($sql); - - if ($all) - { - while($item = $this->db->fetch_object($all) ) - { - if($item->etat_stock != 0) array_push($products_compo,$item); - } - $this->db->free($resql); - } - else - { - dolibarr_syslog("MouvementStock::_Create echec update ".$this->error); - return -1; - } - - foreach($products_compo as $product) - { - $this->_create($user, $product->fk_product_composition, $entrepot_id, ($qty*$product->qte), $type, $price=0); - } - - return 0; - } - - - /** + * \brief Increase stock for product and subproducts + * \return int <0 if KO, >0 if OK + */ + function reception($user, $fk_product, $entrepot_id, $qty, $price=0) + { + return $this->_create($user, $fk_product, $entrepot_id, $qty, 3, $price); + } + + + /** + * Return nb of subproducts for a product + * + * @param unknown_type $id + * @return unknown + */ + function nbOfSubProdcuts($id) + { + $nbSP=0; + + $resql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."product_association"; + $resql.= " WHERE fk_product_pere = ".$id; + if ($this->db->query($resql)) + { + $obj=$this->db->fetch_object($resql); + $nbSP=$obj->nb; + } + $this->db->free($resql); + return $nbSP; + } + + /** * \brief Calcul ??? * \return int <0 si ko, >0 si ok */ + /* function CalculateEntrepotValoPmp($user, $entrepot_id, $valo_mouvement) { $error = 0; @@ -251,94 +296,94 @@ class MouvementStock if ( $valo_mouvement <> 0 ) { - $entrepot_value_pmp = 0; - - if ($error === 0) - { - $sql = "SELECT valo_pmp,".$this->db->pdate("date_calcul")." FROM ".MAIN_DB_PREFIX."entrepot_valorisation"; - $sql.= " WHERE fk_entrepot = $entrepot_id ORDER BY date_calcul DESC LIMIT 1;"; - - if ($this->db->query($sql)) - { - while ($row = $this->db->fetch_row($resql) ) - { - $entrepot_value_pmp = $row[0]; - $entrepot_value_date = $row[1]; - } - $this->db->free($resql); - } - else - { - $error = -26; - dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); - } - } - - $new_value = $entrepot_value_pmp + $valo_mouvement; - - $now = time(); - - if ($error === 0) - { - if ( strftime('%Y%m%d',$entrepot_value_date) == strftime('%Y%m%d',$now) ) - { - $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot_valorisation"; - $sql.= " SET valo_pmp='".price2num($new_value)."'"; - $sql.= " WHERE fk_entrepot = $entrepot_id "; - $sql.= " AND ".$this->db->pdate("date_calcul")."='".$entrepot_value_date."';"; - } - else - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."entrepot_valorisation"; - $sql.= " (date_calcul, fk_entrepot, valo_pmp)"; - $sql.= " VALUES (".$this->db->idate(mktime()).", ".$entrepot_id; - $sql.= ",'".price2num($new_value)."')"; - } - - if ($this->db->query($sql)) - { - - } - else - { - $error = -27; - dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); - } - } - - if ($error === 0) - { - $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot"; - $sql.= " SET valo_pmp='".price2num($new_value)."'"; - $sql.= " WHERE rowid = $entrepot_id "; - - if ($this->db->query($sql)) - { - - } - else - { - $error = -28; - dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); - } - } - - if ($error === 0) - { - return 0; - } - else - { - dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp RETURN IN ERROR[$error]"); - return $error; - } + $entrepot_value_pmp = 0; + + if ($error === 0) + { + $sql = "SELECT valo_pmp,".$this->db->pdate("date_calcul")." FROM ".MAIN_DB_PREFIX."entrepot_valorisation"; + $sql.= " WHERE fk_entrepot = $entrepot_id ORDER BY date_calcul DESC LIMIT 1;"; + + if ($this->db->query($sql)) + { + while ($row = $this->db->fetch_row($resql) ) + { + $entrepot_value_pmp = $row[0]; + $entrepot_value_date = $row[1]; + } + $this->db->free($resql); + } + else + { + $error = -26; + dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); + } + } + + $new_value = $entrepot_value_pmp + $valo_mouvement; + + $now = time(); + + if ($error === 0) + { + if ( strftime('%Y%m%d',$entrepot_value_date) == strftime('%Y%m%d',$now) ) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot_valorisation"; + $sql.= " SET valo_pmp='".price2num($new_value)."'"; + $sql.= " WHERE fk_entrepot = $entrepot_id "; + $sql.= " AND ".$this->db->pdate("date_calcul")."='".$entrepot_value_date."';"; + } + else + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."entrepot_valorisation"; + $sql.= " (date_calcul, fk_entrepot, valo_pmp)"; + $sql.= " VALUES (".$this->db->idate(mktime()).", ".$entrepot_id; + $sql.= ",'".price2num($new_value)."')"; + } + + if ($this->db->query($sql)) + { + + } + else + { + $error = -27; + dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); + } + } + + if ($error === 0) + { + $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot"; + $sql.= " SET valo_pmp='".price2num($new_value)."'"; + $sql.= " WHERE rowid = $entrepot_id "; + + if ($this->db->query($sql)) + { + + } + else + { + $error = -28; + dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]"); + } + } + + if ($error === 0) + { + return 0; + } + else + { + dolibarr_syslog("MouvementStock::CalculateEntrepotValoPmp RETURN IN ERROR[$error]"); + return $error; + } } else { - return 0; + return 0; } } - + */ /** * \brief ??? @@ -349,6 +394,7 @@ class MouvementStock * \param value_ope float Valeur du mouvement en retour * \return int <0 si ko, 0 si ok */ + /* function CalculateValoPmp($mvid, $fk_product, $qty, $price=0, &$value_ope) { $error = 0; @@ -382,9 +428,7 @@ class MouvementStock } } - /* - * Calcul - */ + // Calcul if ($qty > 0) { // on stock @@ -405,9 +449,8 @@ class MouvementStock $new_stock_qty = $qty_stock + $qty; $new_stock_value_pmp = $stock_value_pmp + $value_ope; - /* - * Fin calcul - */ + + // Fin calcul if ($error === 0) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."stock_valorisation"; @@ -446,48 +489,6 @@ class MouvementStock return 0; } } - - - /** - * \brief Decrease stock for product and subproducts - * \return int <0 if KO, >0 if OK - */ - function livraison($user, $fk_product, $entrepot_id, $qty) - { - return $this->_create($user, $fk_product, $entrepot_id, (0 - $qty), 2); - } - - - /** - * \brief Increase stock for product and subproducts - * \return int <0 if KO, >0 if OK - */ - function reception($user, $fk_product, $entrepot_id, $qty, $price=0) - { - return $this->_create($user, $fk_product, $entrepot_id, $qty, 3, $price); - } - - - /** - * Return nb of subproducts for a product - * - * @param unknown_type $id - * @return unknown - */ - function nbOfSubProdcuts($id) - { - $nbSP=0; - - $resql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."product_association"; - $resql.= " WHERE fk_product_pere = ".$id; - if ($this->db->query($resql)) - { - $obj=$this->db->fetch_object($resql); - $nbSP=$obj->nb; - } - $this->db->free($resql); - return $nbSP; - } - + */ } ?> diff --git a/htdocs/product/stock/valo.php b/htdocs/product/stock/valo.php index 399345e3e28d7e07c28a635419aaddd9d06deeaa..e29b2219e4fa846633a8cf392c11ed32beb87f48 100644 --- a/htdocs/product/stock/valo.php +++ b/htdocs/product/stock/valo.php @@ -18,11 +18,11 @@ */ /** - \file htdocs/product/stock/valo.php - \ingroup stock - \brief Page de valorisation des stocks - \version $Id$ -*/ + * \file htdocs/product/stock/valo.php + * \ingroup stock + * \brief Page de valorisation des stocks + * \version $Id$ + */ require("./pre.inc.php"); require_once("./entrepot.class.php"); @@ -30,7 +30,7 @@ require_once("./entrepot.class.php"); $langs->load("stocks"); if (!$user->rights->stock->lire) - accessforbidden(); +accessforbidden(); $sref=isset($_GET["sref"])?$_GET["sref"]:$_POST["sref"]; $snom=isset($_GET["snom"])?$_GET["snom"]:$_POST["snom"]; @@ -38,8 +38,8 @@ $sall=isset($_GET["sall"])?$_GET["sall"]:$_POST["sall"]; $sortfield = isset($_GET["sortfield"])?$_GET["sortfield"]:$_POST["sortfield"]; $sortorder = isset($_GET["sortorder"])?$_GET["sortorder"]:$_POST["sortorder"]; -if (! $sortfield) $sortfield="valo"; -if (! $sortorder) $sortorder="DESC"; +if (! $sortfield) $sortfield="e.label"; +if (! $sortorder) $sortorder="ASC"; $page = $_GET["page"]; if ($page < 0) $page = 0; $limit = $conf->liste_limit; @@ -47,22 +47,22 @@ $offset = $limit * $page; $year = strftime("%Y",time()); - + /* * View */ // Affichage valorisation par entrepot -$sql = "SELECT e.rowid as ref, e.label, e.statut, e.lieu, e.valo_pmp as valo"; +$sql = "SELECT e.rowid as ref, e.label, e.statut, e.lieu"; $sql .= " FROM ".MAIN_DB_PREFIX."entrepot as e"; $sql .= " WHERE 1=1"; if ($sref) { - $sql .= " AND e.ref like '%".$sref."%'"; + $sql .= " AND e.ref like '%".$sref."%'"; } if ($sall) { - $sql .= " AND (e.label like '%".addslashes($sall)."%' OR e.description like '%".addslashes($sall)."%' OR e.lieu like '%".addslashes($sall)."%' OR e.address like '%".addslashes($sall)."%' OR e.ville like '%".addslashes($sall)."%')"; + $sql .= " AND (e.label like '%".addslashes($sall)."%' OR e.description like '%".addslashes($sall)."%' OR e.lieu like '%".addslashes($sall)."%' OR e.address like '%".addslashes($sall)."%' OR e.ville like '%".addslashes($sall)."%')"; } $sql .= " ORDER BY $sortfield $sortorder "; $sql .= $db->plimit($limit + 1, $offset); @@ -70,52 +70,55 @@ $sql .= $db->plimit($limit + 1, $offset); $result = $db->query($sql) ; if ($result) { - $num = $db->num_rows($result); - - $i = 0; - - llxHeader("","",$langs->trans("EnhancedValueOfWarehouses")); - - print_barre_liste($langs->trans("EnhancedValueOfWarehouses"), $page, "valo.php", "", $sortfield, $sortorder,'',$num); - - print '<table class="noborder" width="100%">'; - print "<tr class=\"liste_titre\">"; - print_liste_field_titre($langs->trans("Ref"),"valo.php", "e.label","","","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("LocationSummary"),"valo.php", "e.lieu","","","",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("EnhancedValue"),"valo.php", "valo",'','','align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Status"),"valo.php", "e.statut",'','','align="right"',$sortfield,$sortorder); - print "</tr>\n"; - - if ($num) - { - $entrepot=new Entrepot($db); - $total = 0; - $var=false; - while ($i < min($num,$limit)) - { - $objp = $db->fetch_object($result); - print "<tr $bc[$var]>"; - print '<td><a href="fiche.php?id='.$objp->ref.'">'.img_object($langs->trans("ShowWarehouse"),'stock').' '.$objp->label.'</a></td>'; - print '<td>'.$objp->lieu.'</td>'; - print '<td align="right">'.price($objp->valo).' '.$langs->trans('Currency'.$conf->monnaie).'</td>'; - print '<td align="right">'.$entrepot->LibStatut($objp->statut,5).'</td>'; - print "</tr>\n"; - $total += $objp->valo; - $var=!$var; - $i++; - } + $num = $db->num_rows($result); - print '<tr class="liste_total">'; - print '<td colspan="2" align="right">'.$langs->trans("Total").'</td>'; - print '<td align="right">'.price($total).' '.$langs->trans('Currency'.$conf->monnaie).'</td>'; - print '<td align="right"> </td>'; - print "</tr>\n"; + $i = 0; - } - $db->free($result); - print "</table>"; + llxHeader("","",$langs->trans("EnhancedValueOfWarehouses")); - print '<br />'; + print_barre_liste($langs->trans("EnhancedValueOfWarehouses"), $page, "valo.php", "", $sortfield, $sortorder,'',$num); + + print '<table class="noborder" width="100%">'; + print "<tr class=\"liste_titre\">"; + print_liste_field_titre($langs->trans("Ref"),"valo.php", "e.label","","","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("LocationSummary"),"valo.php", "e.lieu","","","",$sortfield,$sortorder); + print_liste_field_titre($langs->trans("PMPValue"),"valo.php", "valo",'','','align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Status"),"valo.php", "e.statut",'','','align="right"',$sortfield,$sortorder); + print "</tr>\n"; + + if ($num) + { + $entrepot=new Entrepot($db); + $total = 0; + $var=false; + while ($i < min($num,$limit)) + { + $objp = $db->fetch_object($result); + print "<tr $bc[$var]>"; + print '<td><a href="fiche.php?id='.$objp->ref.'">'.img_object($langs->trans("ShowWarehouse"),'stock').' '.$objp->label.'</a></td>'; + print '<td>'.$objp->lieu.'</td>'; + print '<td align="right">'; + // This value is real QTY * PMP of products in llx_product_stock for the warehouse + print $langs->trans("FeatureNotYetAvailableShort"); + print '</td>'; + print '<td align="right">'.$entrepot->LibStatut($objp->statut,5).'</td>'; + print "</tr>\n"; + $total += $objp->valo; + $var=!$var; + $i++; + } + + print '<tr class="liste_total">'; + print '<td colspan="2" align="right">'.$langs->trans("Total").'</td>'; + print '<td align="right">'.price($total).' '.$langs->trans('Currency'.$conf->monnaie).'</td>'; + print '<td align="right"> </td>'; + print "</tr>\n"; + + } + $db->free($result); + print "</table>"; + + print '<br />'; $file='entrepot-'.$year.'.png'; if (file_exists(DOL_DATA_ROOT.'/entrepot/temp/'.$file)) @@ -126,15 +129,15 @@ if ($result) $file='entrepot-'.($year-1).'.png'; if (file_exists(DOL_DATA_ROOT.'/entrepot/temp/'.$file)) - { - $url=DOL_URL_ROOT.'/viewimage.php?modulepart=graph_stock&file='.$file; - print '<br /><img src="'.$url.'" alt="Valorisation du stock ann�e '.($year-1).'">'; - } + { + $url=DOL_URL_ROOT.'/viewimage.php?modulepart=graph_stock&file='.$file; + print '<br /><img src="'.$url.'" alt="Valorisation du stock ann�e '.($year-1).'">'; + } } else { - dolibarr_print_error($db); + dolibarr_print_error($db); } $db->close(); diff --git a/mysql/migration/2.5.0-2.6.0.sql b/mysql/migration/2.5.0-2.6.0.sql index b8e6c0835aca83329846d25300beac1462a4b5e0..0df8d3ff5ca153d93c12ff099ea1fd592445285e 100644 --- a/mysql/migration/2.5.0-2.6.0.sql +++ b/mysql/migration/2.5.0-2.6.0.sql @@ -13,3 +13,6 @@ insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) v insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (71, 'facture_fourn', 'external', 'BILLING', 'Contact fournisseur facturation', 1); insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (72, 'facture_fourn', 'external', 'SHIPPING', 'Contact fournisseur livraison', 1); insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (73, 'facture_fourn', 'external', 'SERVICE', 'Contact fournisseur prestation', 1); + +alter table llx_product_stock add column pmp double(24,8) default 0 NOT NULL; + diff --git a/mysql/tables/llx_product_stock.sql b/mysql/tables/llx_product_stock.sql index 7f6d37e287558fc263570211558695c59594ddfc..893390535f6eccb393a762dc95382c793530bb10 100644 --- a/mysql/tables/llx_product_stock.sql +++ b/mysql/tables/llx_product_stock.sql @@ -24,6 +24,7 @@ create table llx_product_stock tms timestamp, fk_product integer NOT NULL, fk_entrepot integer NOT NULL, - reel integer -- stock r�el + reel integer -- physical stock + pmp double(24,8) default 0 NOT NULL -- PMP value for product in this warehous )type=innodb;