New: Store and show estimated value of stock

This commit is contained in:
Laurent Destailleur 2009-07-09 18:44:13 +00:00
parent 8c68711e02
commit 0e8e8e2b98
10 changed files with 172 additions and 403 deletions

View File

@ -607,6 +607,8 @@ class CommandeFournisseur extends Commande
*/
function refuse($user)
{
global $conf, $langs;
dol_syslog("CommandeFournisseur::Refuse");
$result = 0;
if ($user->rights->fournisseur->commande->approuver)
@ -615,21 +617,21 @@ class CommandeFournisseur extends Commande
$sql .= " WHERE rowid = ".$this->id;
if ($this->db->query($sql) )
{
$result = 0;
$this->log($user, 9, time());
{
$result = 0;
$this->log($user, 9, time());
$subject = $langs->trans("EMailTextOrderRefused",$this->ref);
$message = $langs->trans("Hello").",\n\n";
$message .= $langs->trans("EMailTextOrderRefusedBy",$this->ref,$user->fullname);
$subject = $langs->trans("EMailTextOrderRefused",$this->ref);
$message = $langs->trans("Hello").",\n\n";
$message .= $langs->trans("EMailTextOrderRefusedBy",$this->ref,$user->fullname);
$this->_NotifyCreator($user, $subject, $message);
}
else
{
dol_syslog("CommandeFournisseur::Refuse Error -1");
$result = -1;
}
$this->_NotifyCreator($user, $subject, $message);
}
else
{
dol_syslog("CommandeFournisseur::Refuse Error -1");
$result = -1;
}
}
else
{

View File

@ -62,4 +62,7 @@ StockUpShort=Stock up
IdWarehouse=Id warehouse
DescWareHouse=Description warehouse
LieuWareHouse=Localisation warehouse
WarehousesAndProducts=Warehouses and products
WarehousesAndProducts=Warehouses and products
AverageUnitPricePMP=Average price
EstimatedStockValueForProduct=Estimated value for product's stock
EstimatedStockValue=Estimated value in stock

View File

@ -62,4 +62,7 @@ StockUpShort=Stock max
IdWarehouse=Id entrepôt
DescWareHouse=Description entrepôt
LieuWareHouse=Lieu entrepôt
WarehousesAndProducts=Entrepôts et produits
WarehousesAndProducts=Entrepôts et produits
AverageUnitPricePMP=Prix moyen pondéré (PMP)
EstimatedStockValueForProduct=Valeur estimée du produit en stock
EstimatedStockValue=Valeur estimée du stock

View File

@ -38,6 +38,8 @@ class Product extends CommonObject
{
var $db;
var $error;
//! Numero de l'erreur
var $errno = 0;
var $element='product';
var $table_element='product';
@ -63,7 +65,12 @@ class Product extends CommonObject
//! Type 0 for regular product, 1 for service, 2 for assembly kit, 3 for stock kit
var $type;
var $typestring;
//! Stock
var $stock_reel;
//! Stock value (PMP)
var $pmp;
var $seuil_stock_alerte;
//! Duree de validite du service
var $duration_value;
@ -97,9 +104,6 @@ class Product extends CommonObject
var $imgWidth;
var $imgHeight;
//! Numero de l'erreur
//! Numero d'erreur Plage 0256-0511
var $errno = 0;
//! Canevas a utiliser si le produit n'est pas un produit generique
var $canvas;
@ -438,9 +442,9 @@ class Product extends CommonObject
{
$num = $this->db->num_rows($result);
if ($num != 0)
{
$sqr++;
}
{
$sqr++;
}
}
$sql = "SELECT rowid";
@ -452,9 +456,9 @@ class Product extends CommonObject
{
$num = $this->db->num_rows($result);
if ($num != 0)
{
$sqr++;
}
{
$sqr++;
}
}
@ -467,9 +471,9 @@ class Product extends CommonObject
{
$num = $this->db->num_rows($result);
if ($num != 0)
{
$sqr++;
}
{
$sqr++;
}
}
@ -482,9 +486,9 @@ class Product extends CommonObject
{
$num = $this->db->num_rows($result);
if ($num != 0)
{
$sqr++;
}
{
$sqr++;
}
}
if ($sqr == 0)
@ -875,10 +879,10 @@ class Product extends CommonObject
/**
* \brief Charge le produit/service en memoire
* \param id Id du produit/service a charger
* \param ref Ref du produit/service a charger
* \return int <0 si ko, >0 si ok
* \brief Load a product in memory from database
* \param id Id of product/service to load
* \param ref Ref of product/service to load
* \return int <0 if KO, >0 if OK
*/
function fetch($id='',$ref='')
{
@ -898,7 +902,9 @@ class Product extends CommonObject
$sql = "SELECT rowid, ref, label, description, note, price, price_ttc,";
$sql.= " price_min, price_min_ttc, price_base_type, tva_tx, envente,";
$sql.= " fk_product_type, duration, seuil_stock_alerte,canvas,";
$sql.= " stock_loc, weight, weight_units, volume, volume_units, barcode, fk_barcode_type, finished";
$sql.= " stock_loc, weight, weight_units, volume, volume_units, barcode, fk_barcode_type, finished,";
$sql.= " stock, pmp,";
$sql.= " import_key";
$sql.= " FROM ".MAIN_DB_PREFIX."product";
if ($id) $sql.= " WHERE rowid = '".$id."'";
if ($ref) $sql.= " WHERE ref = '".addslashes($ref)."'";
@ -936,9 +942,12 @@ class Product extends CommonObject
$this->barcode = $result["barcode"];
$this->barcode_type = $result["fk_barcode_type"];
$this->next_prev_filter = 'entity = '.$conf->entity;
$this->stock_reel = $result["stock"];
$this->pmp = $result["pmp"];
$this->label_url = '<a href="'.DOL_URL_ROOT.'/product/fiche.php?id='.$this->id.'">'.$this->libelle.'</a>';
$this->import_key = $result["import_key"];
$this->next_prev_filter = 'entity = '.$conf->entity;
$this->db->free();
@ -958,10 +967,10 @@ class Product extends CommonObject
$sql = "SELECT code, libelle, coder";
$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
$sql.= " WHERE rowid = ".$this->barcode_type;
$result = $this->db->query($sql);
if ($result)
$resql = $this->db->query($sql);
if ($resql)
{
$result = $this->db->fetch_array();
$result = $this->db->fetch_array($resql);
$this->barcode_type_code = $result["code"];
$this->barcode_type_label = $result["libelle"];
$this->barcode_type_coder = $result["coder"];
@ -985,10 +994,10 @@ class Product extends CommonObject
$sql.= " where price_level=".$i." and";
$sql.= " fk_product = '".$this->id."'";
$sql.= " order by date_price DESC limit 1";
$result = $this->db->query($sql) ;
if ( $result )
$resql = $this->db->query($sql) ;
if ($resql)
{
$result = $this->db->fetch_array();
$result = $this->db->fetch_array($resql);
$this->multiprices[$i]=$result["price"];
$this->multiprices_ttc[$i]=$result["price_ttc"];
@ -1034,7 +1043,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE p.rowid = pd.fk_propal";
$sql.= " AND p.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND pd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
//$sql.= " AND pr.fk_statut != 0";
@ -1076,7 +1085,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE c.rowid = cd.fk_commande";
$sql.= " AND c.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND cd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
if ($socid > 0) $sql.= " AND c.fk_soc = ".$socid;
@ -1117,7 +1126,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE c.rowid = cd.fk_commande";
$sql.= " AND c.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND cd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
if ($socid > 0) $sql.= " AND c.fk_soc = ".$socid;
@ -1159,7 +1168,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE e.rowid = ed.fk_expedition";
$sql.= " AND e.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND ed.fk_origin_line = cd.rowid";
$sql.= " AND cd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND e.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
@ -1201,7 +1210,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE c.rowid = cd.fk_contrat";
$sql.= " AND c.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND cd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
//$sql.= " AND c.statut != 0";
@ -1242,7 +1251,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE f.rowid = fd.fk_facture";
$sql.= " AND f.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND fd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
//$sql.= " AND f.fk_statut != 0";
@ -1283,7 +1292,7 @@ class Product extends CommonObject
if (!$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql.= " WHERE f.rowid = fd.fk_facture_fourn";
$sql.= " AND f.fk_soc = s.rowid";
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND s.entity = ".$conf->entity;
$sql.= " AND fd.fk_product = ".$this->id;
if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
//$sql.= " AND f.fk_statut != 0";
@ -1852,13 +1861,13 @@ class Product extends CommonObject
<a href=\"".DOL_URL_ROOT."/product/fiche.php?id=".$desc_pere[0]."\">".$compl_path.stripslashes($nom_pere)."
</a> (".$desc_pere[1].")</td><td align=\"center\"> ".$trueValue."</td><td>&nbsp</td><td>&nbsp</td>
<td align=\"center\">".$this->stock_entrepot[1]." ".$img."</td></tr>",
$desc_pere[0],
$desc_pere[0],
'fullpath' => $compl_path.$nom_pere);
}
else
{
$this->res[]= array($compl_path.$nom_pere." (".$desc_pere[1].")",
$desc_pere[0],
$desc_pere[0],
'fullpath' => $compl_path.$nom_pere);
}
}
@ -1909,7 +1918,7 @@ class Product extends CommonObject
{
if (is_array($desc_pere)) $this->fetch_prod_arbo($desc_pere,"",$multiply);
}
// dol_sort($this->res,);
// dol_sort($this->res,);
}
return $this->res;
}

View File

@ -39,19 +39,32 @@ class MouvementStock
/**
* \brief Add a movement in stock (in one direction only)
* \param type Direction of movement: 2=output (stock decrease), 3=input (stock increase)
* \return int <0 if KO, >0 if OK
* \param user User object
* \param fk_product Id of product
* \param entrepot_id Id of warehouse
* \param qty Qty of movement
* \param type Direction of movement: 2=output (stock decrease), 3=input (stock increase)
* \param type Unit price HT of product
* \return int <0 if KO, >0 if OK
*/
function _create($user, $fk_product, $entrepot_id, $qty, $type, $price=0)
{
global $conf;
$error = 0;
dol_syslog("MouvementStock::_create $user->id, $fk_product, $entrepot_id, qty=$qty, type=$type, $price");
dol_syslog("MouvementStock::_create start userid=$user->id, fk_product=$fk_product, warehouse=$entrepot_id, qty=$qty, type=$type, price=$price");
$this->db->begin();
if (1 == 1) // Always change stock for current product, change for subproduct done after
$product = new Product($this->db);
$result=$product->fetch($fk_product);
if (! $result > 0)
{
dol_print_error('',"Failed to fetch product");
return -1;
}
if (1 == 1) // Always change stock for current product, change for subproduct is done after
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."stock_mouvement";
$sql.= " (datem, fk_product, fk_entrepot, value, type_mouvement, fk_user_author, price)";
@ -65,98 +78,117 @@ class MouvementStock
}
else
{
$this->error=$this->db->lasterror();
dol_syslog("MouvementStock::_create ".$this->error, LOG_ERR);
$error = -1;
}
// Define current values for qty and pmp
$oldqty=$product->stock_reel;
$oldqtywarehouse=0;
$oldpmp=$product->pmp;
$oldpmpwarehouse=0;
// Test if there is already a record for couple (warehouse / product)
$num = 0;
if ($error == 0)
if (! $error)
{
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."product_stock";
$sql = "SELECT rowid, reel, pmp FROM ".MAIN_DB_PREFIX."product_stock";
$sql.= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product;
dol_syslog("MouvementStock::_create sql=".$sql);
if ($this->db->query($sql))
{
$num = $this->db->num_rows($resql);
$obj = $this->db->fetch_object($resql);
if ($obj)
{
$num = 1;
$oldqtywarehouse = $obj->reel;
$oldpmpwarehouse = $obj->pmp;
}
$this->db->free($resql);
}
else
{
$this->error=$this->db->lasterror();
dol_syslog("MouvementStock::_create echec update ".$this->error, LOG_ERR);
$error = -2;
}
}
// Calculate new PMP
if (! $error)
{
$newpmp=0;
$newpmpwarehouse=0;
if ($price > 0)
{
if ($oldqty > 0 && $oldpmp > 0) $newpmp=($oldqty * $oldpmp + $qty * $price) / ($oldqty + $qty);
else $newpmp=$price;
if ($oldqtywarehouse > 0 && $oldpmpwarehouse > 0) $newpmpwarehouse=($oldqtywarehouse * $oldpmpwarehouse + $qty * $price) / ($oldqtywarehouse + $qty);
else $newpmpwarehouse=$price;
}
else
{
$newpmp = $oldpmp;
$newpmpwarehouse = $oldpmpwarehouse;
}
}
// Update denormalized value of stock in product_stock and product
if ($error == 0)
if (! $error)
{
if ($num > 0)
{
$sql = "UPDATE ".MAIN_DB_PREFIX."product_stock SET reel = reel + ".$qty;
$sql = "UPDATE ".MAIN_DB_PREFIX."product_stock SET pmp = ".$newpmpwarehouse.", reel = reel + ".$qty;
$sql.= " WHERE fk_entrepot = ".$entrepot_id." AND fk_product = ".$fk_product;
}
else
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."product_stock";
$sql.= " (reel, fk_entrepot, fk_product) VALUES ";
$sql.= " (".$qty.",".$entrepot_id.",".$fk_product.")";
$sql.= " (pmp, reel, fk_entrepot, fk_product) VALUES ";
$sql.= " (".$newpmpwarehouse.", ".$qty.", ".$entrepot_id.", ".$fk_product.")";
}
dol_syslog("MouvementStock::_create sql=".$sql, LOG_DEBUG);
if ($this->db->query($sql))
{
$sql = "UPDATE ".MAIN_DB_PREFIX."product SET stock = stock + ".$qty;
$sql.= " WHERE rowid = ".$fk_product;
dol_syslog("MouvementStock::_create sql=".$sql, LOG_DEBUG);
if ($this->db->query($sql))
{
// TODO
// Update value of PMP in product_stock
}
else
{
dol_syslog("MouvementStock::_create ".$this->error, LOG_ERR);
$error = -4;
}
}
else
dol_syslog("MouvementStock::_create sql=".$sql);
$resql=$this->db->query($sql);
if (! $resql)
{
$this->error=$this->db->lasterror();
dol_syslog("MouvementStock::_create ".$this->error, LOG_ERR);
$error = -3;
}
}
/*
if ($error == 0)
if (! $error)
{
$valo_mouvement = 0;
$error = $this->CalculateValoPmp($mvid, $fk_product, $qty, $price, $valo_mouvement);
}
$sql = "UPDATE ".MAIN_DB_PREFIX."product SET pmp = ".$newpmp.", stock = stock + ".$qty;
$sql.= " WHERE rowid = ".$fk_product;
if ($error == 0)
{
$error = $this->CalculateEntrepotValoPmp($user, $entrepot_id, $valo_mouvement);
dol_syslog("MouvementStock::_create sql=".$sql);
$resql=$this->db->query($sql);
if (! $resql)
{
$this->error=$this->db->lasterror();
dol_syslog("MouvementStock::_create ".$this->error, LOG_ERR);
$error = -4;
}
}
*/
}
// Add movement for sub products
if ($error == 0 && $conf->global->PRODUIT_SOUSPRODUITS)
if (! $error && $conf->global->PRODUIT_SOUSPRODUITS)
{
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, $price=0);
$error = $this->_createSubProduct($user, $fk_product, $entrepot_id, $qty, $type, 0); // pmp is not change for subproduct
}
// composition module
if ($error == 0 && $qty < 0 && $conf->global->MAIN_MODULE_COMPOSITION)
if (! $error && $qty < 0 && $conf->global->MAIN_MODULE_COMPOSITION)
{
$error = $this->_createProductComposition($user, $fk_product, $entrepot_id, $qty, $type, $price=0);
$error = $this->_createProductComposition($user, $fk_product, $entrepot_id, $qty, $type, 0); // pmp is not change for subproduct
}
if ($error == 0)
if (! $error)
{
$this->db->commit();
return 1;
@ -164,9 +196,8 @@ class MouvementStock
else
{
$this->db->rollback();
$this->error=$this->db->lasterror();
dol_syslog("MouvementStock::_create ".$this->error, LOG_ERR);
return -2;
dol_syslog("MouvementStock::_create error code=".$error, LOG_ERR);
return -6;
}
}
@ -215,7 +246,7 @@ class MouvementStock
/**
* \brief Crée un mouvement en base pour toutes les compositions de produits
* \brief Cr<EFBFBD>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)
@ -293,211 +324,5 @@ class MouvementStock
return $nbSP;
}
/**
* \brief Calcul ???
* \return int <0 si ko, >0 si ok
*/
/*
function CalculateEntrepotValoPmp($user, $entrepot_id, $valo_mouvement)
{
$error = 0;
dol_syslog("MouvementStock::CalculateEntrepotValoPmp $user->id, $entrepot_id, $valo_mouvement");
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;
dol_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;
dol_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;
dol_syslog("MouvementStock::CalculateEntrepotValoPmp ERRORSQL[$error]");
}
}
if ($error === 0)
{
return 0;
}
else
{
dol_syslog("MouvementStock::CalculateEntrepotValoPmp RETURN IN ERROR[$error]");
return $error;
}
}
else
{
return 0;
}
}
*/
/**
* \brief ???
* \param mvid int Id du mouvement
* \param fk_product int Id produit
* \param qty float Quantit�
* \param price float Prix unitaire du produit
* \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;
dol_syslog("MouvementStock::CalculateValoPmp $mvid, $fk_product, $qty, $price");
if ( $qty <> 0 )
{
$price_pmp = 0;
$qty_stock = 0;
$stock_value_pmp = 0;
if ($error === 0)
{
$sql = "SELECT price_pmp, qty_stock, valo_pmp FROM ".MAIN_DB_PREFIX."stock_valorisation";
$sql.= " WHERE fk_product = $fk_product ORDER BY date_valo DESC LIMIT 1;";
if ($this->db->query($sql))
{
while ($row = $this->db->fetch_row($resql) )
{
$price_pmp = $row[0];
$qty_stock = $row[1];
$stock_value_pmp = $row[2];
}
$this->db->free($resql);
}
else
{
dol_syslog("MouvementStock::CalculateValoPmp ERRORSQL[1] ".$this->error, LOG_ERR);
$error = -16;
}
}
// Calcul
if ($qty > 0)
{
// on stock
if (($qty + $qty_stock) <> 0)
$new_pmp = ( ($qty * $price) + ($qty_stock * $price_pmp ) ) / ($qty + $qty_stock);
$value_ope = $qty * $price;
$new_stock_qty = $qty_stock + $qty;
$new_stock_value_pmp = $stock_value_pmp + $value_ope;
}
else
{
// on destock
$new_pmp = $price_pmp;
$price = $price_pmp;
$value_ope = $qty * $price_pmp;
}
$new_stock_qty = $qty_stock + $qty;
$new_stock_value_pmp = $stock_value_pmp + $value_ope;
// Fin calcul
if ($error === 0)
{
$sql = "INSERT INTO ".MAIN_DB_PREFIX."stock_valorisation";
$sql.= " (date_valo, fk_product, fk_stock_mouvement, qty_ope, price_ope, valo_ope, price_pmp, qty_stock, valo_pmp)";
$sql.= " VALUES (".$this->db->idate(mktime()).", $fk_product, $mvid";
$sql.= ",'".price2num($qty)."'";
$sql.= ",'".price2num($price)."'";
$sql.= ",'".price2num($value_ope)."'";
$sql.= ",'".price2num($new_pmp)."'";
$sql.= ",'".price2num($new_stock_qty)."'";
$sql.= ",'".price2num($new_stock_value_pmp)."')";
if ($this->db->query($sql))
{
}
else
{
dol_syslog("MouvementStock::CalculateValoPmp ERRORSQL[2] insert ".$this->error, LOG_ERR);
$error = -17;
}
}
if ($error === 0)
{
return 0;
}
else
{
dol_syslog("MouvementStock::CalculateValoPmp ERROR : $error");
return -21;
}
}
else
{
return 0;
}
}
*/
}
?>

