From 678a64c59111b2280a8821560a83a74961151f78 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 22 May 2011 02:14:01 +0000 Subject: [PATCH] New: Add more information on stock values. --- htdocs/langs/en_US/stocks.lang | 7 +- htdocs/langs/fr_FR/stocks.lang | 7 +- htdocs/product/class/product.class.php | 29 +++--- htdocs/product/stock/fiche.php | 42 ++++++-- htdocs/product/stock/product.php | 44 ++++++-- htdocs/product/stock/valo.php | 139 +++++++++++++------------ 6 files changed, 171 insertions(+), 97 deletions(-) diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 96eedf7d3b9..785fab73e8e 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -70,8 +70,11 @@ LieuWareHouse=Localisation warehouse WarehousesAndProducts=Warehouses and products AverageUnitPricePMPShort=Weighted average input price AverageUnitPricePMP=Weighted average input price -EstimatedStockValueShort=Estimated value of stock -EstimatedStockValue=Estimated value of stock +SellPriceMin=Selling Unit Price +EstimatedStockValueSellShort=Value to sell +EstimatedStockValueSell=Value to Sell +EstimatedStockValueShort=Input stock value +EstimatedStockValue=Input stock value DeleteAWarehouse=Delete a warehouse ConfirmDeleteWarehouse=Are you sure you want to delete the warehouse %s ? PersonalStock=Personal stock %s diff --git a/htdocs/langs/fr_FR/stocks.lang b/htdocs/langs/fr_FR/stocks.lang index 7b950a28f63..b1a2fc03ff8 100644 --- a/htdocs/langs/fr_FR/stocks.lang +++ b/htdocs/langs/fr_FR/stocks.lang @@ -70,8 +70,11 @@ LieuWareHouse=Lieu entrepôt WarehousesAndProducts=Entrepôts et produits AverageUnitPricePMPShort=Prix moyen pondéré (PMP) AverageUnitPricePMP=Prix moyen pondéré (PMP) d'acquisition -EstimatedStockValueShort=Valorisation (PMP) -EstimatedStockValue=Valorisation acquisition stock (PMP) +SellPriceMin=Prix vente unitaire +EstimatedStockValueSellShort=Valorisation vente +EstimatedStockValueSell=Valorisation à la vente +EstimatedStockValueShort=Valorisation achat (PMP) +EstimatedStockValue=Valorisation à l'achat (PMP) DeleteAWarehouse=Supprimer un entrepôt ConfirmDeleteWarehouse=Êtes-vous sûr de vouloir supprimer l'entrepôt %s ? PersonalStock=Stock personnel %s diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 017e6dd1831..e7eb13ffd12 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1041,7 +1041,7 @@ class Product extends CommonObject //! Spanish local taxes $this->localtax1_tx = $object->localtax1_tx; $this->localtax2_tx = $object->localtax2_tx; - + $this->type = $object->fk_product_type; $this->status = $object->tosell; $this->status_buy = $object->tobuy; @@ -1062,20 +1062,20 @@ class Product extends CommonObject $this->volume_units = $object->volume_units; $this->barcode = $object->barcode; $this->barcode_type = $object->fk_barcode_type; - + $this->accountancy_code_buy = $object->accountancy_code_buy; $this->accountancy_code_sell= $object->accountancy_code_sell; - + $this->stock_reel = $object->stock; $this->pmp = $object->pmp; - + $this->import_key = $object->import_key; - + $this->db->free($resql); - + // multilangs if ($conf->global->MAIN_MULTILANGS) $this->getMultiLangs(); - + // Barcode if ($conf->global->MAIN_MODULE_BARCODE) { @@ -1083,7 +1083,7 @@ class Product extends CommonObject { $this->barcode_type = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE; } - + if ($this->barcode_type > 0) { $sql = "SELECT code, libelle, coder"; @@ -1104,7 +1104,7 @@ class Product extends CommonObject } } } - + // Load multiprices array if ($conf->global->PRODUIT_MULTIPRICES) { @@ -1121,7 +1121,7 @@ class Product extends CommonObject if ($resql) { $result = $this->db->fetch_array($resql); - + $this->multiprices[$i]=$result["price"]; $this->multiprices_ttc[$i]=$result["price_ttc"]; $this->multiprices_min[$i]=$result["price_min"]; @@ -1136,9 +1136,9 @@ class Product extends CommonObject } } } - + $res=$this->load_stock(); - + return $res; } else @@ -2215,6 +2215,11 @@ class Product extends CommonObject $lien = ''; $lienfin=''; } + else if ($option == 'stock') + { + $lien = ''; + $lienfin=''; + } else { $lien = ''; diff --git a/htdocs/product/stock/fiche.php b/htdocs/product/stock/fiche.php index 94725e6eb98..b6c1d1874e7 100644 --- a/htdocs/product/stock/fiche.php +++ b/htdocs/product/stock/fiche.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005 Simon Tosser * Copyright (C) 2005-2009 Regis Houssin * @@ -338,17 +338,19 @@ else print ""; 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("AverageUnitPricePMPShort"),"", "ps.pmp","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Units"),"", "ps.reel","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("AverageUnitPricePMPShort"),"", "ps.pmp","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("EstimatedStockValueShort"),"", "","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); + if (empty($conf->global->PRODUIT_MULTIPRICES)) print_liste_field_titre($langs->trans("SellPriceMin"),"", "p.price","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); + if (empty($conf->global->PRODUIT_MULTIPRICES)) print_liste_field_titre($langs->trans("EstimatedStockValueSellShort"),"", "","&id=".$_GET['id'],"",'align="right"',$sortfield,$sortorder); if ($user->rights->stock->mouvement->creer) print ' '; if ($user->rights->stock->creer) print ' '; print ""; $totalunit=0; - $totalvalue=0; + $totalvalue=$totalvaluesell=0; - $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.fk_product_type as type, p.pmp as ppmp,"; + $sql = "SELECT p.rowid as rowid, p.ref, p.label as produit, p.fk_product_type as type, p.pmp as ppmp, p.price, p.price_ttc,"; $sql.= " ps.pmp, ps.reel as value"; $sql.= " FROM ".MAIN_DB_PREFIX."product_stock ps, ".MAIN_DB_PREFIX."product p"; $sql.= " WHERE ps.fk_product = p.rowid"; @@ -400,19 +402,34 @@ else $productstatic->id=$objp->rowid; $productstatic->ref=$objp->ref; $productstatic->type=$objp->type; - print $productstatic->getNomUrl(1,'',16); + print $productstatic->getNomUrl(1,'stock',16); print ''; print ''.$objp->produit.''; print ''.$objp->value.''; $totalunit+=$objp->value; + // Price buy PMP print ''.price(price2num($objp->pmp,'MU')).''; - + // Total PMP print ''.price(price2num($objp->pmp*$objp->value,'MT')).''; $totalvalue+=price2num($objp->pmp*$objp->value,'MT'); - if ($user->rights->stock->mouvement->creer) + // Price sell min + if (empty($conf->global->PRODUIT_MULTIPRICES)) + { + $pricemin=$objp->price; + print ''; + print price(price2num($pricemin,'MU')); + print ''; + // Total sell min + print ''; + print price(price2num($pricemin*$objp->value,'MT')); + print ''; + } + $totalvaluesell+=price2num($pricemin*$objp->value,'MT'); + + if ($user->rights->stock->mouvement->creer) { print ''; print img_picto($langs->trans("StockMovement"),'uparrow.png').' '.$langs->trans("StockMovement"); @@ -434,8 +451,13 @@ else print ''.$langs->trans("Total").''; print ''.$totalunit.''; print ' '; - print ''.price(price2num($totalvalue,'MT')).''; - print ' '; + print ''.price(price2num($totalvalue,'MT')).''; + if (empty($conf->global->PRODUIT_MULTIPRICES)) + { + print ' '; + print ''.price(price2num($totalvaluesell,'MT')).''; + } + print ' '; print ' '; print ''; diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index 4ec106c278a..fb992a6f0f9 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -198,11 +198,18 @@ if ($_GET["id"] || $_GET["ref"]) // PMP print ''.$langs->trans("AverageUnitPricePMP").''; - print ''.price($product->pmp); - print ''; + print ''.price($product->pmp).' '.$langs->trans("HT").''; print ''; - // Real stock + // Sell price + print ''.$langs->trans("SellPriceMin").''; + print ''; + if (empty($conf->global->PRODUIT_MULTIPRICES)) print price($product->price).' '.$langs->trans("HT"); + else print $langs->trans("Variable"); + print ''; + print ''; + + // Real stock print ''.$langs->trans("PhysicalStock").''; print ''.$product->stock_reel; if ($product->seuil_stock_alerte && ($product->stock_reel < $product->seuil_stock_alerte)) print ' '.img_warning($langs->trans("StockTooLow")); @@ -436,11 +443,13 @@ print ''.$langs->trans("Warehouse").''.$langs->trans("NumberOfUnit").''; print ''.$langs->trans("AverageUnitPricePMPShort").''; print ''.$langs->trans("EstimatedStockValueShort").''; +print ''.$langs->trans("SellPriceMin").''; +print ''.$langs->trans("EstimatedStockValueSellShort").''; print ''; $sql = "SELECT e.rowid, e.label, ps.reel, ps.pmp"; -$sql.= " FROM ".MAIN_DB_PREFIX."entrepot as e"; -$sql.= ", ".MAIN_DB_PREFIX."product_stock as ps"; +$sql.= " FROM ".MAIN_DB_PREFIX."entrepot as e,"; +$sql.= " ".MAIN_DB_PREFIX."product_stock as ps"; $sql.= " WHERE ps.reel != 0"; $sql.= " AND ps.fk_entrepot = e.rowid"; $sql.= " AND e.entity = ".$conf->entity; @@ -449,7 +458,7 @@ $sql.= " ORDER BY e.label"; $entrepotstatic=new Entrepot($db); $total=0; -$totalvalue=0; +$totalvalue=$totalvaluesell=0; $resql=$db->query($sql); if ($resql) @@ -464,21 +473,42 @@ if ($resql) print ''; print ''.$entrepotstatic->getNomUrl(1).''; print ''.$obj->reel.($obj->reel<0?' '.img_warning():'').''; + // PMP print ''.price2num(($obj->pmp > 0 ? $obj->pmp : $product->pmp),'MU').''; // Ditto : Show PMP from movement or from product print ''.price(price2num(($obj->pmp > 0 ? $obj->pmp : $product->pmp)*$obj->reel,'MT')).''; // Ditto : Show PMP from movement or from product + // Sell price + print ''; + if (empty($conf->global->PRODUIT_MUTLI_PRICES)) print price(price2num($product->price,'MU')); + else print $langs->trans("Variable"); + print ''; // Ditto : Show PMP from movement or from product + print ''; + if (empty($conf->global->PRODUIT_MUTLI_PRICES)) print price(price2num($product->price*$obj->reel,'MT')).''; // Ditto : Show PMP from movement or from product + else print $langs->trans("Variable"); print ''; ; $total = $total + $obj->reel; $totalvalue = $totalvalue + price2num(($obj->pmp > 0 ? $obj->pmp : $product->pmp)*$obj->reel,'MT'); // Ditto : Show PMP from movement or from product + $totalvaluesell = $totalvaluesell + price2num($product->price*$obj->reel,'MT'); // Ditto : Show PMP from movement or from product $i++; $var=!$var; } } +else dol_print_error($db); print ''.$langs->trans("Total").':'; print ''.$total.''; print ''; print ($total?price($totalvalue/$total):' '); print ''; -print ''.price($totalvalue).''; +print ''; +print price($totalvalue); +print ''; +print ''; +if (empty($conf->global->PRODUIT_MUTLI_PRICES)) print ($total?price($totalvaluesell/$total):' '); +else print $langs->trans("Variable"); +print ''; +print ''; +if (empty($conf->global->PRODUIT_MUTLI_PRICES)) print price($totalvaluesell); +else print $langs->trans("Variable"); +print ''; print ""; print ""; diff --git a/htdocs/product/stock/valo.php b/htdocs/product/stock/valo.php index de198b1480e..ddf8d9860d9 100644 --- a/htdocs/product/stock/valo.php +++ b/htdocs/product/stock/valo.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -21,7 +21,7 @@ /** * \file htdocs/product/stock/valo.php * \ingroup stock - * \brief Page de valorisation des stocks + * \brief Page with stock values * \version $Id$ */ @@ -55,97 +55,108 @@ $year = strftime("%Y",time()); // Affichage valorisation par entrepot $sql = "SELECT e.rowid as ref, e.label, e.statut, e.lieu,"; -$sql.= " SUM(ps.pmp * ps.reel) as estimatedvalue"; +$sql.= " SUM(ps.pmp * ps.reel) as estimatedvalue, SUM(p.price * ps.reel) as sellvalue"; $sql.= " FROM ".MAIN_DB_PREFIX."entrepot as e"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps ON e.rowid = ps.fk_entrepot"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON ps.fk_product = p.rowid"; $sql.= " WHERE e.entity = ".$conf->entity; if ($sref) { - $sql.= " AND e.ref LIKE '%".$sref."%'"; + $sql.= " AND e.ref LIKE '%".$sref."%'"; } if ($sall) { - $sql.= " AND (e.label LIKE '%".$db->escape($sall)."%'"; - $sql.= " OR e.description LIKE '%".$db->escape($sall)."%'"; - $sql.= " OR e.lieu LIKE '%".$db->escape($sall)."%'"; - $sql.= " OR e.address LIKE '%".$db->escape($sall)."%'"; - $sql.= " OR e.ville LIKE '%".$db->escape($sall)."%')"; + $sql.= " AND (e.label LIKE '%".$db->escape($sall)."%'"; + $sql.= " OR e.description LIKE '%".$db->escape($sall)."%'"; + $sql.= " OR e.lieu LIKE '%".$db->escape($sall)."%'"; + $sql.= " OR e.address LIKE '%".$db->escape($sall)."%'"; + $sql.= " OR e.ville LIKE '%".$db->escape($sall)."%')"; } $sql.= " GROUP BY e.rowid, e.label, e.statut, e.lieu"; -$sql.= " ORDER BY $sortfield $sortorder "; +$sql.= $db->order($sortfield,$sortorder); $sql.= $db->plimit($limit + 1, $offset); $result = $db->query($sql) ; if ($result) { - $num = $db->num_rows($result); + $num = $db->num_rows($result); - $i = 0; + $i = 0; - $help_url='EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; - llxHeader("",$langs->trans("EnhancedValueOfWarehouses"),$help_url); + $help_url='EN:Module_Stocks_En|FR:Module_Stock|ES:Módulo_Stocks'; + llxHeader("",$langs->trans("EnhancedValueOfWarehouses"),$help_url); - print_barre_liste($langs->trans("EnhancedValueOfWarehouses"), $page, "valo.php", "", $sortfield, $sortorder,'',$num); + print_barre_liste($langs->trans("EnhancedValueOfWarehouses"), $page, "valo.php", "", $sortfield, $sortorder,'',$num); - print ''; - print ""; - 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("EstimatedStockValue"),"valo.php", "e.valo_pmp",'','','align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Status"),"valo.php", "e.statut",'','','align="right"',$sortfield,$sortorder); - print "\n"; + print '
'; + print ""; + 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("EstimatedStockValue"),"valo.php", "e.valo_pmp",'','','align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("EstimatedStockValueSell"),"", "",'','','align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Status"),"valo.php", "e.statut",'','','align="right"',$sortfield,$sortorder); + print "\n"; - if ($num) - { - $entrepot=new Entrepot($db); - $total = 0; - $var=false; - while ($i < min($num,$limit)) - { - $objp = $db->fetch_object($result); - print ""; - print ''; - print ''; - print ''; - print ''; - print "\n"; - $total += price2num($objp->estimatedvalue,'MU'); - $var=!$var; - $i++; - } + if ($num) + { + $entrepot=new Entrepot($db); + $total = $totalsell = 0; + $var=false; + while ($i < min($num,$limit)) + { + $objp = $db->fetch_object($result); + print ""; + print ''; + print ''; + // PMP value + print ''; + // Selling value + print ''; + // Status + print ''; + print "\n"; + $total += price2num($objp->estimatedvalue,'MU'); + $totalsell += price2num($objp->sellvalue,'MU'); + $var=!$var; + $i++; + } - print ''; - print ''; - print ''; - print ''; - print "\n"; + print ''; + print ''; + print ''; + print ''; + print ''; + print "\n"; - } - $db->free($result); - print "
'.img_object($langs->trans("ShowWarehouse"),'stock').' '.$objp->label.''.$objp->lieu.''; - print price(price2num($objp->estimatedvalue,'MT')); - print ''.$entrepot->LibStatut($objp->statut,5).'
'.img_object($langs->trans("ShowWarehouse"),'stock').' '.$objp->label.''.$objp->lieu.''; + print price(price2num($objp->estimatedvalue,'MT')); + print ''; + if (empty($conf->global->PRODUIT_MULTIPRICES)) print price(price2num($objp->sellvalue,'MT')); + else print $langs->trans("Variable"); + print ''.$entrepot->LibStatut($objp->statut,5).'
'.$langs->trans("Total").''.price($total).' '.$langs->trans('Currency'.$conf->monnaie).' 
'.$langs->trans("Total").''.price(price2num($total,'MT')).' '.$langs->trans('Currency'.$conf->monnaie).''.price(price2num($totalsell,'MT')).' '.$langs->trans('Currency'.$conf->monnaie).' 
"; + } + $db->free($result); + print ""; - print '
'; + print '
'; - $file='entrepot-'.$year.'.png'; - if (file_exists(DOL_DATA_ROOT.'/entrepot/temp/'.$file)) - { - $url=DOL_URL_ROOT.'/viewimage.php?modulepart=graph_stock&file='.$file; - print ''; - } + $file='entrepot-'.$year.'.png'; + if (file_exists(DOL_DATA_ROOT.'/entrepot/temp/'.$file)) + { + $url=DOL_URL_ROOT.'/viewimage.php?modulepart=graph_stock&file='.$file; + print ''; + } - $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 '
'; - } + $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 '
'; + } } else { - dol_print_error($db); + dol_print_error($db); } $db->close();