View File

@ -1,6 +1,6 @@
<?php
/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
* Copyright (C) 2005 Simon TOSSER <simon@kornog-computing.com>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
@ -22,8 +22,8 @@
/**
* \file htdocs/product/stock/product.php
* \ingroup product
* \brief Page de la fiche stock d'un produit
* \ingroup product, stock
* \brief Page to list detailed stock of a product
* \version $Id$
*/
@ -350,9 +350,12 @@ print '</div>';
*/
print '<br><table class="noborder" width="100%">';
print '<tr class="liste_titre"><td width="40%">'.$langs->trans("Warehouse").'</td>';
print '<td align="right">'.$langs->trans("NumberOfUnit").'</td></tr>';
print '<td align="right">'.$langs->trans("NumberOfUnit").'</td>';
print '<td align="right">'.$langs->trans("AverageUnitPricePMP").'</td>';
print '<td align="right">'.$langs->trans("EstimatedStockValue").'</td>';
print '</tr>';
$sql = "SELECT e.rowid, e.label, ps.reel";
$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.= " WHERE ps.reel != 0";
@ -362,6 +365,8 @@ $sql.= " AND ps.fk_product = ".$product->id;
$sql.= " ORDER BY lower(e.label)";
$entrepotstatic=new Entrepot($db);
$total=0;
$totalvalue=0;
$resql=$db->query($sql);
if ($resql)
@ -376,13 +381,20 @@ if ($resql)
print '<tr '.$bc[$var].'>';
print '<td>'.$entrepotstatic->getNomUrl(1).'</td>';
print '<td align="right">'.$obj->reel.'</td>';
print '<td align="right">'.price2num($obj->pmp,'MU').'</td>';
print '<td align="right">'.price(price2num($obj->pmp,'MU')*$obj->reel).'</td>';
print '</tr>'; ;
$total = $total + $obj->reel;
$totalvalue = $totalvalue + price2num($obj->pmp,'MU')*$obj->reel;
$i++;
$var=!$var;
}
}
print '<tr class="liste_total"><td align="right" class="liste_total">'.$langs->trans("Total").':</td><td class="liste_total" align="right">'.$total."</td></tr>";
print '<tr class="liste_total"><td align="right" class="liste_total">'.$langs->trans("Total").':</td>';
print '<td class="liste_total" align="right">'.$total.'</td>';
print '<td class="liste_total" align="right">&nbsp;</td>';
print '<td class="liste_total" align="right">'.price($totalvalue).'</td>';
print "</tr>";
print "</table>";

View File

@ -6,6 +6,9 @@
-- when current version is 2.6.0 or higher.
--
drop table llx_stock_valorisation;
drop table llx_entrepot_valorisation;
update llx_actioncomm set datep = datec where datep is null and datec is not null;
-- Create new table for import module

View File

@ -1,29 +0,0 @@
-- ============================================================================
-- Copyright (C) 2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
--
-- 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
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- $Id$
-- ============================================================================
create table llx_entrepot_valorisation
(
rowid integer AUTO_INCREMENT PRIMARY KEY,
tms timestamp, -- date technique mise à jour automatiquement
date_calcul date, -- date auquel a ete calcule la valeur
fk_entrepot integer UNSIGNED NOT NULL,
valo_pmp float(12,4) -- valoristaion du stock en PMP
)type=innodb;

View File

@ -1,24 +0,0 @@
-- ============================================================================
-- Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-- Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
--
-- 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
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- $Id$
-- ============================================================================
ALTER TABLE llx_stock_valorisation ADD INDEX idx_stock_valorisation_fk_product (fk_product);

View File

@ -1,35 +0,0 @@
-- ============================================================================
-- Copyright (C) 2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
--
-- 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
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- $Id$
-- ============================================================================
create table llx_stock_valorisation
(
rowid integer AUTO_INCREMENT PRIMARY KEY,
tms timestamp, -- date technique mise à jour automatiquement
date_valo datetime, -- date de valorisation
fk_product integer NOT NULL, -- id du produit concerne par l'operation
qty_ope float(9,3), -- quantité de l'operation
price_ope float(12,4), -- prix unitaire du produit concerne par l'operation
valo_ope float(12,4), -- valorisation de l'operation
price_pmp float(12,4), -- valeur PMP de l'operation
qty_stock float(9,3) DEFAULT 0, -- qunatite en stock
valo_pmp float(12,4), -- valorisation du stock en PMP
fk_stock_mouvement integer -- id du mouvement de stock
)type=innodb;